multiGet API并行地在单个http请求中执行多个get请求。

Multi-Get Request

MultiGetRequest构造函数为空,需要你添加`MultiGetRequest.Item`来配置要获取的内容:

        MultiGetRequest request = new MultiGetRequest();
request.add(new MultiGetRequest.Item(
"index", // Index
"type", // Type
"example_id")); //Document id
//再添加一个
request.add(new MultiGetRequest.Item("index", "type", "another_id"));

可选参数

get API支持的可选参数,multiGet都支持。 您可以在每一项上设置这些大部分可选参数,为什么是大部分,因为有的参数是设置在主请求上,而不是每一项上:

     //禁止获取source,默认为启用
request.add(new MultiGetRequest.Item("index", "type", "example_id")
.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE));

配置source包含指定的字段:

        String[] includes = new String[] {"foo", "*r"};
String[] excludes = Strings.EMPTY_ARRAY;
FetchSourceContext fetchSourceContext =
new FetchSourceContext(true, includes, excludes);
request.add(new MultiGetRequest.Item("index", "type", "example_id")
.fetchSourceContext(fetchSourceContext));

配置source排除指定的字段:

        String[] includes1 = Strings.EMPTY_ARRAY;
String[] excludes1 = new String[] {"foo", "*r"};
FetchSourceContext fetchSourceContext1 =
new FetchSourceContext(true, includes, excludes);
request.add(new MultiGetRequest.Item("index", "type", "example_id")
.fetchSourceContext(fetchSourceContext1));
        //配置获取指定的stored字段,要求字段在mappings中是分开存储的(stored存储的原始字段,未经过分词的)
request.add(new MultiGetRequest.Item("index", "type", "example_id")
.storedFields("foo"));
MultiGetResponse response = client.multiGet(request);
MultiGetItemResponse item = response.getResponses()[0];
//获取foo的stored字段,要求字段和mappings中是分开存储的
String value = item.getResponse().getField("foo").getValue();
       // Routing value
request.add(new MultiGetRequest.Item("index", "type", "with_routing")
.routing("some_routing"));
// Parent value
request.add(new MultiGetRequest.Item("index", "type", "with_parent")
.parent("some_parent"));
request.add(new MultiGetRequest.Item("index", "type", "with_version")
.versionType(VersionType.EXTERNAL)// Version type
.version(10123L));//Version

preference, realtime 和 refresh可以设置在主请求上,而不能设置在每项上

        request.preference("some_preference");//preference值
request.realtime(false);//将realtime标志设置为false(默认为true)
request.refresh(true);//在检索文档之前执行刷新(默认为false)

同步执行

        //构建MultiGetRequest后,您可以用multiGet来同步执行:
MultiGetResponse response1 = client.multiGet(request);

异步执行

异步执行多个get请求需要将MultiGetRequest实例和ActionListener实例传递给异步方法:

client.multiGetAsync(request, listener); //当MultiGetRequest执行完成时,ActionListener将被调用。

异步方法不会阻塞并会立即返回。 一旦请求完成,如果执行成功完成,则使用onResponse方法回调ActionListener,如果失败则使用onFailure方法。

MultiGetResponse的典型监听器如下所示:

        ActionListener<MultiGetResponse> listener = new ActionListener<MultiGetResponse>() {
@Override
public void onResponse(MultiGetResponse response) {
//执行成功完成时调用。 response以参数的形式提供。
} @Override
public void onFailure(Exception e) {
// 在失败的情况下调用。 引发的异常作为参数提供。
}
};

Multi Get Response

返回的MultiGetResponse在getResponses中包含一个MultiGetItemResponse的列表,其顺序与请求的顺序相同。 如果获取成功,MultiGetItemResponse包含GetResponse,如果失败则包含MultiGetResponse.Failure。 成功看起来就像普通的GetResponse。

   MultiGetItemResponse firstItem = response.getResponses()[0];
//assertNull(firstItem.getFailure());//getFailure返回null,由于这没有失败。
GetResponse firstGet = firstItem.getResponse();//getResponse返回GetResponse。
String index = firstItem.getIndex();
String type = firstItem.getType();
String id = firstItem.getId();
if (firstGet.isExists()) {
long version = firstGet.getVersion();
String sourceAsString = firstGet.getSourceAsString();//以字符串形式获取文档
Map<String, Object> sourceAsMap = firstGet.getSourceAsMap();//以Map <String,Object>形式获取文档
byte[] sourceAsBytes = firstGet.getSourceAsBytes();//以字节数组的形式检索文档
} else {
//处理未找到文档的方案。 请注意,虽然返回的响应具有404状态代码,但仍返回有效的GetResponse而不是抛出异常。
//此时此类响应不持有任何源文档,并且其isExists方法返回false。
     }

当其中一个子请求执行不存在的索引时,getFailure将包含异常:

            MultiGetItemResponse missingIndexItem = response.getResponses()[0];
assertNull(missingIndexItem.getResponse());//getResponse 是 null.
//getFailure不为null,并且包含Exception,该异常实际上是一个ElasticsearchException
Exception e = missingIndexItem.getFailure().getFailure();
ElasticsearchException ee = (ElasticsearchException) e;
// TODO status is broken! fix in a followup
//此时它的状态为NOT_FOUND。 要不是这是一个multi get,它其实就是一个HTTP 404。
assertEquals(RestStatus.NOT_FOUND, ee.status());
//getMessage解释了实际原因,没有这样的索引。
assertThat(e.getMessage(),containsString("reason=no such index"));

