Обновление ElasticSearch 1.7 (Spring Data ElasticSearch) по запросу занимает много времени для обновления документов - PullRequest
0 голосов
/ 14 января 2019

Мое приложение позволяет обновлять множественный эластичный поиск documents в одном запросе.

Я использую ElasticSearch BulkRequestBuilder для обновления всех таких документов навалом.

BulkRequestBuilder bulkRequestBuilder = elasticSearchClient.prepareBulk();

documents.forEach(id -> {
                UpdateRequest updateRequest = new UpdateRequestBuilder(elasticSearchClient)
                        .setType("MyDocumentType")
                        .setIndex("MyDocumentIndex")
                        .setId(id)
                        .setDoc("fieldName", "valueToBeUpdated")
                        .request();

                bulkRequestBuilder.add(updateRequest);
            });

//update in bulk
bulkRequestBuilder.get();

Все документы обновляются с valueToBeUpdated, но ElasticSearch внутренне требует времени для обновления всех документов, но вызов bulkRequestBuilder.get() возвращается даже до обновления документов. (Указывает Async характер двигателя ElasticSearch).

Может кто-нибудь предложить, как сделать Sync обновлениями всех документов?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Наконец-то я обнаружил, что основная проблема (может быть по умолчанию) заключается в том, что обновления выполняются с помощью механизма ElasticSearch.

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

например. ElasticSearch GET API Документация гласит, что для получения документа механизм Flexiblesearch делает refresh, чтобы увидеть все предыдущие обновления, если таковые имеются. Это намекает на то, что ASYNC характер упругого поиска вызывает немедленный поиск моих документов, не предоставляя мне обновленные документы.

На данный момент, чтобы продолжить существующее поведение, запустить массовое обновление в SYNC следующим образом.

bulkRequestBuilder.setReplicationType(ReplicationType.SYNC).setRefresh(true).get();
0 голосов
/ 14 января 2019

Обычно проблемы с индексированием / обновлением большого количества данных происходят из segment merging из ES. Один совет от ES - отключить обновление перед индексированием / обновлением большого количества данных.

Вы можете достичь этого обновления индекса refresh_interval до индексации до refresh_interval=-1, и как только все ваши данные будут проиндексированы, верните их в предыдущую конфигурацию индекса.

Tune индексирование скорость

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