本文共 1938 字,大约阅读时间需要 6 分钟。
我们从最简单的概念讲起
elasticsearch中查询语句叫DSL(Domain Specific Language) 查询语句由两种类型子句组成查询子句的不同取决于他们是在查询子句上下文中使用还是在过滤子句上下文中使用。
查询上下文与过滤上下文的区别是 查询上下文指的是文档中是否存在匹配查询子句的内容,并计算得分。 过滤上下文指的是匹配到的内容是否满足过滤条件,例如时间是否大于2020-07-19 或者状态是否等于1之类的 以下查询示例满足如下条件title
中是否包含search
content
是否包含elasticsearch
status
是否包含published
publish_date
是否在 2015-06-01之前GET /_search{ "query": { //query 上下文子句 "bool": { //复合查询 "must": [ //包含 { "match": { "title": "Search" }}, //复合查询匹配条件1 { "match": { "content": "Elasticsearch" }} //复合查询匹配条件2 ], "filter": [ //过滤上下文子句 { "term": { "status": "published" }}, //过滤条件,精确匹配 { "range": { "publish_date": { "gte": "2015-01-01" }}} //过滤条件范围匹配 ] } }}
从示例可以看出,过滤上下问子句包含在查询上下文子句中,也就是说只有,有查询才有过滤的必要。复合查询,只影响得分。
自己的示例演示如下GET _search?filter_path=*.*._score{ "query":{ "bool":{ "must":[ { "match":{ "productname":"商品"}}, { "match":{ "productpic":"exportUpload"}} ] } }}
结果如下,我将内容使用filter_path
进行过滤,可以看出来匹配程度最高的是第一个。
{ "hits" : { "hits" : [ { "_score" : 5.4368854 }, { "_score" : 5.2295594 } ] }}
match_all
GET _search?filter_path=*.*._score{ "query": { "match_all": { "boost":1.2} }}
match_all匹配所有文档得分为1,通过boost
可以改变得分,如上示例输出如下
{ "hits" : { "hits" : [ { "_score" : 1.2 }, { "_score" : 1.2 } ] }}
全文查询
全文查询可以分文以下类型match query
用于执行全文查询的标准查询,包括模糊匹配和短语或邻近查询 match_phrase query
与match查询类似,但用于匹配确切的短语或单词接近度匹配。 match_phrase_prefix query
与match_phrase
查询类似但是最右一个单词模糊如 I am a chin* multi_match query
match
查询的多字段版本。 common_terms query
一种更专业化的查询,它对不常见的词有更多的偏好。 query_string query
支持compact Lucene查询字符串语法,允许您在单个查询字符串中指定AND | OR | NOT条件和多字段搜索。这也是我们最常用的查询子句 simple_query_string
查询字符串语法的一个更简单、更健壮的版本,适合直接向用户公开。 转载地址:http://xpkfb.baihongyu.com/