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

elasticsearch中query和filter区别

phpmianshi1年前 (2019-07-17)ES112

区别

在进行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 。


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

相关文章

logstash过滤器--mutate

概念filters/mutate 插件是 Logstash 另一个重要插件。它提供了丰富的基础类型数据处理能力。包括类型转换,字符串处理和字段处理等。Plugin version: v3.5.0执行顺...

elasticsearch中SearchApi的详解

搜索流程当一个搜索请求被发送到某个节点时,这个节点就变成了协调节点。 这个节点的任务是广播查询请求到所有相关分片并将它们的响应整合成全局排序后的结果集合,这个结果集合会返回给客户端。多索引搜...

es中单机部署状态为Yellow解决办法

es中单机部署状态为Yellow解决办法

背景单机版的 ES 状态为 Yellow,在 Kibana 的管理界面看到的 index 的状态也是 Yellow这个问题在于单机版的 ES,是没有备份的,没有副本,设置 index 副本的数量为 0...

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

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

elasticsearch中倒排索引详解

elasticsearch中倒排索引详解

概念Elasticsearch使用一种叫做倒排索引(inverted index)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列 表,以及对于每个单词在文档中的位置组成。示例我们有两个...

elasticsearch中最重要的查询过滤语句

term 过滤term 主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型){ "term": { "age&q...

发表评论

访客

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