ElasticSearch中查询DSL中的must和filter有什么区别?

vd8tlhqk  于 2023-01-16  发布在  ElasticSearch
关注(0)|答案(2)|浏览(391)

我是ElasticSearch的新手,在must和filter之间很困惑,我想在我的搜索项之间执行一个and操作,所以我这样做了

开机自检/xyz/_搜索

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

这给了我所需的结果匹配这两个项,并使用过滤器像这样

开机自检/xyz/_搜索

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

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

axr492tv

axr492tv1#

must会影响得分。在filter中,查询的得分将被忽略。
mustfilter中,子句(查询)必须出现在匹配的文档中。这是获得相同结果的原因。
您可以检查此link
得分
每个文档的相关性分数由一个名为_score的正浮点数表示,_score越高,文档的相关性越高。
查询子句为每个文档生成一个_score
要了解如何计算得分,请参阅link

xj3cbfub

xj3cbfub2#

must返回每个匹配文档的分数。此分数帮助您对匹配文档进行排名,并比较文档之间的相对相关性(使用每个文档的分数大小)。
有了这个,可以说文档1比文档2相关多少倍,或者文档1到7比文档8+的相关性高得多。
关于如何确定相对分数,您可以参考以下参考文献。
简单地说,它与文档中出现的术语数、文档长度以及数据库索引中出现的术语的平均数有关。
filter不返回分数。我们只能说,所有匹配的文档都是相关的。但是,它无助于评估一个文档是否比另一个文档更相关。您可以将filter视为只有2个分数的must:零或非零,以及丢弃所有零得分的文档。
filter在您只想将属于主题"pets"的所有文档列入白名单/黑名单时非常有用。
总之,有3点可以帮助您决定何时使用:

  1. must是按相关性比较/排列文档时的唯一选择
  2. filter排除所有不匹配的文档
  3. filter要快得多,因为Elasticsearch不需要计算相对得分
    参考文献:

相关问题