2016-06-01 2 views
0

Любая идея, как я могу обновить несколько документов по индексу elasticsearch 1.7? Я видел документацию 2.3, и это возможно с обновлением по запросу api call, но я не могу обновить этот конкретный экземпляр, и я не могу найти эту функцию там.Обновление нескольких документов с помощью elasticsearch 1.7.5

Благодаря

ответ

4

В общем, вы можете обновить несколько документов с Elasticsearch-х Bulk API (ссылаюсь на 1,7. Версии доку).

Здесь вы можете увидеть разницу между нормальным update (через команду curl) и массовым обновлением.

Обычное обновление:

curl -XPOST 'localhost:9200/index1/type1/id1/_update' -d '{ 
    "name" : "updated John" 
} 

Массовое обновление:

POST /_bulk 
{ "update": { "_index": "index1", "_type": "type1", "_id": "id1", "_retry_on_conflict" : 3} } 
{ "doc" : {"name" : "updated John"} } 
{ "update": { "_index": "index1", "_type": "type1", "_id": "id1", "_retry_on_conflict" : 3} } 
{ "doc" : {"name" : "The second update for John"} } 

КСТАТИ: Объемные запросы предпочтительнее, если у вас есть операции на многих документах. вот docu, описывая его подробно.


EDIT: Чтобы обновить некоторые документы, которые соответствуют запросу вы можете использовать ElasticSearch Update By Query Plugin для ES 1.7. Btw: для более новых версий ES эта функция встроена: Update By Query API

Вот пример синтаксиса для плагина:

curl -XPOST 'localhost:9200/index1/_update_by_query' -d ' 
{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "Category": "YourCategoryValueToSearchFor" 
       } 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "script" : "ctx._source.category = \"NewCategoryValue\"; ctx._source.category2 = \"OptionallyUpdateAnotherField\";" 
}' 

Для этого вам дополнительно придется включить скриптов в вашем elasticsearch. yml config:

script.disable_dynamic: false 
script.inline: on 
script.indexed: on 
+0

Хм спасибо. Я обнаружил, что док. Однако предположим, что у меня нормализованный документ, который имеет что-то вроде поля «Категория». И мне нужно обновить категорию для всех соответствующих ей документов. Есть ли способ сделать это напрямую, не запрашивая их, а затем составляя запрос на обновление из результатов? Я говорю о 1.000.000+ документах, поэтому было бы не очень дешево реализовывать в php, например. – overburn

+0

ahh okay. Я обновил свой ответ для вас! – Hansa

+0

спасибо человеку, мне это удалось. – overburn

Смежные вопросы