【问题标题】:Different Elasticsearch results for the same query同一查询的不同 Elasticsearch 结果
【发布时间】:2014-06-18 12:09:15
【问题描述】:

我已经设置了 Elasticsearch,其中包含 1 个集群 á 4 个节点。 每个索引的分片数: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 轮胎重建索引:ModelName.rebuild_index

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

【问题讨论】:

  • 您的设置的更多细节会很好。这里缺少的一些信息是例如每个索引的副本数,每个节点的分片数也很高兴知道。
  • 每个索引的分片数:1 每个索引的副本数:3 我从哪里获得每个节点的分片数?在我的 elasticsearch.yml 中看不到它。
  • 抱歉,是每个索引的分片。老实说,看到那些我也不太明白你为什么对此有问题。
  • 你能发布集群健康的输出吗? elasticsearch.org/guide/en/elasticsearch/reference/current/…
  • 我在描述中添加了集群健康输出。

标签: elasticsearch


【解决方案1】:

我们遇到了类似的问题,原来是因为 Elasticsearch 在搜索时会在不同分片之间进行循环。由于 ES handles deleted documents 在索引中的方式不同,每个分片返回的 _score 略有不同。在我们的例子中,这意味着相似的结果通常在结果顺序中略低或略高,并且当与分页结合使用时(在搜索查询中使用fromsize),这意味着相同的结果出现在两个单独的“页面”或根本没有逐页。

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    更新:

    虽然默认排序是score DESC,但有时它在记录没有相关_score时不起作用,根据http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_sorting.html#_sorting

    【讨论】:

    • 即使没有指定排序和大小,我也不应该每次都有不同的总点击量。当我不指定排序时,我会得到首选的默认排序,即“分数 DESC”。
    • score DESC 是正确的,但问题是两条记录的分数相同。
    • 检查一下elasticsearch.org/guide/en/elasticsearch/guide/current/…,当记录没有有意义的分数时,它会开始发臭。
    【解决方案3】:

    This question 帮助了我,正如答案所说,

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

    ES 文档here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 2021-09-18
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多