es的api除了提供了基本的curd操作外,还有两个针对批量的操作分别是:
1,批量的读取操作(mget)
2,批量的写入操作(bulk)
本篇文章先介绍mget的用法
Multi Get api 简称(mget)它允许我们一次get大量的document,与get单条数据的api get方法类似,mget查询是基于index,type(可选),id三个条件进行的,比如我们可以一次mget 50条数据,这50条数据可以是在50个不同index中,并且每一个get都可以单独指定它的路由查询信息,或者返回的字段内容。
mget可以批量的根据index,type,id三个字段来获取一批数据,它不能用来查询,最少得需要知道index 和 id两个字段的值,才能进行get,这一点与query是不一样的。
用法如下:
mget可以有三种请求头
(1)不指定index
````
GET /_mget
{
"docs" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1"
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2"
}
]
}
````
(2)指定index
````
GET /test/_mget
{
"docs" : [
{
"_type" : "_doc",
"_id" : "1"
},
{
"_type" : "_doc",
"_id" : "2"
}
]
}
````
(3)指定index和type
````
GET /test/type/_mget
{
"docs" : [
{
"_id" : "1"
},
{
"_id" : "2"
}
]
}
简写方式
GET /test/type/_mget
{
"ids" : ["1", "2"]
}
````
此外,还可以单独的设置对返回的数据(source)进行过滤操作,默认情况下如果这条数据被store了,那么它会返回整个document。
几种过滤的方式:
使用source过滤
````
GET /_mget
{
"docs" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_source" : false
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2",
"_source" : ["field3", "field4"]
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "3",
"_source" : {
"include": ["user"],
"exclude": ["user.location"]
}
}
]
}
````
使用fields过滤:
````
GET /_mget
{
"docs" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"stored_fields" : ["field1", "field2"]
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2",
"stored_fields" : ["field3", "field4"]
}
]
}
````
source和fields的主要区别在于,source默认将整个json存在一起,在读取时候只需要加载一次然后再解析出来需要的字段,而store字段则是每个字段单独的存储,所以大部分时候推荐使用source字段,虽然会多占一些存储空间,但在读取字段数比较多的情况下,source的性能是比store字段要更好的,但是如果你disable了source字段,则意味着:
(1)你不能够高亮文本(不推荐在服务端做高亮,推荐客户端做)
(2)你不能reindex索引
(3)你不能做partial update
所以综合考虑,推荐还是使用source字段
在get的时候,还可以使用路由字段,如下:
````
GET /_mget?routing=key1
{
"docs" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"routing" : "key2"
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2"
}
]
}
````
最后在看下在java api里面如何使用:
````
//构建一个mget的查询
MultiGetRequestBuilder multi_get= client.prepareMultiGet();
//添加两条get数据
multi_get.add("a_active","active","1");
multi_get.add("b_active","active","2","3");
//获取响应
MultiGetResponse mgr= multi_get.get();
//循环读取
for (MultiGetItemResponse itemResponse : mgr) {
GetResponse response = itemResponse.getResponse();
//如果存在则打印响应消息
if (response.isExists()) {
String json = response.getSourceAsString();
System.out.println(" source data: "+json);
}
}
````
总结:
本文介绍了es里面的批量读取数据的方法mget,这个方法在日常开发中的使用频度并不是很高,但是在特定场景下会拥有较高的效率,比如上篇文章介绍的es的分布式查询的原理的时候,在第一阶段query从每个shard上查询本地的page数据,然后返回到coordinating节点上,并重新进行全局排序再取指定分页的n条数据,接着到了第二阶段fetch,要把这批数据的内容读取出来返回给client,这个时候就是mget发力的时候,通过id组装成一个mget请求,然后发送到每个shard里面获取结果数据,最终组装后在返回给client,这样一来比单条get的效率要高很多,另外对索引的写入也是如此,下篇文章我们会介绍批量写入bulk的用法
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
在`bulkSaveToEs`方法中,我们使用Elasticsearch的Bulk API进行批量保存,这能显著提高插入效率。`parseLog`方法根据实际日志格式解析并转换日志数据。 为了实现“百万日志秒处理”的目标,我们需要注意优化以下几...
docker实现elasticsearch批量dump导出导入,实现es批量导入导出
**Elasticsearch(ES)** 是一个开源的全文搜索引擎,基于Lucene构建,设计用于分布式、可扩展的数据存储和搜索。在这个"Elasticsearch Demo"项目中,我们将学习如何将Word文档的内容读取并写入Elasticsearch,以及...
消费kafka数据,然后批量导入到Elasticsearch,本例子使用的kafka版本0.10,es版本是6.4,使用bulk方式批量导入到es中,也可以一条一条的导入,不过比较慢。 <groupId>org.elasticsearch <artifactId>elastic...
Java做客户端对Elasticsearch服务的增删改查及批量修改操作,代码简洁易懂,思路清晰有注释.详情参考https://blog.csdn.net/linhaiyun_ytdx/article/category/7042758
用于批量启动elasticsearch、logstash、kibana的批处理脚本
Linux环境下使用sqlplus工具将oracle中的数据导入到elasticsearch中。只需要在es_bulk_tool.properties配置sql即可实现数据的批量导入。在elasticsearch6中测试通过。shell脚本需要使用sqlplus。
Spring Batch框架使用ItemReader分页读取数据,ItemWriter批量写数据,但缺乏Elasticsearch的ItemWriter和ItemReader,故而需要自定义ElasticsearchItemWriter和ElasticsearchItemReader用于批量导入。 Spring ...
Elasticsearch(简称ES)是一款强大的开源搜索引擎,广泛应用于数据检索、分析和管理。作为分布式、RESTful风格的搜索和数据分析引擎,Elasticsearch能够提供实时、高可用性以及可扩展的搜索功能。在进行日常的数据...
以上就是关于"Go-Golang程序从一组kafka主题中读取记录并将它们写入elasticsearch集群"的详细知识点,涵盖了从基础的Go编程到具体的Kafka和Elasticsearch操作,再到并发处理和错误管理等多个层面。通过这样的项目,...
(狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战),包含了小狂神讲的东西,特别适合新手学习,笔记保存下来可以多看看。好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个...
在本项目实战中,我们将探讨如何使用Java编程语言,结合Spark和Hive,将Hive中的数据高效地导入到ElasticSearch(ES)中,并利用ES的别名机制实现数据更新的平滑过渡。以下是对这个流程的详细解析: 1. **Hive数据...
es-head 插件可以在谷歌浏览器中使用,以下是使用方法: 1.下载解压 es-head 插件。你可以从相关网站下载 es-head 插件的压缩包,然后解压。 2.将解压后的插件文件放入 Chrome 扩展程序目录。可以参考谷歌浏览器右...
4. **使用`curl`命令**:在命令行中,使用`curl`发送POST请求到ElasticSearch的 `_bulk` API,这个API专门用于批量操作。 ```bash curl -X POST "localhost:9200/your_index_name/_bulk?pretty" -H 'Content-Type...
使用Multi-Elasticsearch-Head,管理员或开发者可以轻松地查看和对比不同集群的状态、性能指标以及数据分布,这对于分布式系统监控和故障排查特别有用。它通常提供了一种直观的方式来查看索引结构、执行查询语句、...
Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,...
适用于7.17.1系列,例如Elasticsearch的7.17.12版本。 elasticsearch-analysis-ik 是一个常用的中文分词器,在 Elasticsearch 中广泛应用于中文文本的分析和搜索。下面是 elasticsearch-analysis-ik 分词器的几个...
在.NET Core开发中,Elasticsearch已经成为一种广泛使用的全文搜索引擎,它提供了高度可扩展性和实时分析功能。这个名为"基于.netcore搜索封装ElasticSearch.zip"的压缩包,显然包含了一个针对.NET Core平台的...
根据提供的文件信息,我们可以推断出本篇文章将围绕Elasticsearch 6.2.2版本进行详细介绍,包括其下载方式、主要功能特性以及在实际应用中的常见用途。 ### Elasticsearch简介 Elasticsearch是一款基于Lucene的...
KETTLE操作ElasticSearch ,Kettle是一款开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。