2013-06-19 4 views
5

Я пытаюсь обновить несколько значений в индексе с помощью Java Api через Elastic Search Script. Но не удалось обновить поля.Как обновить несколько полей, используя скрипт java api elasticsearch

Пример кода: -. ("Ctx._source")

1::

UpdateResponse response = request.setScript("ctx._source").setScriptParams(scriptParams).execute().actionGet(); 
UpdateResponse response = request.setScript("ctx._source.").setScriptParams(scriptParams).execute().actionGet(); 

если я упомянул (точка) в получении illegalArgument Exception и если я не использую точку, не получая никакого исключения, но значения не обновляются в индексе. Может ли кто-нибудь сказать мне, как решить эту проблему.

+0

Что вы видите в сценариях? В вашем скрипте упоминается источник _source, но нет назначения. Вы посмотрели примеры [здесь] (http://www.elasticsearch.org/guide/reference/api/update/)? – javanna

ответ

11

Прежде всего, ваш скрипт (ctx._source) ничего не делает, как уже указывал один из комментаторов. Если вы хотите обновить, скажем, поле «а», то вам необходимо будет такой скрипт:

ctx._source.a = "foobar" 

это будет присвоить строку «Foobar» в поле «а». Однако вы можете сделать больше, чем простое назначение. Проверьте документацию для получения более подробной информации и примеров:

http://www.elasticsearch.org/guide/reference/api/update/

Обновление нескольких полей с одним сценарием также возможно. Вы можете использовать точки с запятой для разделения различных инструкций MVEL. Например:

ctx._source.a = "foo"; ctx._source.b = "bar" 
5

В поиске эласта есть обновленный API Java. Посмотрите следующий код:

client.prepareUpdate("index","typw","1153") 
      .addScriptParam("assignee", assign) 
      .addScriptParam("newobject", responsearray) 
      .setScript("ctx._source.assignee=assignee;ctx._source.responsearray=newobject ").execute().actionGet(); 

Здесь присвоение переменной содержит значение объекта, а переменная массива ответов содержит список данных.

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); 
} 
Смежные вопросы