ES分页查询的实现方式(三种姿势进行分页查询)

一、基本概念

ES(Elasticsearch)是一个高可用、可扩展、基于Lucene的开源分布式搜索引擎。它支持多种搜索方式,其中分页是我们常用的搜索方式之一。分页查询将大量数据分成若干页,如果我们需要查看后续的数据,就需要翻页。ES的分页查询是实现这种场景的最佳方式之一。

二、分页查询的语法

ES的分页查询语法需要用到size和from参数,其中size表示返回的查询结果数目,from表示从搜索结果的第几条开始,默认值为0。下面是一个简单的分页查询的语法:

    GET /_search
    {
        "query": {
            "match": {
                "title": "Elasticsearch"
            }
        },
        "from": 0,
        "size": 10
    }

上述语法表示:从ES中查询title中包含Elasticsearch的文档,并从第0条记录开始返回10条记录。

三、实现分页

ES的分页查询语法虽然简单,但是我们在实际应用中需要在多个方面做出优化。比如需要对查询结果进行排序、过滤等操作,下面将介绍如何实现这些优化。

四、对查询结果进行排序

我们可以通过在查询语句中添加sort参数对查询结果进行排序。sort参数可以接受多个排序条件,其中每个条件可以指定排序字段、排序方式等信息。下面是一个根据发布时间对文章进行排序的示例:

    GET /_search
    {
        "query": {
            "term": {
                "title": "Elasticsearch"
            }
        },
        "from": 0,
        "size": 10,
        "sort": {
            "pub_date": {
                "order": "desc"
            }
        }
    }

上述语法表示:从ES中查询title中包含Elasticsearch的文档,并按照pub_date字段的降序返回前10条记录。

五、对查询结果进行过滤

我们还可以使用ES提供的filter参数对查询结果进行过滤。这样我们可以在查询语句中一次性完成查询和过滤操作。下面是一个搜索收入在指定范围的数据的示例:

    GET /_search
    {
        "query": {
            "match": {
                "title": "Elasticsearch"
            }
        },
        "from": 0,
        "size": 10,
        "filter": {
            "range": {
                "income": {
                    "gte": 10000,
                    "lte": 20000
                }
            }
        }
    }

上述语法表示:从ES中查询title中包含Elasticsearch的文档,并且收入在10000到20000之间的文档,并按照默认顺序返回前10条记录。

六、基于scroll查询的分页方式

scroll查询是一种基于游标的分页方式,通过游标来记录查询的起始和结束状态。这种方式可以有效地避免查询高频率请求ES的问题,提高查询效率。我们可以使用ES的scroll查询来实现这种方式的分页查询。下面是一个使用scroll查询的示例:

    POST /my_index/_search?scroll=1m
    {
        "query": {
            "match": {
                "title": "Elasticsearch"
            }
        },
        "size": 10
    }

上述语法表示:从my_index索引中查询title中包含Elasticsearch的文档,并且每页返回10条记录。scroll参数表示查询状态的保持时间。

七、使用scan+scroll方式进行全量数据查询

scan+scroll方式是一种对全量数据进行分页查询的方式。我们可以使用该方式来快速地扫描ES中的全量数据。下面是一个使用scan+scroll方式的示例:

    POST /my_index/_search?search_type=scan&scroll=1m
    {
        "query": {
            "match_all": {}
        },
        "size": 10
    }

上述语法表示:从my_index索引中查询所有文档,并每次返回10条记录,使用scan+scroll方式来对文档进行全量数据查询。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平