Выполнение «транзакции» в ElasticSerch - PullRequest
0 голосов
/ 11 сентября 2018

Предположим, у меня есть миллион объектов, которые мне нужно сохранить в ElasticSearch.Одно из требований сохранения объектов заключается в том, что его можно искать только после того, как все элементы были сохранены - в противном случае результаты (связанные с количеством и суммой различных свойств сохраненных объектов - например, финансовые расчеты) будутбыть неправым.

Вот код, который мне в настоящее время требуется для сохранения объектов:

from elasticsearch import Elasticsearch, helpers
ACTIONS = []
for item in HISTORY_DATA.values():
    ACTIONS.append({
        "_index": ES_INDEX_NAME,
        "_type": "_doc",
        "_id": item.pop('_id'),
        "_source": item
    })
_ = helpers.bulk(self.es, ACTIONS)

Как я могу сохранить 20 тыс. Объектов одновременно, но «зафиксировать» транзакцию только после того, как все элементы былиспасен?Или, если мне придется сохранить «все сразу», как я это сделаю?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Elasticsearch не имеет транзакций, только действия с одним документом являются атомарными.

Если ваш индекс эластичного поиска должен использоваться только после вставки всех элементов, вы можете использовать этот подход:

  1. Настройте ваше приложение на использование псевдонима индекса .
    (на данный момент псевдоним ни на что не указывает - все в порядке)
  2. Создание индекса (например,index_1) и используйте массовую вставку для добавления всех документов.
    (индекс готов к использованию)
  3. Укажите свой псевдоним индекса на index_1.
    (ваше приложение может использовать index_1)
  4. Если вам нужно добавить новый пакет элементов, создайте новый индекс index_2, вставьте в него все старые и новые документы.Выполните все необходимые проверки, чтобы убедиться, что все в порядке.
    (изменения этого индекса невидимы для вашего приложения)
  5. Укажите свой псевдоним индекса на index_2.
    (это работает как фиксация транзакции, а переключение на старый индекс аналогично откату транзакции)
  6. Удалить index_1.

Повтор точек 4, 5,6 в любое время вам нужно добавить новый комплект документов.Я использую этот подход на нескольких сайтах, каждый из которых имеет от 10 до 50 тыс. Документов, добавляемых в индекс при каждом обновлении.

0 голосов
/ 11 сентября 2018

Нет такой вещи, как транзакция в Elasticsearch.

Для получения дополнительной информации см. Здесь:

https://www.elastic.co/guide/en/elasticsearch/guide/current/concurrency-solutions.html

В частности:

Проблема в том, что Elasticsearch не поддерживает ACID-транзакции.Изменения отдельных документов являются ACIDic, но не изменениями, затрагивающими несколько документов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...