我创建了一个包含3个节点的Elasticsearch集群,其中包含3个分片和2个副本。 当使用相同数据命中相同的索引时,相同的查询会获取不同的结果。 现在结果基本上按_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"
}
}
}
}
}
答案 0 :(得分: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首先从每个IDF中检索本地IDF shard,以便计算整个索引的全局IDF。
有关详细信息,请查看here