我正在使用带有pyes的elasticsearch。我在最后一页的结果中得到重复。这是我的疑问:
"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”和24的total_count时,我想在这里获得9个结果。但相反,因为我将“size”设置为15,我得到15个结果条目。由于仅剩下9个唯一结果,因此将显示6个文档两次。关于如何制作这个的任何想法给我9个结果而不是15个重复?
感谢您的帮助!
答案 0 :(得分:8)
如果你有多个分片的数据,它可能会多次返回,我不知道为什么。对不起,这不是很具体,因为我不知道为什么会这样。
尝试使用偏好设置:http://www.elastic.co/guide/en/elasticsearch/reference/1.4/search-request-preference.html
我们使用首选项自定义字符串,它修复了我们的重复数据问题。
您的复制设置是什么?数据是否可能在多个分片上?你用的是哪个版本?
不幸的是,对于pyes,您无法在多次搜索调用中指定首选项。尝试在搜索调用中将首选项指定为查询参数。
搜索(index = ...,.....,preference =)
答案 1 :(得分:3)
问题在于您按字段排序(或默认情况下由_score排序),该字段在文档中具有重复值。我的理解是不同的分片可以按不同的顺序对重复的字段值进行排序。
因此,当您为每个请求获得不同的分片时,您可能会得到不同的排序顺序,因此,您可能会将相同的doc分类到两个不同的页面上(取决于您询问的分片)。
正如上面提到的TheJeff,修复是指定_search?preference = my-paging-key以确保用于每个页面请求的一致分片
答案 2 :(得分:0)
只是想在这里与我分享与之相关的经验,由于多个分片,在将from / size分页参数与搜索查询一起使用时,我也在不同的页面中重复得到结果。
我尝试了此处记录的有关preferences in ElasticSearch的一些事情,对主分片执行查询为我解决了这个问题。
“首选项”:“ _ primary_first”
如果您使用的是python库,则可以考虑以下参考资料:
https://elasticsearch-py.readthedocs.io/en/master/api.html#elasticsearch.Elasticsearch.search