Elasticsearch 在多个索引上打分:dfs_query_then_fetch 返回与 query_then_fetch 相同的分数

Edm*_*ond 7 django elasticsearch elasticsearch-dsl elasticsearch-dsl-py

我在 Elasticsearch 中有多个索引(以及使用 django-elasticsearch-dsl 创建的 Django 中的相应文档)。所有索引都具有以下设置:

    settings = {'number_of_shards': 1,
                'number_of_replicas': 0}
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试对所有 10 个索引执行搜索。为了检索来自不同索引的结果之间的一致评分,我使用dfs_query_then_fetch

search = Search(index=['mov*'])
search = search.params(search_type='dfs_query_then_fetch')
objects = search.query("multi_match", query='Tom & Jerry', fields=['title', 'actors'])
Run Code Online (Sandbox Code Playgroud)

由于得分不一致,我得到了糟糕的结果。一个索引中名为“杰瑞和他的朋友汤姆故事”的书的排名可能高于另一个索引中的卡通片“汤姆和杰瑞”。原因是dfs_query_then_fetch不起作用。当我删除它或用简单的query_then_fetch替换它时,我得到了完全相同的结果和相同的评分。

我也在 URI 请求上对其进行了测试,对于两种搜索类型,我总是得到相同的分数。

原因是什么?

更新:结果实际上并不相同,但它们确实略有不同,例如,使用 dfs 的分数为 50.1,不使用 dfs 的分数为 50.0,而一个索引中的相同模型的分数为 80.0。

Tus*_*ahi 0

如果分片数量为1,则dfs_query_then_fetch和query_then_fetch将返回相同的结果。DFS 查询将对所有分片进行查询,然后根据计算出的分数向您显示结果,但在本例中只有一个分片。

关于评分,你可能也想看看你的演员阵容。另外,如果您使用了自定义分析器和分词器,请告诉我们什么是分析器和分词器?