2015-09-01 3 views
1

Я пытаюсь обновить существующий индекс массово, используя массовый API, поэтому существуют некоторые записи, которые необходимо обновить, а некоторые новые, которые необходимо индексировать, так как их там нет. Я использовал следующий кусок кодаElasticearch java bulk upsert exception

BulkRequestBuilder bulkRequestBuilder = client.prepareBulk(); 
bulkRequestBuilder.add(client.prepareUpdate(InvokeMain.indexName, type, docId).setUpsert(finalMap)); 

Однако, с этим, я получаю следующее исключение

org.elasticsearch.action.ActionRequestValidationException: Validation  
Failed: script or doc is missing; 

Я предполагаю, что новые записи/новый docIds, где она выходит из строя. Любая идея, как достичь upsert (обновление, если существует, вставить, если нет) навалом?

+0

Можете ли вы показать, как 'finalMap' выглядит? Можете ли вы попробовать вместо 'prepareIndex'? – Val

+1

Это карта имени столбца elasticsearch, а значение - это объект, который может представлять собой карту, строку или список или что-то еще. Map . Я использую то же самое для создания индекса, отлично работает. Даже обновление существующих записей отлично работает (изменение вышеприведенного фрагмента на «setDoc (finalMap)» вместо setUpsert.) –

+0

Также, prepareIndex, который я использую для создания индекса, существующие записи не обновляются таким образом. Поведение неустойчиво. Некоторые записи меняются, если я даю одинаковый документ во время индексирования, а некоторые нет. Кроме того, prepareIndex не предлагает upsert. –

ответ

0

При использовании upsert (т.е. setUpsert), ваши finalMap потребности быть немного отличается, как described in the official docs, а именно она должна содержать doc (ваш случай) или script (отсюда ошибка проверки о том, что script или doc отсутствует):

... 
Map<String, Object> docMap = ... your current map containing the fields...; 
Map<String, Object> finalMap = new HashMap<String, Object>(); 
finalMap.put("doc", docMap); 
... 
+0

Как работает тот же код при создании индекса? FinalMap - это не что иное, как источник документа. Не все его поля индексируются. Когда я создаю индекс, используя prepareIndex, я использую тот же фрагмент кода, где у меня есть prepareIndex (indexname, type, docId) и finalMap в качестве источника. У finalMap нет самого документа docId, поскольку мне это не нужно в источнике документа. И он также работает для обновления. –

+0

Это работает для обновления: bulkRequestBuilder.add (client.prepareUpdate (InvokeMain.indexName, type, docId) .setDoc (finalMap)). Как тогда? –

+0

Поскольку вы используете 'setUpsert' в своем коде выше, все, о чем я говорю, это то, что вы не можете передавать карту своего документа напрямую, но вам нужно передать его в качестве подкарты к ключу' doc'. – Val

2
BulkRequestBuilder bulkRequestBuilder = client.prepareBulk(); 
bulkRequestBuilder.add(client.prepareUpdate(InvokeMain.indexName, type, docId).setDoc(finalMap).setUpsert(finalMap)); 
Смежные вопросы