【问题标题】:Different results for same query in Elasticsearch ClusterElasticsearch 集群中相同查询的不同结果
【发布时间】:2017-01-28 11:23:53
【问题描述】:

我创建了一个包含 3 个节点、3 个分片和 2 个副本的 Elasticsearch 集群。 相同的查询在命中具有相同数据的相同索引时会获取不同的结果。 现在结果基本上是按 _score 字段 desc 排序的(我认为这是默认的排序方式),并且要求还希望结果按分数的 desc 顺序排序。 所以在这里我的问题是为什么相同的查询会产生不同的结果,然后如何将其纠正为每次使用相同的查询都有相同的结果。

附加查询

    {
"from": 0,
"size": 10,
"query": {
    "bool": {
        "must": {
            "bool": {
                "must": {
                    "terms": {
                        "context": [
                            "my name"
                        ]
                    }
                },
                "should": {
                    "multi_match": {
                        "query": "test",
                        "fields": [
                            "field1^2",
                            "field2^2",
                            "field3^3"
                        ]
                    }
                },
                "minimum_should_match": "1"
            }
        },
        "filter": {
            "bool": {
                "must": [
                    {
                        "terms": {
                            "audiencecomb": [
                                "1235"
                            ]
                        }
                    },
                    {
                        "terms": {
                            "consumablestatus": [
                                "1"
                            ]
                        }
                    }
                ],
                "minimum_should_match": "1"
            }
        }
    }
}

}

【问题讨论】:

  • 请显示映射/查询?
  • @Mysterion 附加了查询 .. 整个索引的映射太大了,如果没有映射,我们可以帮帮我吗?
  • 您能检查一下 numfounds 是否不同吗?还是只有顺序/分数不同?
  • @Mysterion 顺序和分数不同 找到的结果数相同

标签: elasticsearch elasticsearch-plugin


【解决方案1】:

其中一个可能的原因可能是分布式 IDF,默认情况下,Elastic 在每个分片上使用本地 IDF,以节省一些性能,这将导致整个集群中的不同 idf。因此,您应该尝试?search_type=dfs_query_then_fetch,它会明确要求 Elastic 计算全局 IDF。

但是,出于性能原因,Elasticsearch 不会计算 索引中所有文档的 IDF。相反,每个分片计算 该分片中包含的文档的本地 IDF。

因为我们的文档分布良好,所以两个分片的 IDF 将是相同的。现在想象一下,五个 foo 文件 在分片 1 上,第六个文档在分片 2 上。在这个 场景中,术语 foo 在一个分片上非常常见(因此很少 重要性),但在另一个分片上很少见(而且更重要)。 IDF 中的这些差异可能会产生不正确的结果。

实际上,这不是问题。本地和本地的区别 全局 IDF 会减少您添加到索引中的更多文档。和 真实世界的数据量,本地 IDF 很快就会被淘汰。问题 不是相关性被破坏,而是数据太少。

出于测试目的,我们可以通过两种方式解决此问题 问题。第一种是使用一个主分片创建索引,因为我们 在介绍匹配查询的部分中做了。如果你只有一个 shard,那么本地IDF就是全局IDF。

第二种解决方法是将 ?search_type=dfs_query_then_fetch 添加到 您的搜索请求。 dfs 代表分布式频率搜索, 它告诉 Elasticsearch 首先从每个 shard 以计算整个索引的全局 IDF。

欲了解更多信息,请查看here

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多