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
{
"query":{
"match_all":{}
}
}
探索结果 Response 响应参数:took 花费的时间;total 符合条件的总文档数;hits 结果集,默认前10个文档;_index 索引名;_id 文档 id;_socre 相关度算分;_source 文档原始信息
搜索相关性 Relevance
- 当用户通过搜索引擎搜索相关结果时,关心的是搜到结果是否有相关性,相关性包括:是否可以找到所有相关的内容、有多少不相关的内容被返回了、文档的打分是否合理、结合业务需求,平衡结果排名。
- 通常搜索不仅仅关心内容,还要看内容的可信度。
- 搜索引擎除了搜索外,还会扮演其它角色,比如电商网站搜索需要提高用户购物体验、提升销售额、去库存。
衡量相关性
查询相关性(Information Retrieval)可以从几个方面来看:Precision(查准率)、Recall(查全率)、Ranking(相关度排序),可以使用 ES 的查询相关参数来改善搜索的 Precision 和 Recall。
- Precision(查准率) = True Positive(匹配正确的) / 全部返回的结果
- Recall = True Positive / 所有应该返回的结果