elasticsearch 在elasticsearch中使用向后分页给出错误结果后进行搜索
使用elasticsearch,我试图在search_after的帮助下实现分页。我在进行反向分页时遇到问题,即结果错误(与上一页的实际结果不同) 对于正向分页,我使用弹性查询,如下所示
elasticsearch 在elasticsearch中使用向后分页给出错误结果后进行搜索,
elasticsearch,pagination,
elasticsearch,Pagination,使用elasticsearch,我试图在search_after的帮助下实现分页。我在进行反向分页时遇到问题,即结果错误(与上一页的实际结果不同) 对于正向分页,我使用弹性查询,如下所示 { "sort": [{ "_score": "desc" }, { "last_login": { "order": "desc", "mode": "avg" } }, { "id": { "order": "asc"
{
"sort": [{
"_score": "desc"
}, {
"last_login": {
"order": "desc",
"mode": "avg"
}
}, {
"id": {
"order": "asc"
}
}],
"search_after": [148853, 1563037185, "3591152"],
"from": 0,
"_source": [],
"track_total_hits": true,
"track_scores": true,
"aggs": {},
"query": {
"bool": {
"filter": {
"bool": {
"should": [],
"must_not": [],
"must": []
}
},
"should": [],
"must_not": [],
"must": []
}
},
"size": 25
{
"sort": [{
"_score": "asc"
}, {
"last_login": {
"order": "asc",
"mode": "avg"
}
}, {
"id": {
"order": "desc"
}
}],
"search_after": [146923, 1561460886, "3275906"],
"from": 0,
"_source": [],
"track_total_hits": true,
"track_scores": true,
"aggs": {},
"query": {
"bool": {
"filter": {
"bool": {
"should": [],
"must_not": [],
"must": []
}
},
"should": [],
"must_not": [],
"must": []
}
},
"size": 25
}
注意:此处search_after值是当前分页中最后一个文档的排序数组
用于进行反向分页
我只是颠倒了线程中提到的排序选项的排序顺序。
我现在的弹性查询如下
{
"sort": [{
"_score": "desc"
}, {
"last_login": {
"order": "desc",
"mode": "avg"
}
}, {
"id": {
"order": "asc"
}
}],
"search_after": [148853, 1563037185, "3591152"],
"from": 0,
"_source": [],
"track_total_hits": true,
"track_scores": true,
"aggs": {},
"query": {
"bool": {
"filter": {
"bool": {
"should": [],
"must_not": [],
"must": []
}
},
"should": [],
"must_not": [],
"must": []
}
},
"size": 25
{
"sort": [{
"_score": "asc"
}, {
"last_login": {
"order": "asc",
"mode": "avg"
}
}, {
"id": {
"order": "desc"
}
}],
"search_after": [146923, 1561460886, "3275906"],
"from": 0,
"_source": [],
"track_total_hits": true,
"track_scores": true,
"aggs": {},
"query": {
"bool": {
"filter": {
"bool": {
"should": [],
"must_not": [],
"must": []
}
},
"should": [],
"must_not": [],
"must": []
}
},
"size": 25
}
此处search_after是当前分页中最后一个文档的排序数组中的值。
这一次,elastic没有显示上一页的结果,而是给出了一些其他结果
注:Elasticsearch 7.2版
NB:elasticsearch没有实时更新或索引。
更新:如果我给出当前页面的第一个文档并反转elasticsearch结果,那么我将获得上一页(不使用_score作为排序参数)。
但是当基于分数启用排序时,我又得到了一个完全错误的结果 你的更新让我有点困惑。那么,您是否使用“仅分数”作为排序类别?如果是这样的话,弹性平分会使用平分函数来打破不同的分数,而平分函数可能并不总是返回相同的顺序,特别是当您有多个节点时。@StefanoBranco。我将分数与其他排序参数一起使用。甚至我也在使用一个ID,它在所有文档中都是唯一的。