`

elasticsearch 滚动查询

阅读更多
在Elasticsearch中,一次查询只能得到一次独立的结果,在分页中这是很不方便的,当用Elasticsearch进行第n页查询的时候,Elasticsearch内部是查询了从n页的所有数据,只是在返回的时候抛弃了前面的n-1页的内容。这样对查询一个大量数据的时候是非常不方便的。但Elasticsearch提供了滚动API来解决此问题,这有点像数据库中的游标。

滚动查询请求

    滚动是不适合实时用户请求,而是适合处理大量的数据,例如为了重建一个索引到一个新的索引中。

    官方客户端只支持Perl和Python。

    注意:从 scroll 请求返回的结果反映了在查询发生时刻的索引状态,就像一个快照。后续的对文档的改动(索引、更新或者删除)都只会影响后面的搜索请求。

    为了使用 scroll,在第一次搜索请求的查询中指定 scroll 参数,它告诉 Elasticsearch 需要保持搜索的上下文环境多长时间。例如:

滚动查询请求

    滚动是不适合实时用户请求,而是适合处理大量的数据,例如为了重建一个索引到一个新的索引中。

    官方客户端只支持Perl和Python。

    注意:从 scroll 请求返回的结果反映了在查询发生时刻的索引状态,就像一个快照。后续的对文档的改动(索引、更新或者删除)都只会影响后面的搜索请求。

    为了使用 scroll,在第一次搜索请求的查询中指定 scroll 参数,它告诉 Elasticsearch 需要保持搜索的上下文环境多长时间。例如:

请求:POST http://localhost:9200/secilog/log/_search?scroll=1m&pretty

参数:

{
    "query": {
        "term": {
            "message": "text"
        }
    }
}

Time	Units说明
y	Year
M	Month
w	Week
d	Day
h	Hour
m	Minute
s	Second
返回的结果:

{
  "_scroll_id" : "cXVlcnlBbmRGZXRjaDsxOzExMjo1azRqYldqOVJmYTdIdlVWSk94X2FnOzA7",
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.4232868,
    "hits" : [ {
      "_index" : "secilog",
      "_type" : "log",
      "_id" : "10",
      "_score" : 0.4232868,
      "_source" : {
        "type" : "file",
        "message" : "secilog is a log real-time analyse software,it's full text search is based on Elasticsearch "
      }
    } ]
  }
}
    从返回值中可以看出上面的请求结果中包含一个 scroll_id,这个 ID 可以被传递给 scroll API 来检索下一个批次的内容。在下一次查询中的实例:

请求:POST http://localhost:9200/_search/scroll?pretty

参数:

{
   "scroll" : "1m", 
   "scroll_id" : "cXVlcnlBbmRGZXRjaDsxOzExMjo1azRqYldqOVJmYTdIdlVWSk94X2FnOzA7"
}
返回的结果:

{
  "_scroll_id" : "cXVlcnlBbmRGZXRjaDsxOzExMzo1azRqYldqOVJmYTdIdlVWSk94X2FnOzA7",
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.4232868,
    "hits" : [ ]
  }
}
    每一次调用scroll查询返回下一批的结果,直到返回为空("hits" : [ ]),表示查询完成。

注意:第一次搜索请求和每个后续的滚动请求返回一个新的 _scroll_id,只有最新的 _scroll_id 才能被使用。

如果请求指定了聚合(aggregation),只有第一次搜索的返回结果才会包含聚合结果。

当使用_doc排序查询的时候,滚动的效率是最高的,当你向遍历所有的文档,且无顺序要求,这是效率最高的方式:

请求:POST localhost:9200/_search?scroll=1m

参数:

{
  "sort": [
    "_doc"
  ]
}
搜索的时效性

    滚动scroll 参数告诉Elasticsearch应保持多长时间的搜索。这个值并不需要长到可以处理所有的数据,只要够处理前一批次结果的时间。每一个滚动请求设置一个新的有效时间。

    一般来说,合并过程优化的背景是通过合并小段来创建一个新的大段来优化索引,然后删除小段。在执行滚动期间仍可以进行索引优化,但在打开搜索上下文时当小段仍然在使用候的时候会阻止小段的删除。这就是为什么后来对文档的改变不会影响滚动搜索请求的结果。

提示:保持较旧的段,意味着需要更多的文件句柄。确保在节点中已配置访问文件句柄的参数足够用。

你可以通过stats API检查打开了多少搜索上下文。

请求:GET http://localhost:9200/_nodes/stats/indices/search?pretty

清除滚动接口

    当滚动超时的时候会自动删除搜索上下文,然而保持滚动打开会产生成本,所以 scrolls 当scroll不再被使用的时候需要用 clear-scroll 显式地清除。

请求:DELETE localhost:9200/_search/scroll

参数:

{
    "scroll_id" : ["cXVlcnlBbmRGZXRjaDsxOzExMzo1azRqYldqOVJmYTdIdlVWSk94X2FnOzA7"]
}
可以同时清除多个id

{
    "scroll_id" : ["cXVlcnlBbmRGZXRjaDsxOzExMzo1azRqYldqOVJmYTdIdlVWSk94X2FnOzA7","qYldqOVJmYTdIdl"]
}
或者使用_all参数清除所有id

DELETE localhost:9200/_search/scroll/_all
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics