针对同一查询的不同Elasticsearch结果

时间:2014-06-18 12:09:15

标签: elasticsearch

我使用1个集群á4个节点设置Elasticsearch。 每个索引的分片数:1;每个索引的副本数:3

当我多次调用类似下面的简单查询时,我会得到不同的结果(不同的总点击量和不同的前10个文档):

http://localhost:9200/index_name/_search?q=term

每个碎片上有不同的数据?我想让所有碎片都是最新的。我该怎么办?

这是/ _cluster / health:

的结果
{
  "cluster_name" : "secret",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 4,
  "number_of_data_nodes" : 4,
  "active_primary_shards" : 24,
  "active_shards" : 96,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0
}

作为临时解决方案,我通过Ruby gem tire重建索引:ModelName.rebuild_index

但我需要一个长期的解决方案。

3 个答案:

答案 0 :(得分:2)

这是因为您没有指定sort订单和size。因此,每次查询时,弹性搜索服务器的结果集size都会随机获得前10条记录作为默认10

您可以使用curl以下列方式添加排序,

curl -XPOST 'localhost:9200/_search' -d '{
 "query" : {
   ...
  },
   "sort" : [
     {"price" : {"order" : "asc", "mode" : "avg"}}
   ]
}'

检查here以获取更多信息,特别是fromsize,其中排序最常用于分页。

<强>更新

虽然默认排序为score DESC,但根据http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_sorting.html#_sorting

,当记录没有相关的_score时,它不起作用

答案 1 :(得分:0)

正如答案所说,

This question帮助了我,

  

可能的原因之一可能是分布式IDF,默认情况下,Elastic在每个分片上使用本地IDF,以保存一些性能,这将导致整个群集中的不同idf。

ES doc here

答案 2 :(得分:0)

我们遇到了一个类似的问题,结果是因为Elasticsearch在搜索时在不同分片之间进行轮询。每个分片都返回略有不同的_score,这是因为由于文档不同而导致的索引略有不同。在我们的例子中,这意味着相似的结果通常会按结果顺序稍稍降低或升高,并且当与分页结合使用时(在搜索查询中使用fromsize),意味着出现的结果相同在两个单独的“页面”上还是根本不在页面之间。

我们在一致性评分上找到了Elasticsearch article,它很好地解释了这一点,并实施了preference parameter,以确保通过查询相同的分片始终为特定搜索获得相同的分数:

http://localhost:9200/index_name/_search?q=term&preference=blablabla

我们还考虑过使用排序,但是Elasticsearch通过内部Lucene文档ID对具有相同分数的结果进行排序,以确保具有相同分数的结果始终以相同顺序返回。