ElasticSearch常用搜索语法_河蟹堡的博客-CSDN博客_elasticsearch搜索语法
[juejin.cn/post/699259…](term 不分词)
[Elasticsearch(es) 查询语句语法详解 | 程序员笔记 (knowledgedict.com)](www.knowledgedict.com/tutorial/el… query)
ES 19 - 查询Elasticsearch中的数据 (基于_search API进行检索) - 瘦风 - 博客园 (cnblogs.com)
查询的种类
- 叶子语句:单个条件组成的语句,如match,multi_match,term,terms, range
- 复合语句:有多个条件,需要合并在一起才能组成一个完整的语句,需要使用bool进行组合,里面的条件可以用must必须匹配、must not必须不匹配、should表示可以匹配修饰,也可以包含过滤器filter。每个选项都可以出现 0 次到多次,它们的含义如下:
must 文档必须匹配 must 选项下的查询条件,相当于逻辑运算的 AND,且参与文档相关度的评分。
should 文档可以匹配 should 选项下的查询条件也可以不匹配,相当于逻辑运算的 OR,且参与文档相关度的评分。(这里有点小坑:blog.csdn.net/java_chegnx…)
must_not 与 must 相反,匹配该选项下的查询条件的文档不会被返回;需要注意的是,must_not 语句不会影响评分,它的作用只是将不相关的文档排除。
filter 和 must 一样,匹配 filter 选项下的查询条件的文档才会被返回,但是 filter 不评分,只起到过滤功能,与 must_not 相反。
类似mysql的"(status = 1 && language != 'french' && (author = 'John' || author = 'Tom'))"这种。
{
"bool":{
"must":{
"match":{
"status":1
}
},(单个的可以不用数组,直接用花括号)
"must_not":{
"match":{
"language":"french"
}
},
"should":[
{
"match":{
"author":"John Tom"
}
},
{
"bool":{
"must":{
"match":{
"name":"friend"
}
},
"must_not":{
"match":{
"content":"star"
}
}
}
}
],
"filter":{
"range":{
"length":{
"gt":30
}
}
}
}
}
Query与Filter
query和filter使用场景
- 先使用filter把不需要的过滤掉,例如现在有一个电子商务的网站,我要查询一个category的id为1下面的所有产品,那么我首先会使用filter把category id等于1的产品过滤出来,也就是查出来
- 对于上面的filter出来的结果我再这个category下面查询name为“五子弥勒”的产品,这个时候我就会使用query,为什么呢,因为可能有的产品的name完全match 这个“五子弥勒”的关键字,但是有的产品可能只会match其中的一个词汇,所以,如果我需要把有相似性的查出来,这个是query是具备这个功能的,query的本质不是筛选,而是查询。query他会给结果打分,然后按照分数进行一个排序,如果命中的比较多,分数自然就很高,那么就会排在前面。这里提到了一个打分的概念,个人认为这个打分主要还是看分词器对他的命中,然后给一个评估,关于分词器,我会在后面的博客中提到。
所以,这个时候,大家应该知道filter和query的主要区别了,另外关于性能的我在提一下,上面提到 filter 是不进行打分的,他只是一个筛选,对不感兴趣的直接筛选掉;而query需要打分,可以想象成是一个命中率的概念,是一个率,不过如果你不想看到打分,你可以在query的时候通过参数去控制,结果也就没有排序了,但是实际上,对性能的提升不大,因为主要的性能不是放在排序上面,而是在匹配上面
Query查询上下文和Filter过滤器上下文
查询在Query查询上下文和Filter过滤器上下文中,执行的操作是不一样的:
查询上下文:
在查询上下文中,查询会回答这个问题—— “这个文档匹不匹配这个查询,它的相关度高么?”
如何验证匹配很好理解,如何计算相关度呢?之前说过,ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。
查询上下文 是在 使用query进行查询时的执行环境,比如使用search的时候。
过滤器上下文:
在过滤器上下文中,查询会回答这个问题—— “这个文档匹不匹配?”
答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。
过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter
另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。
总结
1 查询上下文中,查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;在过滤器上下文中,查询操作仅判断是否满足查询条件
2 过滤器上下文中,查询的结果可以被缓存。
分词涉及关键字说明
分词查询中,经常涉及几个关键字,如text、keyword、match、term。很多人都会混淆,不明白彼此间有何区别。下面就重点解释下。
text和keyword
- text和keyword是数据类型,针对的是数据写入,写入到磁盘上是否进行分词。
- text会分词,也就是说,在数据落盘时,会被分割成多个独立的单词,然后存入倒排索引中。分词查询时候,也是以单词维度进行匹配。
- keyword不会分词,存的的是整个短语。
match和term
- match和term,是两种搜索方式,针对的是数据查询,要查询的短语是否进行分词。
- match搜索时候,会对被搜索的内容进行分词,然后拿分词后的内容,去倒排索引中查询。
- term是不对被搜索内容进行分词,就是完全匹配。