Я знаю, что Elastic Search в настоящее время не поддерживает массовое обновление по запросу из-за Lucene, но есть ли альтернативы, которые не включают установку расширения ElasticSearch?
Например, есть ли обходные пути для выполнения:
UPDATE users SET temp = 1 WHERE temp = 0;
Использование метода навалом? Или какой-то другой метод, о котором я не знаю?
Я новичок в Elastic Search как объект, поэтому я не знаю все подробности, но я много читал о его способности обновлять по одному, но это заняло бы слишком много времени с сотнями тысяч строк ,
Просто ищу кого-то, чтобы указать мне правильное направление.
В ответ на ответ 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 эластическая ткань имеет некоторые вспомогательные функции для прокрутки а также насыпной.
Я думаю, это то, что вы ищете:
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
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