Массовое обновление по запросу в Elastic Search?

Я знаю, что Elastic Search в настоящее время не поддерживает массовое обновление по запросу из-за Lucene, но есть ли альтернативы, которые не включают установку расширения ElasticSearch?

Например, есть ли обходные пути для выполнения:

UPDATE users SET temp = 1 WHERE temp = 0;

Использование метода навалом? Или какой-то другой метод, о котором я не знаю?

Я новичок в Elastic Search как объект, поэтому я не знаю все подробности, но я много читал о его способности обновлять по одному, но это заняло бы слишком много времени с сотнями тысяч строк ,

Просто ищу кого-то, чтобы указать мне правильное направление.

2

Решение

В ответ на ответ datashovel вы должны использовать Elasticsearch API прокрутки получить нужные документы, а затем с помощью массового обновления (или нет) обновить документы.

Предполагая, что ваш индекс users и doc_type это user это было бы что-то вроде:

curl -XGET 'localhost:9200/users/user/_search?scroll=1m' -d '
{
"constant_score": {
"filter" : {
"term" : {
"temp" : 1
}
}
}
}'

Который будет возвращать scroll_id (что-то вроде c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1) который затем следует использовать для перебора результатов, выполнив:

curl -XGET  'localhost:9200/_search/scroll?scroll=1m' \
-d 'c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1'

Пока нет никаких хитов.

Во время итерации вы должны создать список для массового обновления, содержащий все элементы, возвращаемые при прокрутке.

{ "update" : {"_id" : "1", "_type" : "user", "_index" : "users"} }
{ "doc" : {"temp" : 0} }
{ "update" : {"_id" : "2", "_type" : "user", "_index" : "users"} }
{ "doc" : {"temp" : 0} }
{ "update" : {"_id" : "3", "_type" : "user", "_index" : "users"} }
{ "doc" : {"temp" : 0} }

(Вы можете увидеть более подробную информацию о том, как сделать это на массовые API-документы)

Я не знаю PHP, но API-интерфейс Elasticsearch PHP эластическая ткань имеет некоторые вспомогательные функции для прокрутки а также насыпной.

2

Другие решения

Я думаю, это то, что вы ищете:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html

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

Вот несколько полезных примеров этого:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-update.html

0

update_by_query был добавлен вasticsearch в версии 2.3.

API обновления по запросу является новым и все еще должен рассматриваться
экспериментальный. API может измениться способами, которые не являются обратными
совместимы.

https://www.elastic.co/guide/en/elasticsearch/reference/2.3/docs-update-by-query.html

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

UPDATE users SET temp = 1 WHERE temp = 0;

==>

{
"query": {
"term": {
"temp": 0
}
},
"script": {
"inline": "ctx._source.temp = 1"}
}

Примечание. Чтобы эта встроенная версия сценария работала, вам нужно включить встроенные сценарии:

script.inline: true
script.indexed: true
script.disable_dynamic: false
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector