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

时间:2016-08-21 14:44:41

标签: java elasticsearch lucene elasticsearch-java-api

我正在使用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

2 个答案:

答案 0 :(得分:1)

以下代码将解决问题。

   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();

答案 1 :(得分:0)

bulkProcessor.add(new UpdateRequest(indexName, type, docId).doc(document).upsert(document));

如果文档ID不存在,则将使用upsert元素的内容来索引新文档;否则,将使用upsert元素的内容来更新文档。