带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(下)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(下)

《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.14.分页搜索(上) https://developer.aliyun.com/article/1230187



search_after

 

如果说 scroll 是把上下文保存在服务端,而 search_after 要求数据中存在一个无重复,可以用于排序的字段,需要客户端每次传入上次查到的最后结果,然后获取其随后的数据。

 

由于随后的请求每次都是查询出来的,如果数据发生变化,就可能出现跨页面结果不一致的情况,为了防止这种情况,需要在请求中加一个参数来设置当前的索引状态保留时间。

 

POST /my-index-000001/_pit?keep_alive=1m

PIT 是 point in time 的简写,他是一个轻量级的视图。上述请求返回一个 ID:

{
  "id": "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA=="
}

随后的请求中你需要带上他。可以通过下面的方式,获取第一页的结果,其中的特别之处在于,要指定进行排序的字段:


GET /_search
{
  "size": 10000,
  "query": {
    "match" : {
      "user.id" : "elkbee"
        }
  },
  "pit": {
        "id":  "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA==", 
        "keep_alive": "1m"
  },
  "sort": [ 
    {"@timestamp": "asc"}
  ]
}

在返回结果中,会携带 sort 字段的值,


{
  "hits" : {
    "hits" : [
      {
        "sort" : [
          4294967298                              
        ]
      }
    ]
  }
}

你需要在下次请求的时候带上他:


GET /_search
{
  "size": 10000,
  "query": ...
  "pit": {
        "id":  ...
        "keep_alive": ...
  },
  "sort": [
    {"@timestamp": "asc"}
  ],
  "search_after": [                                
    4294967298
  ]                    
}


类似 scroll,pit 请求返回的 ID 也可以手工清理。

 

最后我们总结一下每种分页方式的特点:

 

l from+size 支持跳页,不适合深分页

l scroll 不支持跳页,适合拉取大量数据,不适合大量并发

l search_after 不支持跳页,适合拉取大量数据

 

scroll 和 search_after 都可以用于深分页,search_after 需要提供一个主键字段进行排序,默认为 _shard_doc,它是 shard index 与 Lucene 内部 ID 的组合值。在服务端保存的上下文要比 scroll 小,目前官方推荐使用 search_after 代替 scroll。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
12月前
|
SQL 搜索推荐 数据库
带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(上)
带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(上)
103 0
|
12月前
|
API
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (3)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (3)
110 0
|
12月前
|
运维 前端开发 Devops
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (4)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (4)
118 0
|
12月前
|
数据采集 存储 搜索推荐
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (1)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (1)
220 0
|
12月前
|
存储 搜索推荐
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (2)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (2)
|
12月前
|
自然语言处理 算法 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(14)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(14)
|
12月前
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(10)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(10)
|
12月前
|
JSON 数据格式
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(15)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(15)
|
12月前
|
自然语言处理 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(9)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(9)
|
12月前
|
自然语言处理
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(13)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(13)