Elasticsearch, как поддерживать транзакции с участием нескольких документов - PullRequest
0 голосов
/ 28 июня 2018

я использую эластичный поиск и денормализуемые данные, например

PUT /my_index/user/1
{
"name": "John Smith",
"email": "john@smith.com",
"dob": "1970/10/24"
}

PUT /my_index/blogpost/2
{
"title": "Relationships",
"body": "It's complicated...",
"user": {
"id": 1,
"name": "John Smith"
}
}

но проблема в том, что Elasticsearch не поддерживает ACID транзакции. Изменения в отдельных документах являются ACIDic, но не изменениями, затрагивающими несколько документов. Если я хочу изменить имя пользователя / my_index / user / 1 и / my_index / blogpost / 2 за одну транзакцию, если при одной ошибке произойдет откат, как это сделать?

1 Ответ

0 голосов
/ 28 июня 2018

В ES нет транзакций и никогда не будет согласно внутренним источникам.

Лучший способ добиться того, чего вы хотите, - это сделать ваши обновления массовыми , а затем проверить ответы каждого отдельного ответа.

POST _bulk
{"index": {"_index": "my_index", "_type": "user", "_id": "1"}}
{ "name": "John Smith", "email": "john@smith.com", "dob": "1970/10/24" }
{"index": {"_index": "my_index", "_type": "blogpost", "_id": "2"}}
{ "title": "Relationships", "body": "It's complicated...", "user": { "id": 1, "name": "John Smith" }}

Когда ваш клиент получает ответы, он должен проверить массив items и убедиться, что каждый элемент status равен 200 (обновлен) или 201 (создан). Если это так, то ваша массовая «транзакция» была правильно зафиксирована, если нет, то все со статусом 200 или 201 было зафиксировано, иначе фиксация не удалась.

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