我创建了一个具有 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(使用前将#替换为@)