elasticsearch-利用游标查询 'Scroll'来做分页查询
2017-02-15 14:12
302 查看
游标查询 'Scroll'
scroll查询 可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价。
游标查询允许我们 先做查询初始化,然后再批量地拉取结果。 这有点儿像传统数据库中的 cursor 。
游标查询会取某个时间点的快照数据。 查询初始化之后索引上的任何变化会被它忽略。 它通过保存旧的数据文件来实现这个特性,结果就像保留初始化时的索引 '视图' 一样。
深度分页的代价根源是结果集全局排序,如果去掉全局排序的特性的话查询结果的成本就会很低。 游标查询用字段
_doc来排序。 这个指令让
Elasticsearch 仅仅从还有结果的分片返回下一批结果。
启用游标查询可以通过在查询的时候设置参数
scroll的值为我们期望的游标查询的过期时间。 游标查询的过期时间会在每次做查询的时候刷新,所以这个时间只需要足够处理当前批的结果就可以了,而不是处理查询结果的所有文档的所需时间。
这个过期时间的参数很重要,因为保持这个游标查询窗口需要消耗资源,所以我们期望如果不再需要维护这种资源就该早点儿释放掉。 设置这个超时能够让 Elasticsearch 在稍后空闲的时候自动释放这部分资源。
GET /old_index/_search?scroll=1m (1) { "query": { "match_all": {}}, "sort" : ["_doc"], (2) "size": 1000 }
保持游标查询窗口一分钟。
关键字
_doc是最有效的排序顺序。
这个查询的返回结果包括一个字段
_scroll_id, 它是一个base64编码的长字符串 。 现在我们能传递字段
_scroll_id到
_search/scroll查询接口获取下一批结果:
GET /_search/scroll { "scroll": "1m", (1) "scroll_id" : "cXVlcnlUaGVuRmV0Y2g7NTsxMDk5NDpkUmpiR2FjOFNhNnlCM1ZDMWpWYnRROzEwOTk1OmRSamJHYWM4U2E2eUIzVkMxalZidFE7MTA5OTM6ZFJqYkdhYzhTYTZ5QjNWQzFqVmJ0UTsxMTE5MDpBVUtwN2lxc1FLZV8yRGVjWlI2QUVBOzEwOTk2OmRSamJHYWM4U2E2eUIzVkMxalZidFE7MDs=" }
注意再次设置游标查询过期时间为一分钟。
这个游标查询返回的下一批结果。 尽管我们指定字段
size的值为1000,我们有可能取到超过这个值数量的文档。 当查询的时候,
字段
size作用于单个分片,所以每个批次实际返回的文档数量最大为
size * number_of_primary_shards。
def query_Data(self,mindex,mtype,mstr,msize=20): '''查询数据库中指定表所有字段出现的值 :mindex 查询的数据库 :mtype 查询的数据库表 :mstr 匹配的字段 :mfrom 返回的起始位置 :msize 需要查询的总条数 return 返回一个dict ''' if not Ela.es: return False if not (mindex and mtype and mstr): return False data=[] try: querydata = Ela.es.search(index=mindex,doc_type=mtype,scroll='5m',timeout='3s',\ body={"query": {"bool": {"must": [{"query_string": {"default_field": "_all","query": mstr}}]}},"size": msize}) mdata = querydata.get("hits").get("hits") if not mdata: return -1 #没有查询到数据 #解析返回的值 data = [d.get("_source") for d in mdata] sid = querydata['_scroll_id'] while True: rs = Ela.es.scroll(scroll_id=sid,scroll='10s') temp = rs.get("hits").get("hits") if not temp: break data += [d.get("_source") for d in temp] logger.info("共查询到: %d条数据"%data.__len__()) return data except Exception as ex: logger.warnning("Elasticsearch数据库查询发生异常"+str(ex)) return False
相关文章推荐
- 利用临时表、REF游标、动态SQL实现分页查询
- Elasticsearch 分页查询from VS scroll
- JDBC利用游标分页查询
- Elasticsearch使用scroll进行分页查询
- JDBC利用游标分页查询
- GridView利用分页存储过程实现真正的自定义分页查询
- sqlserver存储过程中利用游标遍历结果集简单示例及查询数据库时间
- 利用MySQL的一个特性实现MySQL查询结果的分页显示
- 利用JQuery方便实现基于Ajax的数据查询、排序和分页功能
- 偶然得到的Sql Server的游标分页查询
- 利用JQuery方便实现基于Ajax的数据查询、排序和分页功能
- 利用标准的SQL语句实现查询记录分页
- SQL Server 利用row_number()实现表的分页查询
- 利用存储过程实现分页 ,并且多条件查询
- 高效的MySQL分页——利用子查询分页
- 利用存储过程进行分页 游标
- SQL Server 2005中利用临时表和@@RowCount提高分页查询存储过程性能
- 利用JQuery方便实现基于Ajax的数据查询、排序和分页功能
- sql查询所有存储过程内容-利用游标和临时表
- Android 利用内容提供者进行排序分页查询