ElasticSearch使用分页搜索重复结果

xurqigkl  于 2023-06-21  发布在  ElasticSearch
关注(0)|答案(4)|浏览(369)

我正在使用ElasticSearch与pyes。我在最后一页搜索结果中发现了重复的结果。以下是我的查询:

"query": {
    "query": {
        "filtered": {
            "filter": {
                "and": [
                    {
                        "match_all": {

                        }
                    }
                ]
            },
            "query": {
                "bool": {
                    "minimum_number_should_match": 1,
                    "should": [
                        {
                            "text": {
                                "name.keyword_name": {
                                    "operator": "and",
                                    "query": "kentucky",
                                    "type": "boolean",
                                    "fuzziness": 0.8
                                }
                            }
                        },
                        {
                            "text": {
                                "address": {
                                    "operator": "and",
                                    "query": "kentucky",
                                    "type": "boolean"
                                }
                            }
                        },
                        {
                            "text": {
                                "neighborhoods.name": {
                                    "operator": "and",
                                    "query": "kentucky",
                                    "type": "boolean",
                                    "fuzziness": 0.8
                                }
                            }
                        },
                        {
                            "text": {
                                "categories.name": {
                                    "operator": "and",
                                    "query": "kentucky",
                                    "type": "boolean",
                                    "fuzziness": 0.8
                                }
                            }
                        }
                    ]
                }
            }
        }
    },
    "facets": {
        "neighborhoods.id": {
            "terms": {
                "field": "neighborhoods.id",
                "size": 10
            }
        },
        "categories.id": {
            "terms": {
                "field": "categories.id",
                "size": 10
            }
        }
    },
    "size": 15,
    "from": 15,
    "fields": [
        "id",
        "categories.id",
        "name",
        "address",
        "city",
        "state",
        "zipcode",
        "location",
        "_id",
        "pos_review_count",
        "neg_review_count",
        "wishlist_count",
        "recommender_count",
        "checkin_count"
    ]
},

在这个查询中,我有

"size": 15,
    "from": 15,

并且对于该特定查询,返回的对象的total_count也是24。在15处有一个“from”,total_count为24,我希望在这里得到9个结果。但相反,因为我将“size”设置为15,所以我得到了15个结果条目。由于只剩下9个唯一结果,因此6个文档将显示两次。任何想法如何使这给予我9个结果,而不是15个重复?
谢谢你的帮助!

iqih9akk

iqih9akk1#

如果你有多个分片上的数据,它可能会返回多次,我不知道为什么。对不起,这不是很具体,因为我不知道为什么会这样。
尝试使用首选项:http://www.elastic.co/guide/en/elasticsearch/reference/1.4/search-request-preference.html
我们使用了一个首选项自定义字符串,它解决了重复数据的问题。
您的复制设置是什么?有没有可能数据在多个分片上?你用的是什么版本?
不幸的是,在pyes中,你不能在多搜索调用中指定一个首选项。尝试将首选项指定为搜索调用中的查询参数。
search(index=...,.....,preference=)

kq4fsx7k

kq4fsx7k2#

问题是您正在按字段(或默认情况下按_score)进行排序,该字段在文档中具有重复值。我的理解是,不同的分片可能会以不同的顺序对重复的字段值进行排序。
因此,当您为每个请求获得不同的分片时,您可能会获得不同的排序顺序,因此,您可能会将相同的文档排序到两个不同的页面上(取决于您询问的分片)。
正如TheJeff上面提到的,修复方法是指定_search?preference = my-paging-key,以确保每个页面请求使用一致的分片

jk9hmnmh

jk9hmnmh3#

只是想在这里分享我的经验,因为多个分片,我在使用from/size分页参数进行搜索查询时,也会在不同的页面中得到重复的结果。
我尝试了这里记录的关于ElasticSearch中的首选项的一些事情,在主分片上执行查询已经为我解决了这个问题。
“偏好”:“_primary_first”
如果你正在使用Python库,你可以考虑这个参考:
https://elasticsearch-py.readthedocs.io/en/master/api.html#elasticsearch.Elasticsearch.search

juud5qan

juud5qan4#

自2023年起,_primary和_primary_first的使用将被弃用。请调整答案

相关问题