1:ElasticSearch的查询过程

2:由ES查询模式引起的深度分页问题

3:如何正确遍历索引中的数据


ElasticSearch的查询过程

es的数据查询分两步:

第一步是的结果是获取满足查询条件的,分布于各个shard上的_doc_id及对应_score;

第二步是根据第一步获取的所有的_doc_id,去各个shard上获取数据明细,合并返回客户端。

在第一步的查询中,es执行了一个类似map-reduce的查询模式:在各个shard上执行同样的查询,获取同样大小的数据(from+size),然后将各个 shard查询结果的_doc_id,_score返回给接收查询请求的节点,最终进行一次汇总。注意这里传输数据的数量是from+size,而不仅仅是size大小。


由ES查询模式引起的深度分页问题

通过ES的查询过程我们已经可以看出问题,对大数据量的Index进行遍历操作,如果使用from size的方式,将存在极大的资源浪费(因为from过大),当然如果size过大则问题更为严重,服务器内存会被吃光。因此很多站点的查询,都不会允许查看过大的page,深度分页的问题在关系数据库中同样存在。


如何正确遍历索引中的数据

在ES中遍历索引的推荐方式是采用scroll操作,或者在不需要排序而仅仅需要遍历的情况下,可以采用scroll_scan进一步提升性能。

详细可见:Scroll的官方说明

简单描述一下Scroll的工作原理:

1:对需要遍历(或获取某个满足条件的子集)的索引,规划一个合理的size作为分页大小;

2:在POST的查询中,增加?scroll=1m(expire time)的query string;

3:在该次查询中,返回结果中除了查询结果以外,还有一个scroll_id(很长),这个scroll_id可以看做是第一次查询时目标索引的快照的游标

4:之后直接在GET请求中将scroll_id作为query string传递,或在POST请求中加入scroll_id即可获取下一批数据,直到没有数据为止,如此实现对所有目标数据的遍历。

(注:在使用scroll遍历的过程中,不需要再指定各种查询条件比如索引名,size大小什么的,只需要指定scroll_id即可,还可以指定scroll:1m之类的过期时间,相同条件下有效期内的scroll操作,返回的scroll_id是不会变的,仅仅是scroll_id这个游标向前走,返回下一批数据而已)

scroll_id可以被显式删除,如果你需要重置对查询目标的遍历过程的话。

如果遍历过程不需要对数据进行排序,可以使用更为高效的scroll_scan方式进行,如下:

POST ip:port/my_index/my_type/_search?search_type=scan&scroll=1m&size=
{
    "query": { "match_all": {}}
}

这里需要注意的是,search_type指定为scan,即无需排序,而size=50是指每个shard上的size是50,最终返回数据是shard*size。

初次以外,scroll_scan与普通的scroll还有如下三点不同:

  1. Scroll-Scan 结果没有排序,按 index 顺序返回,没有排序,可以提高取数据性能。
  2. 初始化时只返回 _scroll_id,没有具体的 hits 结果。
  3. size 控制的是每个分片的返回的数据量而不是整个请求返回的数据量

