ES中实现分页查询数据并返回想要的字段

在日志收集系统中,最近需要通过httpclient获取es中的日志信息,所以学习了一些es的查询语句方面的用法;

分页

分页的本质
分页的本质是从“大的数据集”中取出一部分。比如10000条记录,每页10条数据。取第二页即第11条到20条数据。ES或者数据库怎么知道哪些数据是第二部分(第2页),哪些是第三部分(第3页)呢?答案是ES或者数据库不知道,所以正确的分页必须要指定分页的顺序,即要有order by或者sort语句。

在ES中有三种方式可以实现分页:from+size、scroll、search_after

from+size

{
    "size":10,
    "from":0;
    "query":{
        "bool":{
            "filter":{
                "range":{
                    "beginTimeStr111":{
                        "gte":"2019-01-06T00:00:01.638Z",
                        "lte":"2019-01-06T23:59:59.330Z",
                        "time_zone":"+08:00"
                    }
                }
            },
            "must":{
                "match":{
                    //匹配的字段信息
                }
            }
        }
    },

在上述查询语句中,from字段的值表示的是从所有信息的第0行开始,找出size条的信息,如果需要找出第21到第30条的信息,则应该设置from = 21, size = 10.
在实际应用中,我们可以设置两者的数值大小,以适应不同的需求。

scroll(快照分页)

相对于from和size的分页来说,使用scroll可以模拟一个传统数据的游标,记录当前读取的文档信息位置。这个分页的用法,不是为了实时查询数据,而是为了一次性查询大量的数据(甚至是全部的数据)。因为这个scroll相当于维护了一份当前索引段的快照信息,这个快照信息是你执行这个scroll查询时的快照。在这个查询后的任何新索引进来的数据,都不会在这个快照中查询到。但是它相对于from和size,不是查询所有数据然后剔除不要的部分,而是记录一个读取的位置,保证下一次快速继续读取。

   curl -XGET 'localhost:9200/twitter/tweet/_search?scroll=1m' -d '
   {
        "query": {
             "match" : {
             "title" : "elasticsearch"
          }
       }
    }
//通过返回的scroll_id继续查找信息
curl -XGET  '集群节点IP:9200/_search/scroll?scroll=1m&scroll_id=c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1'


该查询会自动返回一个_scroll_id,通过这个id(经过base64编码)可以继续查询

search_after

search_after参数通过提供实时游标来解决分页中遇到的消耗内存和时间增长问题。
检索第一页的数据后,

POST twitter/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "sort": [
        {"date": "asc"},
        {"_id": "desc"}
    ]
}

上面的请求会为每一个文档返回一个包含sort排序值的数组。这些sort排序值可以被用于 search_after 参数里以便抓取下一页的数据。比如,我们可以使用最后的一个文档的sort排序值,将它传递给 search_after 参数:

GET twitter/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "search_after": [1463538857, "654323"],
    "sort": [
        {"date": "asc"},
        {"_id": "desc"}
    ]
}

当使用search_after时,from的属性值应该置为0或者-1,也可以不设置from这个属性。

返回字段

应用_source可以返回使用者想要返回的字段

{
    "_source": {
        "includes": [ "beginTimeStr111", "clientIP" , "executeTime","retCode","srvName"]

  }
  , "size": 40,
  "from": 0
}

includes属性中表示的是想要获取的字段,excludes表示不想要的字段,
_source虽然很好用,但是它会占用很大的索引的存储空间,可以通过enabled false禁用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java ,可以使用 Elasticsearch 的 Java API 进行分页查询。以下是一个简单的示例代码: ```java import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; public class PaginationExample { private RestHighLevelClient client; public PaginationExample(RestHighLevelClient client) { this.client = client; } public void searchWithPagination(String indexName, int from, int size) throws IOException { SearchRequest searchRequest = new SearchRequest(indexName); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchSourceBuilder.from(from); searchSourceBuilder.size(size); searchSourceBuilder.sort(SortBuilders.fieldSort("date").order(SortOrder.DESC)); searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); // 处理返回结果 } } ``` 在这个示例,我们使用了 `SearchSourceBuilder` 来构建查询请求,并设置了查询语句、分页信息和排序规则。其 `from` 和 `size` 分别表示从第几条记录开始查询和每页查询的记录数。`sort` 方法用于设置排序规则,这里将按照 `date` 字段降序排序。 最后,我们将构建好的查询请求传递给 `client.search` 方法,并处理返回查询结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值