- 浏览: 2180754 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
### (一)scroll的介绍
有时候我们可能想要读取整个es索引的数据或者其中的大部分数据,来重建索引或者加工数据,相信大多数人都会说这很简单啊直接用from+size就能搞定,但实际情况是from+size的分页方法不适合用于这种全量数据的抽取,越到后面这种方法的性能就越低,这也是es里面为什么限制了单次查询结果的数据不能超过1万条数据的原因。
es里面提供了scroll的方式来全量读取索引数据其与数据库里面的游标(cursor)的概念非常类似,使用scroll读取数据的时候,只需要发送一次查询请求,然后es服务端会生成一个当前请求索引的快照数据集,接着我们每次通过scrollId来读取指定大小的批次数据,直到把整个索引的数据读取完毕。
这里面需要注意,当索引快照集生成的时候,其实在es内部维护了一个search context的上下文,这个上下文在指定的时间间隔内是只读的和不可变的,也就是只要它生成,那么后续你的添加,删除,更新操作的数据都不会被感知。
### (二)scroll的使用
下面看下如何使用:
(1)要使用scroll方式来读取数据,需要两步操作,第一步先做一个search context的初始化操作,如下命令:
```` curl -XGET 'localhost:9200/twitter/tweet/_search?scroll=1m' -d ' { "query": { "match" : { "title" : "elasticsearch" } } } ' ````
注意上面url里面的scroll=1m代表,这个search context只保留一分钟的有效期。
(2)在第一步操作里面我们能够获取一个scrollId,然后后面的每个读取都会得到一个scrollId,我们在读取next批次的数据要把这个scrollId回传,如下:
```` curl -XGET 'localhost:9200/_search/scroll' -d' { "scroll" : "1m", "scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1" } ' ````
或者通过search lite api的方式:
```` curl -XGET 'localhost:9200/_search/scroll?scroll=1m' -d 'c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1' ````
这样依次循环读取直到searchHits数组为空的情况下就代表数据读取完毕。
同理聚合的scroll请求,也是如此,但聚合请求的数据体只会在初始化的search里面存在,这一点需要注意,不过聚合请求的scroll一般没有这种应用场景,毕竟聚合后的结果一般都是少了好几个数量级的。
此外scroll请求还可以添加一个或多个排序字段,如果你读取的索引数据完全忽略它的顺序,那么我们还可以使用doc字段排序来提升性能。
```` curl -XGET 'localhost:9200/_search?scroll=1m' -d ' { "sort": [ "_doc" ] } ' ````
ok,再补充下再java api里面如何全量读取es索引数据的方法:
```` ` //指定一个index和type SearchRequestBuilder search = client.prepareSearch("active2018").setTypes("active"); //使用原生排序优化性能 search.addSort("_doc", SortOrder.ASC); //设置每批读取的数据量 search.setSize(100); //默认是查询所有 search.setQuery(QueryBuilders.queryStringQuery("*:*")); //设置 search context 维护1分钟的有效期 search.setScroll(TimeValue.timeValueMinutes(1)); //获得首次的查询结果 SearchResponse scrollResp=search.get(); //打印命中数量 System.out.println("命中总数量:"+scrollResp.getHits().getTotalHits()); //打印计数 int count=1; do { System.out.println("第"+count+"次打印数据:"); //读取结果集数据 for (SearchHit hit : scrollResp.getHits().getHits()) { System.out.println(hit.getSource()) ; } count++; //将scorllId循环传递 scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(TimeValue.timeValueMinutes(1)).execute().actionGet(); //当searchHits的数组为空的时候结束循环,至此数据全部读取完毕 } while(scrollResp.getHits().getHits().length != 0); ````
### (三)删除无用的scroll
上文提到scroll请求时会维护一个search context快照集,这是如何做到的? 通过前面的几篇文章(点底部菜单栏可以看到),我们知道es在写入数据时,会在内存中不断的生成segment,然后有一个merge线程,会不断的合并小segment到更大的segment里面,然后再删除旧的segment,来减少es对系统资源的占用, 尤其是文件句柄,那么维护一个时间段内的索引快照,则意味着这段时间内的所有segment不能被合并,否则就破坏了快照的静态性,这样以来暂时不能被合并的小segment会占系统大量的文件句柄和系统资源,所以scroll的方式一定是离线使用的而不是提供给近实时使用的。
我们需要养成一个好习惯,当我们用完之后应该手动清除scroll,虽然search context超时也会自动清除。
es中提供了可以查看当前系统中有多少个open search context的api命令:
```` curl -XGET localhost:9200/_nodes/stats/indices/search?pretty ````
下面看下删除scrollId的方式
(1)删除一个scrollId
```` DELETE /_search/scroll { "scroll_id" : "UQlNsdDcwakFMNjU1QQ==" } ````
(2)删除多个scrollId
```` DELETE /_search/scroll { "scroll_id" : [ "aNmRMaUhiQlZkMWFB==", "qNmRMaUhiQlZkMWFB==" ] } ````
(3)删除所有的scrollId
```` DELETE /_search/scroll/_all ````
(4)search lite api的删除多个scrollId用法
```` DELETE /_search/scroll/aNmRMaUhiQlZkMWFB==,qNmRMaUhiQlZkMWFB== ````
上面的所有的功能在es2.3.4的版本中已经验证过,此外在es5.x之后的版本中,还增加了一个分片读取索引的功能,通过分片支持并行的读取方式,来提高导出效率:
一个例子如下:
```` 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": { "match" : { "title" : "elasticsearch" } } } ````
注意上面的slice参数,里面id字段代表当前读取的按个分片的数据,max参数代表我们将整个索引数据切分成分片的个数,默认的分片算法:
```` slice(doc) = floorMod(hashCode(doc._uid), max) ````
从上面能看到是基于uid字段的hashCode与分片的最大个数求模得出来的,注意floorMod方法与%求模在都是正整数的情况下结果是一样的。
slice字段还可以加入自定义的字段参与分片,比如基于日期字段:
````
"slice": {
"field": "date",
"id": 0,
"max": 10
}
````
参与分片的字段必须是数值字段并需要开启doc value,另外设置的max数量最好不要超过shard的个数,否则查询性能会下降,默认es对每个索引限制的最大分片量是1024,不过在setting里面通过设置index.max_slices_per_scroll参数改变。
### (四)总结
本篇文章介绍了如何优雅的全量读取es的索引数据以及它的一些原理和注意事项,了解这些有助于我们在日常工作中更好的使用es,从而提升我们对es的认知。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
发表评论
-
复盘一个Elasticsearch排序问题的剖析
2019-07-15 21:12 1162最近线上的es查询的 ... -
elasticsearch里面bulk的用法
2018-04-09 20:23 1417上篇文章介绍了在es里 ... -
elasticsearch里面的关于批量读取mget的用法
2018-04-04 16:01 1832es的api除了提供了基本 ... -
elasticsearch的查询流程分析
2018-04-02 20:29 1326我们都知道es是一个分 ... -
如何在elasticsearch里面使用深度分页功能
2018-03-28 18:13 2018前面的文章提到过es默认的from+size的分页方式返回的结 ... -
如何在Elasticsearch里面使用索引别名
2018-03-27 20:37 1678在elasticsearch里面给index起一个alias ... -
关于elaticsearch中更新数据的几种方式
2018-03-21 19:00 964作为一个成熟的框架, ... -
Elasticsearch里面的segment合并
2018-03-20 17:50 2090通过前面的文章,我 ... -
Elasticsearch如何保证数据不丢失?
2018-03-19 20:52 2137上篇文章提到过,在elasticsearch和磁盘之间还有一层 ... -
为什么说Elasticsearch搜索是近实时的?
2018-03-16 19:41 9449通过前面两篇文章的介绍,我们大概已经知道了 Elasticse ... -
Elasticsearch如何动态维护一个不可变的倒排索引
2018-03-15 21:34 1131上一篇文章中介绍了Elasticsearch中是如何搜索文本 ... -
Elasticsearch如何检索数据
2018-03-14 20:11 1061我们都知道Elasticsearch是一个全文检索引擎,那么它 ... -
如何备份ElasticSearch索引数据到HDFS上
2018-02-09 18:19 2418在ElasticSearch里面备份策略已经比较成熟了 ... -
Elasticsearch5.6.4集群搭建
2018-02-07 20:13 1338本次搭建的是一个三节点的集群 (一)es的安装 (1)下 ... -
如何使log4j生成json格式的log
2017-09-15 17:44 3815使用java开发项目时,log日志一般都是应用程序必不可少的一 ... -
理解elasticsearch的parent-child关系
2017-09-04 18:43 2841前面文章介绍了,在es里面的几种数据组织关系,包括array ... -
简述ElasticSearch里面复杂关系数据的存储方式
2017-08-18 20:10 2414在传统的数据库里面,对数据关系描述无外乎三种,一对一,一对多和 ... -
使用Java Rest Client操作Elasticsearch
2017-08-09 19:42 2268Elasticsearch作为一个成熟的开源框架,对主流的多种 ... -
ElasticSearch里面的偏好查询
2017-06-22 17:17 1301在es查询的时候我们可 ... -
ElasticSearch里面的路由功能介绍
2017-06-21 18:17 2246在ElaticSearch里面,路由 ...
相关推荐
Elasticsearch(ES)是一种流行的开源全文搜索引擎,它基于Lucene库构建,被广泛用于大数据分析、日志聚合、实时搜索和索引等场景。官方提供的测试数据集是检验Elasticsearch功能、性能和稳定性的关键资源,可以帮助...
Elasticsearch(ES)是一种基于Lucene的分布式、RESTful搜索和分析引擎,广泛用于大数据的实时分析和检索。在本讲座中,我们将深入探讨Elasticsearch中的索引概念及其重要性。 首先,让我们理解一下ES中的“索引”...
在本项目实战中,我们将探讨如何使用Java编程语言,结合Spark和Hive,将Hive中的数据高效地导入到ElasticSearch(ES)中,并利用ES的别名机制实现数据更新的平滑过渡。以下是对这个流程的详细解析: 1. **Hive数据...
**Elasticsearch(ES)** 是一个开源的全文搜索引擎,基于Lucene构建,设计用于分布式、可扩展的数据存储和搜索。在这个"Elasticsearch Demo"项目中,我们将学习如何将Word文档的内容读取并写入Elasticsearch,以及...
通过使用Spring Data Elasticsearch,我们可以方便地实现Elasticsearch的CRUD(创建、读取、更新和删除)操作。 1. **单个的增删改查**: 在Spring Boot应用中,我们可以通过定义Repository接口并继承`...
本文将深入探讨如何利用ArcGIS桌面工具将矢量数据(如.shp文件)导入到Elasticsearch(ES)中,以便进行高效的数据存储、检索和分析。 首先,ArcGIS桌面软件提供了丰富的地理数据处理功能,其中包括支持多种矢量...
Go程序将Kafka中的数据写入Elasticsearch,这需要对Elasticsearch的API有深入理解,包括索引管理、文档操作(如索引、更新和删除)以及批量操作。 5. **数据序列化与反序列化**:在从Kafka消费消息并将其写入...
lasticsearch整合分词、创建索引、搜索例子,elasticsearch版本为1.0,索引数据从数据表中动态读取生成,有关键字高亮效果,查询分页 1 在dababase目录中导致相关的数据库文件,修改DBCOperation java文件数据库连接...
Elasticsearch 中索引(Index)的概念是非常重要的,它是 Elasticsearch 存储数据的基本单元。索引是一个具有类似特性的文档的集合,类比传统的关系型数据库领域来说,索引相当于 SQL 中的一个数据库,或者一个数据...
本文将详细介绍如何使用Python来实现MongoDB数据到ElasticSearch的同步,并探讨全量同步、增量同步和实时同步的实现方法,以及如何处理中间数据。 **Python与数据库交互** Python作为一种强大且易用的编程语言,...
在医疗数据分析中,Elasticsearch可以快速地索引和检索大量的患者信息、疾病诊断、药物信息、临床试验数据等,有助于提升医疗研究和决策效率。 XML是一种结构化数据格式,常用于存储复杂的数据结构。医疗数据往往...
在深入理解Elasticsearch(简称ES)的索引原理前,我们需要先明白基本概念。ES是一种分布式全文搜索引擎,它将数据存储在索引中,这些索引类似于关系型数据库中的数据库,但具备更高的可扩展性和实时性。索引可以...
Elasticsearch是一个功能强大且灵活的搜索引擎,需要深入理解其架构、数据存储、读写流程、节点类型、索引管理、别名、快照、分词器和性能优化等方面的知识点,以便更好地使用和运维Elasticsearch。
2. **索引与文档**:学习 Elasticsearch 中的索引概念,理解如何创建、删除和操作索引,以及文档的 CRUD(创建、读取、更新、删除)操作。 3. **查询与过滤**:掌握 Elasticsearch 的查询语法,包括匹配查询、范围...
2. **启动数据流**: 启动JDBC River后,Elasticsearch会定期或实时地从MySQL中读取数据,并将其索引到指定的Elasticsearch索引中。用户可以根据需求设置同步频率,例如定时任务或实时监听。 3. **数据映射与转换**:...
**Elasticsearch(ES)是当今最流行的全文搜索引擎之一,尤其在大数据分析和实时搜索领域应用广泛。本文将深入探讨如何使用Elasticsearch处理唐诗宋词30万+的数据集,包括数据结构映射(mapping)、数据导入以及索引...
文件的描述部分指出了文档将指导如何在CentOS7下安装Elasticsearch 7.4版本,并介绍如何在SpringBoot版本2.1.8.RELEASE中集成Elasticsearch 7.4版本,实现创建和删除索引,以及数据的输入操作。这里的索引是Elastic...
非结构化数据搜索使用倒排索引,例如ElasticSearch。 在搜索实战中,我们将学习如何使用ElasticSearch实现搜索引擎,如何使用ElasticSearch实现数据分析等。同时,我们还将学习ElasticSearch的配置、管理和优化等。...
在`es服务配置非数据性结构.txt`中,可能包含了Elasticsearch集群的配置细节,如节点设置、索引模板、映射配置等。而`sprintboot-elasticsearch`可能是Spring Boot项目中的相关代码示例,包含了上述步骤的实现。 总...