Elasticsearch Cluster中相同查询的结果不同

时间:2017-01-28 11:23:53

标签: elasticsearch elasticsearch-plugin

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

}

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