ES系列十二、ES的scrollApi及分页实例

ES系列⼗⼆、ES的scrollApi及分页实例
1.官⽅api
1.Scroll概念
Version:6.1
英⽂原⽂地址:
当⼀个搜索请求返回单页结果时,可以使⽤ scroll API 检索体积⼤量(甚⾄全部)结果,这和在传统数据库中使⽤游标的⽅式⾮常相似。
不要把scroll⽤于实时请求,它主要⽤于⼤数据量的场景。例如:将⼀个索引的内容索引到另⼀个不同配置的新索引中。
2.Client support for scrolling and reindexing(滚动搜索和索引之间的⽂档重索引)
老虎帮⼀些官⽅⽀持的客户端提供了⼀些辅助类,可以协助滚动搜索和索引之间的⽂档重索引:
Perl
参阅和
Python
参阅
NOTE:从 scroll 请求返回的结果反映了初始搜素请求⽣成时的索引状态,就像时间快照⼀样。对⽂档的更改(索引、更新或者删除)只会影响以后的搜索请求。
3.基本⽤法
为了使⽤ scroll ,初始的搜索请求应该在查询字符串中指定scroll参数,这个参数会告诉 Elasticsearch 将 “search context” 保存多久。例如:?scroll=1m
POST /twitter/_search?scroll=1m
{
"size": 100,
"query": {
"match" : {
"title" : "elasticsearch"
}
}
}
上⾯的请求返回的结果⾥会包含⼀个_scroll_id,我们需要把这个值传递给scroll API ,⽤来取回下⼀批结果。
POST  /_search/scroll
{
"scroll" : "1m",
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
(1) GET或者POST都可以
(2) URL 不能包含index和type名称,原始请求中已经指定了
(3) scroll参数告诉 Elasticsearch 把搜索上下⽂再保持⼀分钟
(4) scroll_id的值就是上⼀个请求中返回的_scroll_id的值
size参数允许我们配置每批结果返回的最⼤命中数。每次调⽤ scroll API 都会返回下⼀批结果,直到不再有可以返回的结果,即命中数组为空。
IMPORTANT:初始的搜索请求和每个 scroll 请求都会返回⼀个新的_scroll_id,只有最近的_scroll_id是可⽤的
NOTE:如果请求指定了过滤,就只有初始搜索的响应中包含聚合结果。
NOTE:Scroll 请求对_doc排序做了优化。如果要遍历所有的⽂档,⽽且不考虑顺序,_doc是最⾼效的选项。
GET /_search?scroll=1m
{
"sort": [
"_doc"
]
}
1.Keeping the search context alive
scroll参数告诉了 Elasticsearch 应当保持搜索上下⽂多久。它的值不需要长到能够处理完所有的数据,只要⾜够处理前⼀批结果就⾏了。每个 scroll 请求都会设置⼀个新的过期
时间。
通常,为了优化索引,后台合并进程会把较⼩的段合并在⼀起创建出新的更⼤的段,此时会删除较⼩的段。这个过程在 scrolling 期间会继续进⾏,但是⼀个打开状态的索引上下
⽂可以防⽌旧段在仍需要使⽤时被删除。这就解释了 Elasticsearch 为什么能够不考虑对⽂档的后续修改,⽽返回初始搜索请求的结果。
TIP:使旧段保持活动状态意味着需要更多的⽂件句柄。请确保你已将节点配置为拥有⾜够的可⽤的⽂件句柄。详情参阅
你可以使⽤查看有多少搜索上下⽂处于开启状态
GET /_nodes/stats/indices/search
2.Clear scroll API
当超出了scroll timeout时,搜索上下⽂会被⾃动删除。但是,保持 scrolls 打开是有成本的,当不再使⽤ scroll 时应当使⽤clear-scroll API 进⾏显式清除。
DELETE /_search/scroll
{
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
可以使⽤数组传递多个 scroll ID
DELETE /_search/scroll
{
"scroll_id" : [
"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU
]
}
使⽤_all参数清除所有的搜索上下⽂
DELETE /_search/scroll/_all
也可以使⽤ query string 参数传递scroll_id,多个值使⽤英⽂逗号分割
DELETE /_search/scroll/DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==,DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmR 3.Sliced Scroll
如果 scroll 查询返回的⽂档数量过多,可以把它们拆分成多个切⽚以便独⽴使⽤
GET /twitter/_search?scroll=1m
{
"slice": {
"id": 0,
"max": 2
},
"query": {
甘肃农业大学学报"match" : {
"title" : "elasticsearch"
}
}
}
GET /twitter/_search?scroll=1m
{
"slice": {
"id": 1,
"max": 2
},
"query": {中国民生发展报告2014
"match" : {
"title" : "elasticsearch"
}
}
}
(1) 切⽚的 id
(2) 最⼤切⽚数量
上⾯的栗⼦,第⼀个请求返回的是第⼀个切⽚(id : 0)的⽂档,第⼆个请求返回的是第⼆个切⽚的⽂档。因为我们设置了最⼤切⽚数量是 2 ,所以两个请求的结果等价于⼀次不
切⽚的 scroll 查询结果。默认情况下,先在第⼀个分⽚(shard)上做切分,然后使⽤以下公式:slice(doc) = floorMod(hashCode(doc._uid), max) 在每个 shard 上执⾏切分。例
如,如果 shard 的数量是 2 ,并且⽤户请求 4 slices ,那么 id 为 0 和 2 的 slice 会被分配给第⼀个 shard ,id 为 1 和 3 的 slice 会被分配给第⼆个 shard 。
每个 scroll 是独⽴的,可以像任何 scroll 请求⼀样进⾏并⾏处理。
NOTE:如果 slices 的数量⽐ shards 的数量⼤,第⼀次调⽤时,slice filter 的速度会⾮常慢。它的复杂度时 O(n) ,内存开销等于每个 slice N 位,其中 N 时 shard 中
的⽂档总数。经过⼏次调⽤后,筛选器会被缓存,后续的调⽤会更快。但是仍需要限制并⾏执⾏的 sliced 查询的数量,以免内存激增。
为了完全避免此成本,可以使⽤另⼀个字段的doc_values来进⾏切⽚,但⽤户必须确保该字段具有以下属性:
该字段是数字类型
该字段启⽤了doc_values
每个⽂档应当包含单个值。如果⼀份⽂档有指定字段的多个值,则使⽤第⼀个值
每个⽂档的值在创建⽂档时设置了之后不再更新,这可以确保每个切⽚获得确定的结果
字段的基数应当很⾼,这可以确保每个切⽚获得的⽂档数量⼤致相同
GET /twitter/_search?scroll=1m
{
"slice": {
"field": "date",
陈和平
"id": 0,
"max": 10
},
"query": {
"match" : {
可持续发展内涵"title" : "elasticsearch"
}
}
}
NOTE:默认情况下,每个 scroll 允许的最⼤切⽚数量时 1024。你可以更新索引设置中的index.max_slices_per_scroll来绕过此限制。
3.实现分页案例
1.实现分页,每页20条数据,第⼀次请求返回第⼀页数据
POST /book1/_search?scroll=10m
{
武英高速公路
"size":20
}
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAL6FlI4dDZSMjBYUXJpdEpCXzVRVlFzdmcAAAAAAAAC_hZSOHQ2UjIwWFFyaXRKQl81UVZRc3ZnAAAAAAAAAvsWUjh0NlIyMFhRcml0SkJfNVFWUXN2ZwAAAAAAAAL8FlI4dDZSMjB "took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 41,
"max_score": 1,
"hits": [
{
"_index": "book1",
"_type": "english",
"_id": "_update",
"_score": 1,
"_source": {
"scripted_upsert": true,
"script": {
"id": "my_web_session_summariser",
"params": {
"pageViewEvent": {
"url": "foo/bar",
"response": 404,
"time": "2014-01-01 12:32"
}
}
},
"upsert": {}
}
},
{
"_index": "book1",
"_type": "english",
"_id": "79",
"_score": 1,
"_source": {
"name": "new_name"
}
}
。。。。
}
2.使⽤scroll_id请求后⾯的⼏页的数据,每次返回⼀页
POST /_search/scroll
{
"scroll":"10m",
"scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAL6FlI4dDZSMjBYUXJpdEpCXzVRVlFzdmcAAAAAAAAC_hZSOHQ2UjIwWFFyaXRKQl81UVZRc3ZnAAAAAAAAAvsWUjh0NlIyMFhRcml0SkJfNVFWUXN2ZwAAAAAAAAL8FlI4dDZSMjB }
最后⼀页只有⼀条:
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAL6FlI4dDZSMjBYUXJpdEpCXzVRVlFzdmcAAAAAAAAC_hZSOHQ2UjIwWFFyaXRKQl81UVZRc3ZnAAAAAAAAAvsWUjh0NlIyMFhRcml0SkJfNVFWUXN2ZwAAAAAAAAL8FlI4dDZSMjB "took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 41,
"max_score": 1,
"hits": [
{
"_index": "book1",
"_type": "english",
"_id": "oAmI_mQBbhSmAk-TGrMQ",
"_score": 1,
"_source": {
"name": "否sdfdsfds",
"age": 13,
"class": "dsfdsf",
"addr": "中国"
}
}
]
}
}
继续执⾏返回空:
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAL6FlI4dDZSMjBYUXJpdEpCXzVRVlFzdmcAAAAAAAAC_hZSOHQ2UjIwWFFyaXRKQl81UVZRc3ZnAAAAAAAAAvsWUjh0NlIyMFhRcml0SkJfNVFWUXN2ZwAAAAAAAAL8FlI4dDZSMjB "took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 41,
"max_score": 1,
"hits": []
}
}
3.异常:earchContextMissingException
SearchContextMissingException[No search context found for id [721283]];
原因:scroll设置的时间过短了。

本文发布于:2024-09-20 22:25:24,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/181853.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:请求   结果   搜索   返回   初始   需要   参数   字段
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议