Elasticsearch Search Query
前言
Elasticsearch 查询分为 URI Search 和 Request Body Search,URI Search 是在URL中使用查询参数,Request Body Search 使用 Elasticsearch 提供的基于JSON格式的 Query Domain Specific Language(DSL)
语法 | 范围 |
---|
/_search | 集群上所有的索引 | /index1/_search | index1 | /index1,index2/_search | index1和index2 | /index*/_search | 以index开头的索引 |
URI 查询
- 使用 “q”,指定查询字符串,然后用KV键值对来指定要查询的字段和条件(q表示查询内容,后面的KV键值对表示查询字段和条件)。
GET /kibana_sample_data_ecommerce/_search?q=customer_first_name:Eddie - df 默认字段,q里面的查询字段不指定时查询这个字段,如果q里面没有指定字段,也没有默认字段,则查所有字段。sort 排序、from 和 size 用于分页、profile 可以查看查询是如何被执行的
GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
{
"profile":true
}
- 查询条件
- 指定字段 vs 泛查询: q=title:2012 / q=2012 - Term vs Phrase: Term 查询时 Beautiful Mind = Beautiful OR Mind,Phrase 查询时 Beautiful Mind = Beautiful AND Mind 还要求前后顺序保存一致 - 分组和引号: title:(Beautiful AND Mind) title=“Beautiful Mind” - 布尔操作: AND / OR / NOT(必须大写) 或者 && / || / ! title:(matrix NOT reloaded) - 分组: + 表示 must - 表示 must_not title:(+matrix -reloaded) - 范围查询:[] 闭区间 year:[* TO 2018] {} 开区间 year:{2018 TO 2019} - 算数符号:> year:>2010、<= year:(>2010 && <= 2018)、>= year:(+>2010 +<= 2018) - 通配符查询(查询效率低,占用内存大,不建议使用):? 代表1个字符 title:mi?d,* 代表0或者多个字符 title:be* - 正则表达式:title:[bt]oy - 模糊匹配和近似查询:title:beautifl~1 title:“lord rings”~2
Request Body
支持 POST 和 GET,查询参数用 JSON 格式表示
GET /kibana_sample_data_ecommerce/_search
{
"profile":true,
"query":{
"match_all":{}
}
}
探索结果 Response 响应参数:took 花费的时间;total 符合条件的总文档数;hits 结果集,默认前10个文档;_index 索引名;_id 文档 id;_socre 相关度算分;_source 文档原始信息 
- 分页参数:from 从10开始、size 返回多少结果,越靠后,翻页成本越高
POST /kibana_sample_data_ecommerce/_search
{
"from":10,
"size":20,
"query":{
"match_all":{}
}
}
- 排序参数:sort 最好在"数字型"和"日期型"字段上排序
GET kibana_sample_data_ecommerce/_search
{
"sort":[{"order_date":"desc"}],
"from":10,
"size":5,
"query":{
"match_all":{}
}
}
- _source filtering(查询结果字段过滤):_source 支持使用通配符 _source[“name*”,“desc*”],如果 _source 没有存储,那就只返回元数据
GET kibana_sample_data_ecommerce/_search
{
"_source":["order_date","category.keyword"],
"from":10,
"size":5,
"query":{
"match_all":{}
}
}
- 脚本字段:script_fields 如果业务比较复杂,还可以自己定义脚本去执行
GET kibana_sample_data_ecommerce/_search
{
"script_fields":{
"new_field":{
"script":{
"lang":"painless",
"source":"doc['order_date'].value+'hello'"
}
}
},
"from":10,
"size":5,
"query":{
"match_all":{}
}
}
- 查询表达式:match、match Phrase(短语搜索)
-- match
GET /comments/_doc/_search
{
"query":{
"match":{
"comment":"Last Christmas"
}
}
}
GET /comments/_doc/_search
{
"query":{
"match":{
"comment":"Last Christmas",
"operator":"AND"
}
}
}
-- match phrase
GET /comments/_doc/_search
{
"query":{
"match_phrase":{
"comment":{
"query":"Song Last Chrismas",
"slop":1 -- 每个词间隔的数量
}
}
}
}
搜索相关性 Relevance
- 当用户通过搜索引擎搜索相关结果时,关心的是搜到结果是否有相关性,相关性包括:是否可以找到所有相关的内容、有多少不相关的内容被返回了、文档的打分是否合理、结合业务需求,平衡结果排名。
- 通常搜索不仅仅关心内容,还要看内容的可信度。
- 搜索引擎除了搜索外,还会扮演其它角色,比如电商网站搜索需要提高用户购物体验、提升销售额、去库存。
衡量相关性
查询相关性(Information Retrieval)可以从几个方面来看:Precision(查准率)、Recall(查全率)、Ranking(相关度排序),可以使用 ES 的查询相关参数来改善搜索的 Precision 和 Recall。
- Precision(查准率) = True Positive(匹配正确的) / 全部返回的结果
- Recall = True Positive / 所有应该返回的结果
总结
这里只简单的介绍 Elasticsearch 有关的查询,包括 URI 和 Request Body 查询,URI 适合简单的查询,Request Body 适合复杂的查询,程序里一般用得多的是 Request Body。
|