Kar*_*rma 3 sharding tf-idf elasticsearch
我具有弹性搜索节点的默认配置:5个分片和1个副本。我查询在特定字段上匹配的节点,这对于这5个分片中的许多文档都是相同的。但是,由于该特定分片中该文档的查询的tf-idf,搜索结果的得分不同。对我而言,理想的情况是在不同分片的相同字段中为文档获得相同的分数,并且我可以通过订购对我来说很重要的第二条标准来打破关系。如何做到这一点?
问题是,在Elasticsearch上跨越多个分片的普通查询使用的是所谓的Query然后Fetch:
默认搜索类型:“查询后取”
默认情况下,Elasticsearch将使用一种称为“先查询后取”的搜索类型。其工作方式如下:
将查询发送到每个分片
查找所有匹配的文档并使用本地术语/文档频率计算分数
建立结果优先级队列(排序,从/到的分页等)
将有关结果的元数据返回到请求节点。注意,实际文件还没有发送,只是分数
来自所有分片的分数在请求节点上合并并排序,根据查询条件选择文档
最后,从文档所在的单独分片中检索实际文档。
结果返回给客户
该系统通常运行良好。在大多数情况下,您的索引具有“足够”的文档,可以使术语/文档频率统计数据变得平滑。因此,尽管每个碎片可能不完全了解整个群集的频率,但结果“足够好”,因为各地的频率都非常相似。
http://www.elasticsearch.org/blog/understanding-query-then-fetch-vs-dfs-query-then-fetch/
您遇到的问题是,它会在本地计算TF-IDF得分-
您将尝试使用DFS Query然后Fetch,它会预查询所有分片并使用全局而非局部术语文档/频率来计算分数:
预查询每个分片,询问术语和文档频率
将查询发送到每个分片
查找所有匹配的文档,并使用从预查询中计算出的全局术语/文档频率来计算分数。
建立结果优先级队列(排序,从/到的分页等)
将有关结果的元数据返回到请求节点。注意,实际文件还没有发送,只是分数
来自所有分片的分数在请求节点上合并并排序,根据查询条件选择文档
最后,从文档所在的单独分片中检索实际文档。
结果返回给客户
在您的情况下,我将使用DFS Query然后使用Fetch,但我还将检查各种替代方法-Elasticsearch在修改搜索请求类型方面具有很大的灵活性:
| 归档时间: |
|
| 查看次数: |
1495 次 |
| 最近记录: |