关于scroll操作是否线程安全的问题,es的客户端(java&c#)均为线程安全,因此我认为通过客户端来进行的scroll请求也是线程安全的。如果有错误请指出。

2016-09-14补充:

利用scroll_id获取数据的同时,ES将返回当前查询的scroll_id,在其失效或被删除之前,这个scroll_id都不变,如果希望程序的可靠性更高,可以用每次返回的scroll_id更新查询POST所发送的scroll_id;同时,对通过scroll_id查询返回的结果集进行判空,以确定当前scroll_id是否已失效,从而需要重新获取scroll_id。

正确遍历ElasticSearch索引的更多相关文章

  1. Elasticsearch索引(company)_Centos下CURL增删改

    目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch索引说明 a. 通过上面几篇博客已经将Elastics ...

  2. Elasticsearch索引原理

    转载 http://blog.csdn.net/endlu/article/details/51720299 最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计 ...

  3. Elasticsearch入门教程(三):Elasticsearch索引&映射

    原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...

  4. 带你走进神一样的Elasticsearch索引机制

    更多精彩内容请看我的个人博客 前言 相比于大多数人熟悉的MySQL数据库的索引,Elasticsearch的索引机制是完全不同于MySQL的B+Tree结构.索引会被压缩放入内存用于加速搜索过程,这一 ...

  5. ES3:ElasticSearch 索引

    ElasticSearch是文档型数据库,索引(Index)定义了文档的逻辑存储和字段类型,每个索引可以包含多个文档类型,文档类型是文档的集合,文档以索引定义的逻辑存储模型,比如,指定分片和副本的数量 ...

  6. Elasticsearch索引和文档操作

    列出所有索引 现在来看看我们的索引 GET /_cat/indices?v 响应 health status index uuid pri rep docs.count docs.deleted st ...

  7. ElasticSearch 索引 剖析

    ElasticSearch index 剖析 在看ElasticSearch权威指南基础入门中关于:分片内部原理这一小节内容后,大致对ElasticSearch的索引.搜索底层实现有了一个初步的认识. ...

  8. Elasticsearch 索引、更新、删除文档

    一.Elasticsearch 索引(新建)一个文档的命令: curl XPUT ' http://localhost:9200/test_es_order_index/test_es_order_t ...

  9. Elasticsearch 索引的全量/增量更新

    Elasticsearch 索引的全量/增量更新 当你的es 索引数据从mysql 全量导入之后,如何根据其他客户端改变索引数据源带来的变动来更新 es 索引数据呢. 首先用 Python 全量生成 ...

随机推荐

  1. iOS 动画绘制线条颜色渐变的折线图

    效果图 .................... 概述 现状 折线图的应用比较广泛,为了增强用户体验,很多应用中都嵌入了折线图.折线图可以更加直观的表示数据的变化.网络上有很多绘制折线图的demo,有 ...

  2. 转载:WinForm中播放声音的三种方法

    转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753 ...

  3. OracleHelper类

    using System; using System.Collections; using System.Collections.Generic; using System.Data; using S ...

  4. Linux查看设置系统时区

    关于时区的概念,其实初中地理课已经涉及,很多人都多少了解一些,可能只是细节搞不太清楚.为什么会将地球分为不同时区呢?因为地球总是自西向东自转,东边总比西边先看到太阳,东边的时间也总比西边的早.东边时刻 ...

  5. 不同环境下文件上传Uncaught SyntaxError: Unexpected end of input

    很奇怪的问题,相同的代码和相同的数据,在两台linux服务器上执行文件上传,一台正常上传,一台在ftl页面 报:Uncaught SyntaxError: Unexpected end of inpu ...

  6. Hadoop2.5.0 搭建实录

    目录: 第一步:准备相关材料 第二步:虚拟机环境搭建 第三步:用户信息 第四步 安装.配置Java环境 第五步 Zookeeper安装配置 第六步 Hadoop安装.配置 第七步:HBase安装部署 ...

  7. 基于注解的SpringMVC

    相比传统的继承Controller体系中某些类的方式,SpringMVC的注解具有以下优点: 1.Controller不再需要继承某个特定类,只是简单的POJO. 2.请求映射的配置非常方便灵活. 3 ...

  8. 第9章 Java类的三大特性之一:继承

    1.什么是继承 子类继承父类就是对父类的扩展,继承时会自动拥有父类所拥有的处private之外的所有成员作用:增加代码复用语法格式: class 子类名 extends 父类名{…………}第9章 Ja ...

  9. Hibernate选择题总结

    Hibernate选择题总结 1.在Hibernate中,以下关于主键生成器说法错误的是( ). A.increment可以用于类型为long.short或byte的主键 B.identity用于如S ...

  10. C#使用正则表达式检测数字 char 和韩文

    if (!System.Text.RegularExpressions.Regex.IsMatch(strRoleName[i].ToString(), @"^[\uac00-\ud7ff] ...