我正在使用Nest生成针对Elasticsearch执行的DSL查询。最终用户提供的搜索短语由空格分隔,然后传递以构造查询。
DSL查询输出取决于传递给BuildQuery方法的单词数。如果是单个单词,则查询如下所示:
但是如果传递了多个单词,则输出是更复杂的查询,并且每个单词都插入到单独的 multi_match 中。
我正在使用该查询,发现我可以通过将整个文本插入到这样的单个 multi_match 中来简化它。
无论如何构造查询,它都会返回相同的结果和相同的分数。
我的问题是简化查询与单个 multi_match 之间的区别是什么,它包含整个文本而不被拆分,以及更复杂的查询,其中每个单词都在一个单独的 multi_match ?
哪一个查询更好,为什么?
我是否可以简化代码并确保一切都能顺利运行,即使查询更复杂?
答案 0 :(得分:1)
在我看来,唯一的区别在于multi_match
查询中包含的每个字段所使用的分析器。
如果您在空格上拆分文本并在每个术语上构建multi_match
most_fields查询的分离,则传递的术语将由每个字段的分析器进行分析以生成令牌,基于每个标记的TF / IDF(或Elasticsearch 5.0+中默认为BM25)计算的相关性分数,以及每个should
子句的分数总和除以should
的数量计算得出的总分数条款。
如果您将文本传递给multi_match
查询,则传递的文本将由每个字段的分析器进行分析;我怀疑你有一个分析器,用于对空格字符进行标记(可能使用默认的standard analyzer,基于Unicode Text Segmentation进行标记)以生成多个标记,为每个标记计算相关性分数。以及每个令牌的得分总和除以匹配子句的数量计算的总得分。