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 секунду, удаленные документы не будут доступны для поиска.