我有弹性搜索节点的默认配置:5个分片和1个副本。我查询在特定字段上匹配的节点,这对于这5个分片中的许多文档是相同的。但是,由于该特定分片中该文档的查询的tf-idf,搜索结果具有不同的分数。对我而言,理想情况是对于不同分片中相同字段的文档具有相同的分数,我可以通过按照对我来说重要的第二个标准进行排序来打破关系。怎么做到这一点?
答案 0 :(得分:4)
问题是Elasticsearch上跨越多个分片的普通查询使用了所谓的查询然后获取:
默认搜索类型:查询然后获取
默认情况下,Elasticsearch将使用名为“Query Then”的搜索类型 取”。它的工作方式如下:
将查询发送到每个分片
查找所有匹配的文档并使用本地术语/文档频率计算分数
构建结果的优先级队列(排序,从/到的分页等)
将有关结果的元数据返回给请求节点。请注意,实际文档尚未发送,只有分数
所有分片的分数在请求节点上合并和排序,根据查询条件选择文档
最后,实际文档将从它们所在的各个分片中检索。
结果将返回给客户
这个系统通常可以正常工作。在大多数情况下,您的索引“足够” 文件以平滑术语/文档频率统计。所以 虽然每个分片可能没有完整的频率知识 群集,结果“足够好”,因为频率是 到处都相似。
http://www.elasticsearch.org/blog/understanding-query-then-fetch-vs-dfs-query-then-fetch/
问题在于它在本地计算TF-IDF分数 -
你想要尝试的是使用DFS查询然后使用Fetch,它将预先查询所有分片并使用全局而非本地的术语文档/频率计算分数:
预先询问每个分片询问术语和文档频率
将查询发送到每个分片
查找所有匹配的文档,并使用根据预先查询计算的全球术语/文档频率计算分数。
构建结果的优先级队列(排序,从/到的分页等)
将有关结果的元数据返回给请求节点。请注意,实际文档尚未发送,只有分数
所有分片的分数在请求节点上合并和排序,根据查询条件选择文档
最后,实际文档将从它们所在的各个分片中检索。
结果将返回给客户
在你的情况下我会使用DFS查询然后使用Fetch,但我也会查看各种替代方案 - Elasticsearch在修改搜索请求类型方面有很大的灵活性: