Может ли массовый API elasticsearch гарантировать, что документы будут записаны в упорядоченный es?

#elasticsearch

#elasticsearch

Вопрос:

Я проверил официальный документ и документ sy:

Ответ массового API содержит отдельные результаты каждой операции в запросе, возвращаемые в отправленном порядке. Успех или неудача отдельной операции не влияют на другие операции в запросе.

В официальном документе не указано, записаны ли документы в elasticsearch с order, если они имеют один и тот же первичный ключ ‘_id’.

Вот пример. У меня есть 3 документа с одинаковым идентификатором pk = 1, а другое поле отличается. И я создаю 3 UpdateRequest для этих 3 документов. Я добавляю эти документы в BulkRequest с помощью order . Могу ли я после отправки клиенту es гарантировать, что эти документы выполняются в es в том порядке, в котором я добавляю их в массовый запрос?

 // Three docs with same id but different non-pk field value 
Map<String,String> doc1 = new HashMap;
doc1.put("_id","1");
doc1.put("other_column","columnValue1");

Map<String,String> doc2 = new HashMap;
doc1.put("_id","1");
doc1.put("other_column","columnValue2");

Map<String,String> doc3 = new HashMap;
doc1.put("_id","1");
doc1.put("other_column","columnValue3");


//prepare 3 update Request
 UpdateRequest updateRequest1 = new UpdateRequest(index,type,"1").docAsUpsert(true).setDoc(doc1);
 UpdateRequest updateRequest2 = new UpdateRequest(index,type,"1").docAsUpsert(true).setDoc(doc2);
 UpdateRequest updateRequest3 = new UpdateRequest(index,type,"1").docAsUpsert(true).setDoc(doc3);



//add the to bulk request
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(indexRequest1);
bulkRequest.add(indexRequest2);
bulkRequest.add(indexRequest3);

//execute by client
restHighLevelClient.bulk(bulkRequest);

//if doc2 write into elasticsearch failed, doc1 and doc2 may also be executed successfully as the official doc said. Is it right?



  

Однако в документе говорится, что успех или неудача отдельной операции не влияют на другие операции в запросе. В моем случае, если документы в запросе es с тем же pk содержат часть документов об ошибках, а другие документы успешно записываются в es. Очевидно, это означает, что они не записываются в es с order . Верен ли вывод о том, что массовый API клиента es не может обеспечить запись документов в es с помощью order?

Комментарии:

1. Неясно, какой «порядок» вы имеете в виду? Можете ли вы привести пример?

2. @Val Я добавил пример, чтобы объяснить, что я должен спросить. Спасибо за ваш ответ.

3. Просто любопытно: зачем вам индексировать три документа с одинаковым идентификатором?

4. @Val Я внес некоторые изменения в свой вопрос. Представьте, что я синхронизирую данные строки таблицы mysql с elasticsearch с помощью mysql binlog. Я могу получить несколько событий insert binlog с одинаковым идентификатором. Поэтому мне нужно обновить документ соответствующего индекса.

5. Хорошо, запросы на обновление отличаются от запросов на индексацию. Тогда это имеет смысл

Ответ №1:

Если вы вставляете записи, используя только массовый процессор, то во время очистки записи сбрасываются упорядоченным образом в соответствии с меткой времени. Таким образом, документ будет обновлен с использованием последних данных для конкретного идентификатора документа. Допустим, если вы индексируете документ, а затем удаляете его. Таким образом, конечным результатом будет удаление документа.

Но если выполняется нормальная индексация, отличная от массовой, и если один и тот же идентификатор индексируется с использованием как массового, так и обычного API индексации, то порядок не поддерживается. Поскольку очистка может происходить в разное время. Допустим, вы проиндексировали документ с идентификатором 1 с помощью bulk, затем вы удалили идентификатор 1 с помощью обычного api индексирования. Если интервал промывки установлен на 5 секунд для массового использования, может случиться так, что ваш удаленный индекс останется проиндексированным в es.

Комментарии:

1. Как насчет моего примера? Массовый api может потерять часть запросов, которые вызывают беспорядок в моем примере. Я прав?