2015-03-15 3 views
0

Я могу создать следующую строку, сохраненную в объекте Java String с именем updates.Elasticsearch: массовое обновление нескольких документов, сохраненных в Java String?

{ "update":{ "_index":"myindex", "_type":"order", "_id":"1"} } 
{ "doc":{"field1" : "aaa", "field2" : "value2" }} 
{ "update":{ "_index":"myindex", "_type":"order", "_id":"2"} } 
{ "doc":{"field1" : "bbb", "field2" : "value2" }} 
{ "update":{ "_index":"myindex", "_type":"order", "_id":"3"} } 
{ "doc":{"field1" : "ccc", "field2" : "value2" }} 

Теперь я хочу сделать обновление bullk в рамках программы Java:

Client client = getClient(); //TransportClient 

BulkRequestBuilder bulkRequest = client.prepareBulk(); 
//?? how to attach updates variable to bulkRequest? 

BulkResponse bulkResponse = bulkRequest.execute().actionGet(); 

Я не может найти способ, чтобы прикрепить вышеуказанные переменные обновления для bulkRequest перед тем выполнить.

Я заметил, что я могу добавить объект UpdateRequest к bulkRequest, но, кажется, он добавляет только один документ один раз. Как указано выше, у меня есть несколько обновляемых документов в одной строке.

Может кто-нибудь просветить меня на этом? У меня есть ощущение, что я могу сделать что-то неправильно.

Спасибо и приветствую.

+0

вместо синтаксического анализа, создавая строку и пытаясь прикрепить эту строку в виде массива .. вы можете прикрепить к bulkRequest при самостоятельном анализе .. ?? я не думаю, что есть что-то, что вы ищете .. даже если есть .. он делает то же самое внутри ... не думаете? –

+0

karthik. Спасибо за то, – curious1

ответ

3

Следующий код должен работать нормально. Для каждого обновления документа вам необходимо создать отдельный запрос на обновление, как показано ниже, и продолжать добавлять его к массовым запросам. Как только массовые запросы будут готовы, выполните его.

JSONObject obj = new JSONObject(); 
obj.put("field1" , "value1"); 
obj.put("field2" , "value2"); 
UpdateRequest updateRequest = new UpdateRequest(index, indexType, id1).doc(obj.toString()); 
BulkRequestBuilder bulkRequest = client.prepareBulk(); 
bulkRequest.add(updateRequest); 


obj = new JSONObject(); 
obj.put("fieldX" , "value1"); 
obj.put("fieldY" , "value2"); 
updateRequest = new UpdateRequest(index, indexType, id2).doc(obj.toString()); 
bulkRequest = client.prepareBulk(); 
bulkRequest.add(updateRequest); 


bulkRequest.execute().actionGet(); 
+0

Vineeth, «new UpdateRequest (index, indexType, id)», какой документ пытается обновить? Я надеюсь добавить несколько строк документа в один оператор. Не уверен, что Elasticsearch позволяет мне это сделать. – curious1

+0

Обновлено в моем ответе –

+0

Это работает, потому что это то, что я уже делаю. Похоже, что моя первоначальная попытка не поддерживается в Elasticsearch. – curious1

0

Я столкнулся с той же проблемой, когда в моей программе обновляется только один документ. Затем я нашел следующий способ, который работал отлично. Для этого используется пружинный java-клиент. Я также перечислил зависимости, которые я использовал в коде.

import org.elasticsearch.action.update.UpdateRequest; 

import org.elasticsearch.index.query.QueryBuilder; 

import org.springframework.data.elasticsearch.core.query.UpdateQuery; 

import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder; 

private UpdateQuery updateExistingDocument(String Id) { 
    // Add updatedDateTime, CreatedDateTime, CreateBy, UpdatedBy field in existing documents in Elastic Search Engine 
    UpdateRequest updateRequest = new UpdateRequest().doc("UpdatedDateTime", new Date(), "CreatedDateTime", new Date(), "CreatedBy", "admin", "UpdatedBy", "admin"); 

    // Create updateQuery 
    UpdateQuery updateQuery = new UpdateQueryBuilder().withId(Id).withClass(ElasticSearchDocument.class).build(); 
    updateQuery.setUpdateRequest(updateRequest); 

    // Execute update 
    elasticsearchTemplate.update(updateQuery); 
} 
Смежные вопросы