我使用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
但我需要一个长期的解决方案。
答案 0 :(得分:2)
这是因为您没有指定sort
订单和size
。因此,每次查询时,弹性搜索服务器的结果集size
都会随机获得前10条记录作为默认10
。
您可以使用curl以下列方式添加排序,
curl -XPOST 'localhost:9200/_search' -d '{
"query" : {
...
},
"sort" : [
{"price" : {"order" : "asc", "mode" : "avg"}}
]
}'
检查here以获取更多信息,特别是from
和size
,其中排序最常用于分页。
<强>更新强>
虽然默认排序为score DESC
,但根据http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_sorting.html#_sorting
答案 1 :(得分:0)
This question帮助了我,
可能的原因之一可能是分布式IDF,默认情况下,Elastic在每个分片上使用本地IDF,以保存一些性能,这将导致整个群集中的不同idf。
ES doc here
答案 2 :(得分:0)
我们遇到了一个类似的问题,结果是因为Elasticsearch在搜索时在不同分片之间进行轮询。每个分片都返回略有不同的_score
,这是因为由于文档不同而导致的索引略有不同。在我们的例子中,这意味着相似的结果通常会按结果顺序稍稍降低或升高,并且当与分页结合使用时(在搜索查询中使用from
和size
),意味着出现的结果相同在两个单独的“页面”上还是根本不在页面之间。
我们在一致性评分上找到了Elasticsearch article,它很好地解释了这一点,并实施了preference
parameter,以确保通过查询相同的分片始终为特定搜索获得相同的分数:
http://localhost:9200/index_name/_search?q=term&preference=blablabla
我们还考虑过使用排序,但是Elasticsearch通过内部Lucene文档ID对具有相同分数的结果进行排序,以确保具有相同分数的结果始终以相同顺序返回。