Elasticsearch中两个类似的DSL查询之间的差异

时间:2017-01-23 20:16:02

标签: elasticsearch dsl nest

我正在使用Nest生成针对Elasticsearch执行的DSL查询。最终用户提供的搜索短语由空格分隔,然后传递以构造查询。

enter image description here

DSL查询输出取决于传递给BuildQuery方法的单词数。如果是单个单词,则查询如下所示:

enter image description here

但是如果传递了多个单词,则输出是更复杂的查询,并且每个单词都插入到单独的 multi_match 中。

enter image description here

我正在使用该查询,发现我可以通过将整个文本插入到这样的单个 multi_match 中来简化它。

enter image description here

无论如何构造查询,它都会返回相同的结果和相同的分数。

我的问题是简化查询与单个 multi_match 之间的区别是什么,它包含整个文本而不被拆分,以及更复杂的查询,其中每个单词都在一个单独的 multi_match

哪一个查询更好,为什么?

我是否可以简化代码并确保一切都能顺利运行,即使查询更复杂?

1 个答案:

答案 0 :(得分:1)

在我看来,唯一的区别在于multi_match查询中包含的每个字段所使用的分析器。

bool中的许多multi_match查询应该是

子句

如果您在空格上拆分文本并在每个术语上构建multi_match most_fields查询的分离,则传递的术语将由每个字段的分析器进行分析以生成令牌,基于每个标记的TF / IDF(或Elasticsearch 5.0+中默认为BM25)计算的相关性分数,以及每个should子句的分数总和除以should的数量计算得出的总分数条款。

单个multi_match查询

如果您将文本传递给multi_match查询,则传递的文本将由每个字段的分析器进行分析;我怀疑你有一个分析器,用于对空格字符进行标记(可能使用默认的standard analyzer,基于Unicode Text Segmentation进行标记)以生成多个标记,为每个标记计算相关性分数。以及每个令牌的得分总和除以匹配子句的数量计算的总得分。