美文网首页
ElasticSerach批量查询

ElasticSerach批量查询

作者: jackLee | 来源:发表于2016-11-09 15:31 被阅读4492次

ElasticSerach批量查询

ElasticSerach

有时候,我们不仅需要存储和查询数据,还需要对大量数据进行批量查询,这样就能节省网络请求所需的开销,降低查询时间提高查询效率。

Elasticsearch 允许通过一次查询请求执行多个文档的检索,这样可以避免多次请求造成的单独网络开销,相对于一个一个的检索,这样的效率更高。

在我的实践中,将单个查询改为批量查询后,1650条查询的数据优化结果直接由3分多钟到不足一秒钟

Es中的两种批量操作API

  • 检索多个文档 -- mget API
  • 批量增删改查 -- bulk API

在我的实践中,一开始采用的是bulk API进行批量查询,但由于无法解析查询的结果,后改为mget ApI 的批量查询,最终实现了由单条数据查询到批量查询的优化,大大缩短了查询的时间。

  • bulk java 样例代码如下:

<pre>

BulkRequestBuilder bulkRequest = client.prepareBulk();
// either use client#prepare, or use Requests# to directly build index/delete requests
bulkRequest.add(client.prepareIndex("twitter", "tweet", "1")
.setSource(jsonBuilder()
.startObject()
.field("user", "kimchy")
.field("postDate", new Date())
.field("message", "trying out Elasticsearch")
.endObject()
)
);
bulkRequest.add(client.prepareIndex("twitter", "tweet", "2")
.setSource(jsonBuilder()
.startObject()
.field("user", "kimchy")
.field("postDate", new Date())
.field("message", "another post")
.endObject()
)
);
BulkResponse bulkResponse = bulkRequest.execute().actionGet();
if (bulkResponse.hasFailures()) {
// process failures by iterating through each bulk response item
}

</pre>

  • mget API java 样例代码如下:
    <pre>
    MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
    .add("twitter", "tweet", "1")
    .add("twitter", "tweet", "2", "3", "4")
    .add("another", "type", "foo")
    .get();
    for (MultiGetItemResponse itemResponse : multiGetItemResponses) {
    GetResponse response = itemResponse.getResponse();
    if (response.isExists()) {
    String json = response.getSourceAsString();
    }
    }

</pre>


最佳实践

  • 使用mget API实现批量查询的代码如下,经过验证

    <pre>
    <code>
    public static List<UserRole> multiGet(List<String> ids){
    TransportClient client = getTransportClient();
    MultiGetRequestBuilder multiGetRequestBuilder =client.prepareMultiGet();
    List<UserRole> userRole_list = new ArrayList<>();
    int size = ids.size();
    for(int i=0;i<size;i++){
    multiGetRequestBuilder= multiGetRequestBuilder.add("com","jack",ids.get(i));
    }
    MultiGetResponse multiGetItemResponses = multiGetRequestBuilder.get();
    for (MultiGetItemResponse itemResponse : multiGetItemResponses) {
    GetResponse response = itemResponse.getResponse();
    if (response.isExists()) {
    String json = response.getSourceAsString();
    log.info(json);
    userRole_list.add(parseJason(json));
    }
    }
    return userRole_list;
    }

</code>
</pre>


参考文档

关注我哦

关注学习技术

相关文章

网友评论

      本文标题:ElasticSerach批量查询

      本文链接:https://www.haomeiwen.com/subject/saxtpttx.html