elasticsearch-利用游标查询 'Scroll'来做分页查询

转载 2018年04月16日 10:10:43

游标查询 'Scroll'

scroll 查询 可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价。

游标查询允许我们 先做查询初始化,然后再批量地拉取结果。 这有点儿像传统数据库中的 cursor 。

游标查询会取某个时间点的快照数据。 查询初始化之后索引上的任何变化会被它忽略。 它通过保存旧的数据文件来实现这个特性,结果就像保留初始化时的索引 '视图' 一样。

深度分页的代价根源是结果集全局排序,如果去掉全局排序的特性的话查询结果的成本就会很低。 游标查询用字段 _doc 来排序。 这个指令让 Elasticsearch 仅仅从还有结果的分片返回下一批结果。

启用游标查询可以通过在查询的时候设置参数 scroll 的值为我们期望的游标查询的过期时间。 游标查询的过期时间会在每次做查询的时候刷新,所以这个时间只需要足够处理当前批的结果就可以了,而不是处理查询结果的所有文档的所需时间。 这个过期时间的参数很重要,因为保持这个游标查询窗口需要消耗资源,所以我们期望如果不再需要维护这种资源就该早点儿释放掉。 设置这个超时能够让 Elasticsearch 在稍后空闲的时候自动释放这部分资源。

GET /old_index/_search?scroll=1m (1)
{
    "query": { "match_all": {}},
    "sort" : ["_doc"], (2)
    "size":  1000
}
  1. 保持游标查询窗口一分钟。

  2. 关键字 _doc 是最有效的排序顺序。

这个查询的返回结果包括一个字段 _scroll_id, 它是一个base64编码的长字符串 。 现在我们能传递字段 _scroll_id 到 _search/scroll 查询接口获取下一批结果:

GET /_search/scroll
{
    "scroll": "1m", (1)
    "scroll_id" : "cXVlcnlUaGVuRmV0Y2g7NTsxMDk5NDpkUmpiR2FjOFNhNnlCM1ZDMWpWYnRROzEwOTk1OmRSamJHYWM4U2E2eUIzVkMxalZidFE7MTA5OTM6ZFJqYkdhYzhTYTZ5QjNWQzFqVmJ0UTsxMTE5MDpBVUtwN2lxc1FLZV8yRGVjWlI2QUVBOzEwOTk2OmRSamJHYWM4U2E2eUIzVkMxalZidFE7MDs="
}
  1. 注意再次设置游标查询过期时间为一分钟。

这个游标查询返回的下一批结果。 尽管我们指定字段 size 的值为1000,我们有可能取到超过这个值数量的文档。 当查询的时候, 字段 size 作用于单个分片,所以每个批次实际返回的文档数量最大为 size * number_of_primary_shards 。

[python] view plain copy
  1. def query_Data(self,mindex,mtype,mstr,msize=20):  
  2.         '''''查询数据库中指定表所有字段出现的值 
  3.         :mindex 查询的数据库 
  4.         :mtype 查询的数据库表 
  5.         :mstr 匹配的字段 
  6.         :mfrom 返回的起始位置 
  7.         :msize 需要查询的总条数 
  8.         return 返回一个dict 
  9.         '''  
  10.         if not Ela.es:  
  11.             return False  
  12.         if not (mindex and mtype and mstr):  
  13.             return False  
  14.         data=[]  
  15.         try:  
  16.             querydata = Ela.es.search(index=mindex,doc_type=mtype,scroll='5m',timeout='3s',\  
  17.                         body={"query": {"bool": {"must": [{"query_string": {"default_field""_all","query": mstr}}]}},"size": msize})  
  18.             mdata = querydata.get("hits").get("hits")  
  19.             if not mdata:  
  20.                 return -1 #没有查询到数据  
  21.             #解析返回的值  
  22.             data = [d.get("_source"for d in mdata]  
  23.             sid = querydata['_scroll_id']  
  24.             while True:  
  25.                 rs = Ela.es.scroll(scroll_id=sid,scroll='10s')  
  26.                 temp = rs.get("hits").get("hits")  
  27.                 if not temp:  
  28.                     break  
  29.                 data += [d.get("_source"for d in temp]  
  30.             logger.info("共查询到: %d条数据"%data.__len__())  
  31.             return data  
  32.         except Exception as ex:  
  33.             logger.warnning("Elasticsearch数据库查询发生异常"+str(ex))  
  34.             return False  
原文链接:https://blog.csdn.net/chuan442616909/article/details/55195024

Elasticsearch分页查询

在http://www.cnblogs.com/xing901022/p/5284902.html该链接上看到2种Elasticsearch分页查询的...
  • fine_weather
  • fine_weather
  • 2016-09-16 20:26:51
  • 1453

es(elasticsearch)游标(查询)的理解

ES中的游标在查询过程中,数据变化时,对游标的影响是什么?这部分数据会通过当前游标(满足当前查询条件)查询出来吗? 不会; 游标原理 参考: http://lavasoft.blog.51ct...
  • KuaiLeShiFu
  • KuaiLeShiFu
  • 2017-04-21 12:17:12
  • 644

Elasticsearch使用scroll进行分页查询

之前一直使用from size进行分页查询(深度分页),当数据量大的时候,对全部数据进行遍历,使用from size性能会很差,然后了解了下scroll方法,简单讲解一下scroll方法的使用。 从网...
  • lom9357bye
  • lom9357bye
  • 2017-03-21 20:50:26
  • 8764

Oracle存储过程与游标结合的分页

网址: 转:Oracle存储过程与游标结合的分页   2010-08-25 10:12:00|  分类: IT|举报|字号 订阅 参考了网...
  • baihuzi038
  • baihuzi038
  • 2014-04-18 10:01:45
  • 634

Elasticsearch Java API 的使用(8)—Scroll (游标)API详解

滚动查询Elasticsearch中进行大数据量查询时,往往因为设备、网络传输问题影响查询数据的效率;Elasticsearch中提供了Scroll(游标)的方式对数据进行少量多批次的滚动查询,来提高...
  • zx711166
  • zx711166
  • 2017-09-05 08:40:31
  • 709

Elasticsearch之scroll

一个search请求只能返回结果的一个单页(10条记录),而scroll API能够用来从一个单一的search请求中检索大量的结果(甚至全部) ,这种行为就像你在一个传统数据库内使用一个游标一样。...
  • Allenalex
  • Allenalex
  • 2015-04-22 21:12:18
  • 7997

Elasticsearch中扫描和滚动处理深分页问题

原文地址:http://blog.csdn.net/u014431852/article/details/52830938 1.from-size的限制  Elasticsearch可以用一种...
  • tanga842428
  • tanga842428
  • 2017-07-11 08:40:35
  • 419

SqlServer中使用游标实现分页效果

create proc pageproc @pageIndex int, @pageSize int as begin declare cur cursor scroll for selec...
  • lin_lujian
  • lin_lujian
  • 2011-10-28 13:50:48
  • 766

Solr游标查询提高翻页效率

长期以来,我们一直有一个深分页问题。如果直接跳到很靠后的页数,查询速度会比较慢。这是因为Solr的需要为查询从开始遍历所有数据。直到Solr的4.7这个问题一直没有一个很好的解决方案。与最近发布的So...
  • cuichao703
  • cuichao703
  • 2014-08-15 16:56:27
  • 2453
收藏助手
不良信息举报
您举报文章:elasticsearch-利用游标查询 'Scroll'来做分页查询
举报原因:
原因补充:

(最多只允许输入30个字)