计算机系统应用教程网站

网站首页 > 技术文章 正文

elasticsearch 分页查询 search_after 深分页

btikc 2024-10-16 08:22:38 技术文章 14 ℃ 0 评论

search_after 深分页

scroll 的方式,官方的建议不用于实时的请求(一般用于数据导出),因为每一个 scroll_id 不仅会占用大量的资源,而且会生成历史快照,对于数据的变更不会反映到快照上。

search_after 分页的方式是根据上一页的最后一条数据来确定下一页的位置,同时在分页请求的过程中,如果有索引数据的增删改查,这些变更也会实时的反映到游标上。但是需要注意,因为每一页的数据依赖于上一页最后一条数据,所以无法跳页请求。

为了找到每一页最后一条数据,每个文档必须有一个全局唯一值,官方推荐使用 _uid 作为全局唯一值,其实使用业务层的 id 也可以。

GET /ad/_search
{
    "query":{
        "match_all":{

        }
    },
    "from":0,
    "size":2,
    "sort":[
        {
            "_id":{
                "order":"desc"
            }
        }
    ]
}

# 输出结果
{
    "took":0,
    "timed_out":false,
    "_shards":{
        "total":1,
        "successful":1,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":{
            "value":11,
            "relation":"eq"
        },
        "max_score":null,
        "hits":[
            {
                "_index":"ad",
                "_type":"_doc",
                "_id":"9",
                "_score":null,
                "_source":{
                    "name":null,
                    "price":666,
                    "color":"orange",
                    "ad":"this is a orange phone",
                    "label":[
                        "orange",
                        "unknown"
                    ]
                },
                "sort":[
                    "9"
                ]
            },
            {
                "_index":"ad",
                "_type":"_doc",
                "_id":"8",
                "_score":null,
                "_source":{
                    "name":null,
                    "price":666,
                    "color":"orange",
                    "ad":"this is a orange phone",
                    "label":[
                        "orange",
                        "unknown"
                    ]
                },
                "sort":[
                    "8"
                ]
            }
        ]
    }
}

使用search_after必须要设置from=0。 这里使用_id作为唯一值排序。我们在返回的最后一条数据里拿到sort属性的值传入到search_after。

使用sort返回的值搜索下一页:

GET /ad/_search
{
    "query":{
        "match_all":{

        }
    },
    "from":0,
    "size":2,
    "search_after":[
        "8"
    ],
    "sort":[
        {
            "_id":{
                "order":"desc"
            }
        }
    ]
}

# 输出结果
{
    "took":1,
    "timed_out":false,
    "_shards":{
        "total":1,
        "successful":1,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":{
            "value":11,
            "relation":"eq"
        },
        "max_score":null,
        "hits":[
            {
                "_index":"ad",
                "_type":"_doc",
                "_id":"7",
                "_score":null,
                "_source":{
                    "price":999,
                    "color":"black",
                    "ad":"this is a black phone",
                    "label":[
                        "black",
                        "unknown"
                    ]
                },
                "sort":[
                    "7"
                ]
            },
            {
                "_index":"ad",
                "_type":"_doc",
                "_id":"6",
                "_score":null,
                "_source":{
                    "name":"",
                    "price":2999,
                    "color":"black",
                    "ad":"this is a black phone",
                    "label":[
                        "black",
                        "unknown"
                    ]
                },
                "sort":[
                    "6"
                ]
            }
        ]
    }
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表