【问题标题】: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?有什么区别?

【问题讨论】:

    标签: elasticsearch filter querydsl


    【解决方案1】:

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

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

    您可以查看link

    分数

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

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

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

    【讨论】:

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