Elasticsearch 中两个相似 DSL 查询的区别

Difference between two similar DSL queries in Elasticsearch

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

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

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

我在玩查询,发现我可以通过将整个文本插入单个 multi_match 来简化它。

无论查询是如何构造的,returns 结果相同,分数相同。

我的问题是,包含整个文本但未拆分的单个 multi_match 的简化查询与包含每个单词的更复杂查询之间有什么区别在一个单独的 multi_match?

哪个查询更好,为什么?

我可以简化我的代码并确保即使是更复杂的查询也能顺利运行吗?

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

bool should 子句中的许多 multi_match 查询

在空格上拆分文本并在每个 term 上构造 multi_match most_fields 查询的析取,传递的术语将由每个字段的分析器生成一个标记,根据每个标记的 TF/IDF(或 E​​lasticsearch 5.0+ 中默认的 BM25)计算的相关性分数,以及根据每个 should 的分数总和计算的总分子句除以 should 个子句数。

单个multi_match查询

将文本传递给multi_match查询的地方,传递的文本将像以前一样由每个字段的分析器进行分析;我怀疑您有一个分析器可以对空白字符进行分词(可能使用默认 standard analyzer, which tokenizes based on Unicode Text Segmentation)以生成多个分词,并为每个分词计算相关性分数。以及通过每个标记的分数总和除以匹配子句的数量计算的总分。