首页 > 解决方案 > search_after 在elasticsearch中通过向后分页给出错误结果

问题描述

使用elasticsearch,我试图在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

}

注意:这里的 search_after 值是当前分页中最后一个文档的排序数组。

为了进行反向分页,

我只是颠倒线程弹性讨论中提到的排序选项的排序顺序。我的弹性查询现在如下...

{
"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 是当前分页中最后一个文档的排序数组中的值。这一次不是显示上一页的结果,而是弹性给出了一些其他的结果。

注意:Elasticsearch 版本 7.2

注意:弹性搜索没有实时更新或索引。

更新:如果我给出当前页面的第一个文档并反转弹性搜索结果,那么我将得到上一页(不使用 _score 作为排序参数)。但是,当根据分数启用排序时,我又得到了一个完全错误的结果。

标签: elasticsearchpagination

解决方案


推荐阅读