我正在使用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个重复?
谢谢你的帮助!
4条答案
按热度按时间iqih9akk1#
如果你有多个分片上的数据,它可能会返回多次,我不知道为什么。对不起,这不是很具体,因为我不知道为什么会这样。
尝试使用首选项:http://www.elastic.co/guide/en/elasticsearch/reference/1.4/search-request-preference.html
我们使用了一个首选项自定义字符串,它解决了重复数据的问题。
您的复制设置是什么?有没有可能数据在多个分片上?你用的是什么版本?
不幸的是,在pyes中,你不能在多搜索调用中指定一个首选项。尝试将首选项指定为搜索调用中的查询参数。
search(index=...,.....,preference=)
kq4fsx7k2#
问题是您正在按字段(或默认情况下按_score)进行排序,该字段在文档中具有重复值。我的理解是,不同的分片可能会以不同的顺序对重复的字段值进行排序。
因此,当您为每个请求获得不同的分片时,您可能会获得不同的排序顺序,因此,您可能会将相同的文档排序到两个不同的页面上(取决于您询问的分片)。
正如TheJeff上面提到的,修复方法是指定_search?preference = my-paging-key,以确保每个页面请求使用一致的分片
jk9hmnmh3#
只是想在这里分享我的经验,因为多个分片,我在使用from/size分页参数进行搜索查询时,也会在不同的页面中得到重复的结果。
我尝试了这里记录的关于ElasticSearch中的首选项的一些事情,在主分片上执行查询已经为我解决了这个问题。
“偏好”:“_primary_first”
如果你正在使用Python库,你可以考虑这个参考:
https://elasticsearch-py.readthedocs.io/en/master/api.html#elasticsearch.Elasticsearch.search
juud5qan4#
自2023年起,_primary和_primary_first的使用将被弃用。请调整答案