如果请求特定文档版本,并且现有文档具有不同的版本号,则会引发版本冲突:

     MultiGetRequest request2 = new MultiGetRequest();
request2.add(new MultiGetRequest.Item("index", "type", "example_id")
.version(1000L));
MultiGetResponse response2 = client.multiGet(request2);
MultiGetItemResponse item2 = response.getResponses()[0];
assertNull(item.getResponse());//getResponse 是 null.
//getFailure不为null,并且包含Exception,该异常实际上是一个ElasticsearchException
Exception e = item.getFailure().getFailure();
ElasticsearchException ee = (ElasticsearchException) e;
// TODO status is broken! fix in a followup
//此时它的状态为NOT_FOUND。 要不是这是一个multi get,它就是一个HTTP 409 。
// assertEquals(RestStatus.CONFLICT, ee.status());
//getMessage解释了实际原因,即版本冲突。
assertThat(e.getMessage(),
containsString("version conflict, current version [1] is "
+ "different than the one provided [1000]"));

官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-document-multi-get.html

Multi-Get API的更多相关文章

  1. elasticsearch6.7 05. Document APIs(8)Multi Get API

    7.Multi Get API(Multi Get API) multi GET API 允许你一次性获取多个文档,你需要指定docs数组,其中包含了所有你需要查询的文档,每个查询结构至少包含索引,类 ...

  2. elasticsearch中常用的API

    elasticsearch中常用的API分类如下: 文档API: 提供对文档的增删改查操作 搜索API: 提供对文档进行某个字段的查询 索引API: 提供对索引进行操作,查看索引信息等 查看API: ...

  3. elasticsearch中的API

    elasticsearch中的API es中的API按照大类分为下面几种: 文档API: 提供对文档的增删改查操作 搜索API: 提供对文档进行某个字段的查询 索引API: 提供对索引进行操作 查看A ...

  4. elasticsearch基本操作之--java基本操作 api

    /** * 系统环境: vm12 下的centos 7.2 * 当前安装版本: elasticsearch-2.4.0.tar.gz */ 默认进行了elasticsearch安装和ik安装, 超时配 ...

  5. ES系列四、ES6.3常用api之文档类api

    1.Index API: 创建并建立索引 PUT twitter/tweet/ { "user" : "kimchy", "post_date&quo ...

  6. elasticsearch6.7 05. Document APIs(2)Index API

    Single document APIs Index API Get API Delete API Update API Multi-document APIs Multi Get API Bulk ...

  7. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十)ES6.2.2 Client API

    scala版本2.11 java版本1.8 spark版本2.2.1 es版本6.2.2 hadoop版本2.9.0 elasticsearch节点列表: 192.168.0.120 192.168. ...

  8. ElasticSearch Document API

    删除索引库 可以看到id为1的索引库不见了 这里要修改下配置文件 slave1,slave2也做同样的操作,在这里就不多赘述了. 这个时候记得要重启elasticseach才能生效,怎么重启这里就不多 ...

  9. Elastic Stack 笔记(八)Elasticsearch5.6 Java API

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 底层依赖于 Lucene 库,而 Lucene 库完全是 Java 编写的,前面的文章都是发送的 RESTf ...

  10. http://elasticsearch-py.readthedocs.io/en/master/api.html

    API Documentation All the API calls map the raw REST api as closely as possible, including the disti ...

随机推荐

  1. JAVA学习笔记(3)—— 抽象类与接口

    1. Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类 ...

  2. Linux initramfs说明

    1.前言 最近在尝试对手头的开发板进行移植,此处记录initramfs挂载的基本流程,记录一下,以备后查.分析时是基于linux3.4.2 2. rootfs的挂载 start_kernel-> ...

  3. Python——类的封装

    class Gun: def __init__(self, model): # 1. 枪的型号 self.model = model # 2. 子弹的数量 self.bullet_count = 0 ...

  4. 微软推荐的.net命名规范

    许多命名约定都与标识符的大小写有关.值得注意的是,公共语言运行库 (CLR) 支持区分大小写和不区分大小写的语言.本主题中描述的大小写约定可帮助开发人员理解和使用库. 大小写样式 下列术语描述了标识符 ...

  5. Linux下查看CPU型号,内存大小,硬盘空间,进程等的命令(详解)

    转自:http://www.jb51.net/article/97157.htm 1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physic ...

  6. 帆软报表(finereport)间格运算常用公式

    1.1在C3(占比)单元格中直接使用占比公式:=PROPORTION(B3):占比:当前值占总值的比例 1.2 计组内占比注:C2[!0]{A2=$A2},表示C2扩展出来地区相同的单元格.sum(C ...

  7. 帆软报表(finereport)使用row_number ()进行组内排序

    ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号.在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也 ...

  8. go实现选择排序

    package main import "fmt" func SelectSort(data []int) { length := len(data) for i := 0; i ...

  9. selenium启动报错“ incorrect JSON status mapping for 'unknown error' (500 expected)”

    前面讲了工程启动报错“selenium启动报错Unable to read VR Path Registry from C:\Users\clinva\AppData\Local\openvr\ope ...

  10. nginx windows could not build server_names_hash, you should increase server_names_hash_bucket_size: 32

    nginx 为windows版本 在配置文件nginx.conf 的http{}段增加一行配置 server_names_hash_bucket_size 64; 如果64不够可以设128等