由于分片,搜索结果不佳?

时间:2014-07-16 06:28:15

标签: elasticsearch sharding tf-idf

我有弹性搜索节点的默认配置:5个分片和1个副本。我查询在特定字段上匹配的节点,这对于这5个分片中的许多文档是相同的。但是,由于该特定分片中该文档的查询的tf-idf,搜索结果具有不同的分数。对我而言,理想情况是对于不同分片中相同字段的文档具有相同的分数,我可以通过按照对我来说重要的第二个标准进行排序来打破关系。怎么做到这一点?

1 个答案:

答案 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在修改搜索请求类型方面有很大的灵活性:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-search-type.html