Elasticsearch 集群中相同查询的不同结果

2024-01-06

我创建了一个具有 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"
            }
        }
    }
}

}


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

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

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

实际上,这不是问题。本地和本地的区别 添加到索引的文档越多,全局 IDF 就会减少。和 由于现实世界的数据量很大,当地的以色列国防军很快就达到了平衡。问题 并不是相关性被破坏了,而是数据太少了。

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

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

欲了解更多信息,请查看here https://www.elastic.co/guide/en/elasticsearch/guide/current/relevance-is-broken.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch 集群中相同查询的不同结果 的相关文章

随机推荐