Конструктор обновлений дает поздний ответ, когда в Elasticsearch есть несколько версий? - PullRequest
0 голосов
/ 30 мая 2020

Проект: Spring Boot

Я обновляю свой документ elasticsearch следующим образом:

@Override
public Document update(DocumentDTO document) {
    try {
        Document doc = documentMapper.documentDTOToDocument(document);
        Optional<Document> fetchDocument = documentRepository.findById(document.getId());
        if (fetchDocument.isPresent()) {
            fetchDocument.get().setTag(doc.getTag());
            Document result = documentRepository.save(fetchDocument.get());
            final UpdateRequest updateRequest = new UpdateRequest(Constants.INDEX_NAME, Constants.INDEX_TYPE, document.getId().toString());
            updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);
            updateRequest.doc(jsonBuilder().startObject().field("tag", doc.getTag()).endObject());
            UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
            log.info("ES result : "+ updateResponse.status());
            return result;
        }
    } catch (Exception ex) {
        log.info(ex.getMessage());
    }
    return null;
}

С его помощью мой документ обновлен успешно, и версия увеличивается, но когда версия становится 20+.

Для получения данных требуется много времени (около 14se c).

Я все еще не понимаю, как выполняется управление версиями. Как это работает в сценарии обновления и удаления? Во время поиска он обрабатывает всю версию данных и отправляет последнюю? Так ли это?

1 Ответ

0 голосов
/ 30 мая 2020

Elasticsearch внутренне использует Lucene, который использует неизменяемые сегменты для хранения данных. поскольку эти сегменты неизменяемы, каждое обновление в elasticsearch внутренне отмечает удаление старого документа (мягкое удаление) и вставляет новый документ (с новой версией).

Старый документ позже очищается во время процесс объединения фоновых сегментов .

Новый обновленный документ должен быть доступен через 1 секунду ( ссылка по умолчанию sh интервал ), но его можно отключить или изменить, поэтому проверьте этот параметр в своем индексе. Я вижу, что вы используете параметр wait_for в своем коде, удалите его, и вы сможете быстро увидеть обновленный документ, если не изменили интервал обновления по умолчанию.

Примечание : - Здесь операции обновления и удаления работают одинаково, с той лишь разницей, что при операции удаления новый документ не создается, а старый документ помечается как мягкое удаление, а позже при слиянии сегментов удаляется навсегда.

...