当前位置:首页 > ELK > 正文内容

elasticsearch中query和filter区别

phpmianshi2年前 (2019-07-17)ELK257

区别

在进行query的时候,除了完成匹配的过程,我们实际上在问“这个结果到底有多匹配我们的搜索关键词”。在所有的返回结果的后面都会有一个_score字段表示这个结果的匹配程度,也就是相关性。相关性越高的结果就越排在前面,相关性越低就越靠后。当两个文档的相关性相同的时候,会根据lucene内部的doc_id字段来排序,这个字段对于用户是不可见的也不能控制。

而在进行filter的时候,仅仅是在问“这个文档符不符合要求”,这仅仅是一个过滤的操作判断文档是否满足我们的筛选要求,不会计算任何的相关性。比如timestamp的范围是否在2019和2020之间,status状态是否是1等等。

在一个查询语句里面可以同时存在queryfilter,只不过只有query的查询字段会进行相关性_score的计算,而filter仅仅用来筛选。比如在下面的查询语句里面,只有title字段会进行相关性的计算,而下面的status只是为了筛选并不会计算相关性。

GET /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "Search"
          }
        }
      ],
      "filter": [
        {
          "term": {
            "state": 1
          }
        }
      ]
    }
  }
}

对于在实际应用中应该用query还是用filter需要根据实际的业务场景来看。如果你的产品的搜索只是需要筛选得到最后的搜索结果并不需要Elasticsearch的相关性排序(你可能自定义了其他的排序规则),那么使用filter就完全能够满足要求并且能够有更好的性能(filter不需要计算相关性而且会缓存结果);如果需要考虑文档和搜索词的相关性,那么使用query就是最好的选择。


相关性


上面讲到了在使用query查询的时候会计算相关性并且进行排序,很多人都会好奇相关性是怎么计算的?

相关性的计算是比较复杂的,详细的文档可以参考下面的介绍:

1.什么是相关性

2.ElasticSearch 使用教程之_score(评分)介绍

3.相关度评分背后的理论

我这里只是做一个简单的介绍。


Elasticsearch的相似度计算主要是利用了全文检索领域的计算标准——TF/IDF(Term Frequency/Inverted Document Frequency)也就是检索词频率反向文档频率

  1. TF(检索词频率):检索词在这个字段里面出现的频率越高,相关性越高。比如搜索词出现5次肯定比出现1次的文档相关性更高。

  2. IDF(反向文档频率):包含检索词的文档的频率越高,这个检索词的相关性比重越低。如果一个检索词在所有的文档里面都出现了,比如中文的,那么这个检索词肯定就不重要,相对应的根据这个检索词匹配的文档的相关性权重应该下降。

  3. 字段长度:注意这个字段是文档的里面被搜索的字段,不是检索词。如果这个字段的长度越长,相关性就越低。这个主要是因为这个检索词在字段内的重要性降低了,文档就相对来说不那么匹配了。

在复合查询里面,比如bool查询,每个子查询计算出来的评分会根据特定的公式合并到综合评分里面,最后根据这个综合评分来排序。当我们想要修改不同的查询语句的在综合评分里面的比重的时候,可以在查询字段里面添加boost参数,这个值是相对于1来说的。如果大于1则这个查询参数的权重会提高;如果小于1,权重就下降。

这个评分系统一般是系统默认的,我们可以根据需要定制化我们自己的相关性计算方法,比如通过脚本自定义评分。


场景

原则上来说,使用查询语句做全文本搜索或其他需要进行相关性评分的时候,剩下的全部用过滤语句

GET /my_index/_search
{
  "query": {
    "filtered": {
      "query": [
        {
          "match": {
            "title": "Search"
          }
        }
      ],
      "filter": [
        {
          "term": {
            "state": 1
          }
        }
      ]
    }
  }
}

filtered 查询同时接受接受 query 与 filter 。

filtered和filter的区别

es 5.0版本更新后,filtered的查询将替换为bool查询。

filtered是比较老的的版本的语法。现在目前已经被bool替代。推荐使用bool。

版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

logstash中同步mysql到elastic常见问题总结

1. mysql查询字段中有 type字段问题原因select语句中查到了type, 但es中会默认有一个type, 这使得两个type冲突.会导致同步失败,且没有报错GET my_inde...

elasticsearch模糊查询match match_phrase wildcard regexp prefix的区别

1.match查询会先对搜索词进行分词,比如“白雪公主和苹果”,会分成“白雪”“公主”“苹果”。含有相关内容的字段,都会被检索出来。2.match_phrase查询match_phrase与slop一...

使用logstash-input-jdbc同步mysql到es

数据同步方式全量同步与增量同步全量同步是指全部将数据同步到es,通常是刚建立es,第一次同步时使用。增量同步是指将后续的更新、插入记录同步到es。(删除记录没有办法同步,只能两边执行自己的删除命令)常...

elasticsearch中的常见问题和优化策略

常见优化策略:filter过滤器查询优化结果分数是Elasticsearch的关键。 通常,当您使用搜索引擎时,您需要最准确的结果。 例如,如果您正在搜索“苹果”,您不希望结果包括“苹果手机”。Ela...

elasticsearch中分词器edge_ngram和ngram的区别

简介edge_ngram和ngram是ElasticSearch自带的两个分词器,一般设置索引映射的时候都会用到,设置完步长之后,就可以直接给解析器analyzer的tokenizer赋值使用。场景用...

elasticsearch7.5.1suggesters教程详解

参考:https://www.jianshu.com/p/7f41c6725706该博客我会结合官方文档加上自己的理解和实践进行讲解suggesters官方文档1. suggesters 一共有四种类...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。