elasticsearch 在elasticsearch中使用向后分页给出错误结果后进行搜索,elasticsearch,pagination,elasticsearch,Pagination" /> elasticsearch 在elasticsearch中使用向后分页给出错误结果后进行搜索,elasticsearch,pagination,elasticsearch,Pagination" />

elasticsearch 在elasticsearch中使用向后分页给出错误结果后进行搜索

elasticsearch 在elasticsearch中使用向后分页给出错误结果后进行搜索,elasticsearch,pagination,elasticsearch,Pagination,使用elasticsearch,我试图在search_after的帮助下实现分页。我在进行反向分页时遇到问题,即结果错误(与上一页的实际结果不同) 对于正向分页,我使用弹性查询,如下所示 { "sort": [{ "_score": "desc" }, { "last_login": { "order": "desc", "mode": "avg" } }, { "id": { "order": "asc"

使用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
{
"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,它在所有文档中都是唯一的。