Как работает Elastic Search delete_by_query?Что происходит, когда мы вставляем новые данные и извлекаем их при удалении документов? - PullRequest
4 голосов
/ 05 июля 2019

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

Ниже приведены сведения о конфигурации

  • Java: 8
  • Эластичная версия: 7.1.1
  • Добавлены упругие зависимости:

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.1.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>7.1.1</version>
    </dependency>
    

В моем случае ежедневно в индекс добавляется около 10 тыс. Записей dev-answer. Я хочу запустить операцию удаления (это может быть запущено ежедневно, один раз в неделю или один раз в месяц), которая в основном удалит все документы свыше index, если будет выполнено определенное условие. (Который я дам в DeleteByQueryRequest)

Для удаления есть API, как указано в последнем doc , о котором я говорю.

DeleteByQueryRequest request = new DeleteByQueryRequest("source1", "source2");

Читая документацию, я наткнулся на следующие вопросы, которые я не могу понять.

  1. Как в документе: It’s also possible to limit the number of processed documents by setting size. request.setSize(10); Что означает обработанный документ? Будет ли удалено только 10 документов?

  2. Какой размер партии я должен установить? request.setBatchSize(100); производительность зависит от того, сколько документов мы собираемся удалить?

    Должен ли я сначала позвонить на get no of documents, и исходя из этого, следует изменить setBatchSize?

  3. request.setSlices(2); Срезы должны зависеть от того, сколько сердечников в машине-исполнителе или нет от сердечников в упругом кластере?

  4. В документации дан метод setSlices(2), который я не могу найти в классе org.elasticsearch.index.reindex.DeleteByQueryRequest. Что мне здесь не хватает?

  5. Давайте рассмотрим, выполняю ли я этот запрос на удаление в асинхронном режиме, который занимает 0,5-1,0 сек. Между тем, если я выполняю запрос get для этого индекса, это выдаст какое-то исключение? Также в то же время, если я вставлю новый документ и получу его, сможет ли он дать ответ?

1 Ответ

3 голосов
/ 05 июля 2019

1. Как и в документе: также можно ограничить количество обрабатываемых документов, задав размер. request.setSize (10); Что означает обработанный документ? Будет ли удалено только 10 документов?

Если вы еще этого не сделали, вам следует прочитать документацию search/_scroll. _delete_by_query выполняет поиск с прокруткой, используя запрос, заданный в качестве параметра.

Параметр size соответствует количеству документов, возвращаемых при каждом вызове в конечную точку scroll. Если у вас есть 10 документов, соответствующих вашему запросу, и размером 2 ,asticsearch будет внутренне выполнять 5 search/_scroll вызовов (т.е. 5 пакетов), в то время как если вы установите размер 5, будут выполняться только 2 search/_scroll вызова.

Независимо от параметра size все документы, соответствующие запросу, будут удалены, но это будет более или менее эффективно.

2. Какой размер партии я должен установить? request.setBatchSize (100); его производительность зависит от того, сколько документов мы собираемся удалить?

setBatchSize() метод эквивалентен установке параметра size в запросе. Вы можете прочитать эту статью , чтобы определить правильное значение для параметра размера.

3. Должен ли я сначала позвонить, чтобы не получать никаких документов, и на основании этого setBatchSize следует изменить?

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

4. Срезы должны зависеть от того, сколько ядер у компьютера-исполнителя или нет от ядра в упругом кластере?

Количество срезов должно быть установлено из конфигурации кластера эластичного поиска. Это также для параллельного поиска как между осколками, так и внутри осколков.

Вы можете прочитать документацию для подсказок о том, как установить этот параметр. Обычно количество осколков для вашего индекса.

5. В документации дан метод setSlices (2), который я не могу найти в классе org.elasticsearch.index.reindex.DeleteByQueryRequest. Что мне здесь не хватает?

Вы правы, это, вероятно, ошибка в документации. Я никогда не пробовал, но я считаю, что вы должны использовать forSlice(TaskId slicingTask, SearchRequest slice, int totalSlices).

6. Давайте рассмотрим, выполняю ли я этот запрос на удаление в асинхронном режиме, который занимает 0,5-1,0 с, а если я получу запрос на получение этого индекса, это выдаст какое-то исключение? Также в то же время, если я вставлю новый документ и получу его, сможет ли он дать ответ?

Во-первых, как указано в документации, конечная точка _delete_by_query создает моментальный снимок индекса и работает с этой копией.

Для запроса get это зависит от того, был ли документ уже удален или нет. Он никогда не отправит исключение, вы просто получите тот же результат, что и при получении существующего или несуществующего документа. Обратите внимание, что если вы не укажете sort в поисковом запросе, порядок удаления документов не будет определен.

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

В качестве примечания к удаленным документам можно будет выполнять поиск (даже после завершения задачи delete_by_query) до тех пор, пока не будет выполнена операция refresh.

_delete_by_query не поддерживает параметр refresh.request return, упомянутое в документации для операции refresh, относится к запросам, которые могут иметь параметр обновления.Если вы хотите принудительно выполнить обновление, вы можете использовать конечную точку _refresh.По умолчанию операция обновления выполняется каждую 1 секунду.Поэтому, как только операция _delete_by_query будет завершена не позднее, чем через 1 секунду, удаленные документы не будут доступны для поиска.

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