Elasticsearch Java api - 使用bulkProcessor对文档进行部分更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch Java api - 使用bulkProcessor对文档进行部分更新相关的知识,希望对你有一定的参考价值。

我正在使用Elasticsearch Java api的BulkProcessor在索引中插入/更新/删除文档。以下方法适用于插入和删除

bulkProcessor.add(indexRequest(index).type(type).id(id).source(document))
bulkProcessor.add(deleteRequest(index).type(type).id(id));

可以使用indexRequest来更新索引中的部分文档。比如在elasticsearch索引中,我有一个文档

{
  "_id": "abcdefghijk",
  "id": "1",
  "title": "Harry Potter",
  "description": "Description for Harry Potter",
  "price": 10,
  "category": "Book"
}  

是否有可能只更新文档中的price属性,比如我想使用{"price":15}或api中的任何其他方法将价格更改为indexRequest

答案

以下代码将解决问题。

   final BulkRequestBuilder bulkRequest = esClient.prepareBulk();

   //start loop for multiple products

   final XContentBuilder contentBuilder = XContentFactory.jsonBuilder();
    try {

      contentBuilder.startObject();
      contentBuilder.field("price", 20);
      contentBuilder.endObject();

    } catch (final IOException ex) {
      ex.printStackTrace();
    }
  bulkRequest.add(esClient.prepareUpdate(index, type,_id).setDetectNoop(false)
          .setDoc(contentBuilder));
    //end loop

    BulkResponse bulkResponse = bulkRequest.execute().actionGet();
另一答案
bulkProcessor.add(new UpdateRequest(indexName, type, docId).doc(document).upsert(document));

如果文档id不存在,则upsert元素的内容将用于索引新文档,否则,如果已存在,则用于更新文档的doc元素的内容。

以上是关于Elasticsearch Java api - 使用bulkProcessor对文档进行部分更新的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch Java API 很全的整理

Elasticsearch Java API - 客户端连接

java api操作elasticsearch

Elasticsearch Java API简要总汇

第08章 ElasticSearch Java API

elasticsearch java操作 api