elasticsearch中Query DSL中的must和filter有啥区别?

Posted

技术标签:

【中文标题】elasticsearch中Query DSL中的must和filter有啥区别?【英文标题】:What is the difference between must and filter in Query DSL in elasticsearch?elasticsearch中Query DSL中的must和filter有什么区别? 【发布时间】:2017-09-07 00:35:32 【问题描述】:

我是弹性搜索的新手,我对必须和过滤器感到困惑。我想在我的术语之间执行一个 and 操作,所以我这样做了

POST /xyz/_search


    "query": 
        "bool": 
            "must": [
                
                    "term": 
                        "city": "city1"
                    
                ,
                
                    "term": 
                        "saleType": "sale_type1"
                    
                
            ]
        
    

这给了我与这两个术语匹配的所需结果,以及使用这样的过滤器

POST /xyz/_search


    "query": 
        "bool": 
            "must": [
                
                    "term": 
                        "city": "city1"
                    
                
            ],
            "filter": 
                "term": 
                    "saleType": "sale_type1"
                
            
        
    

我得到了相同的结果,那么我应该什么时候使用 must 以及什么时候应该使用 filter?有什么区别?

【问题讨论】:

【参考方案1】:

must 有助于得分。在filter中,查询的分数被忽略了。

mustfilter 中,子句(查询)必须出现在匹配的文档中。这就是获得相同结果的原因。

您可以查看link

分数

每个文档的相关性分数由称为_score 的正浮点数表示。 _score 越高,文档的相关性越高。

查询子句为每个文档生成一个_score

要了解如何计算分数,请参阅link

【讨论】:

在使用 must vs 过滤器时并没有真正回答。什么时候得分对任何事情都很重要>? @intiha 使用filter 进行更快的搜索,因为无需计算分数,也无需进行排名。当你关心说相关性时,得分变得很重要。搜索词的出现次数、匹配文档的长度,或者是否要将 boost 添加到查询中以提升匹配文档的排名。 @intiha 如果您的所有查询都是布尔值,那么分数并不重要。过滤器中使用的子句可能会被缓存:“过滤器子句在过滤器上下文中执行,这意味着忽略评分并考虑缓存子句。”参考:elastic.co/guide/en/elasticsearch/reference/current/… 我认为当您有一个复合查询时,它也很重要,其中内部查询的分数用于计算总分。 must_not 也一样。

以上是关于elasticsearch中Query DSL中的must和filter有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch Query DSL概述与查询过滤上下文

Elasticsearch-Query DSL

ES(elasticsearch) query DSL 查询语法

elasticSearch-DSL

Elasticsearch Query DSL备忘(Constant score query和Bool Query)

elasticsearch query dsl