forcemerge
может значительно повысить производительность ваших запросов, поскольку позволяет объединить существующее количество сегментов в меньшее количество сегментов, что более эффективно для запросов, так как сегменты ищутся последовательно. При слиянии также очищаются все документы, помеченные для удаления.
Слияние происходит регулярно и автоматически в фоновом режиме как часть ведения Elasticsearch на основе политики слияния.
Хитрость: только сегменты до 5 ГБ считаются политикой слияния. Используя API forcemerge с параметром, который позволяет указывать количество результирующих сегментов, вы рискуете, что результирующие сегменты станут больше 5 ГБ, что означает, что они больше не будут учитываться в будущих запросах на слияние. Пока вы не удаляете и не обновляете документы, в этом нет ничего плохого. Однако если вы продолжите удалять или обновлять документы, Lucene пометит старую версию ваших документов в существующих сегментах как удаленную и запишет новую версию ваших документов в новые сегменты. Если удаленные документы располагаются в сегментах размером более 5 ГБ, на них больше не производится уборка, т. Е. Документы, помеченные для удаления, никогда не будут очищены.
При установке индекса на чтение только перед выполнением принудительного слияния вы гарантируете, что у вас не будет огромных сегментов, содержащих много устаревших документов, которые потребляют драгоценные ресурсы в памяти и на диске и замедляют ваши запросы.
A refresh
делает что-то другое: верно, что документы, которые вы хотите проиндексировать, сначала обрабатываются в памяти, а затем записываются на диск. Но структура данных, которая позволяет вам фактически найти документ («сегмент»), создается не сразу для каждого отдельного документа, поскольку это было бы крайне неэффективно. Сегменты создаются только при переполнении внутреннего буфера или при возникновении refresh
. Активировав ссылку sh, вы сразу же сделаете документ доступным для поиска. Тем не менее, сначала сегмент живет только в памяти, поскольку, опять же, было бы крайне неэффективно сразу синхронизировать c каждый сегмент на диске сразу после его создания. Сегменты в памяти периодически синхронизируются с диском. Даже если вы отключите разъем до того, как произойдет синхронизация c с диском, вы не потеряете никакой информации, поскольку Elasticsearch поддерживает транслог, который позволит Elasticsearch «переиграть» все запросы на индексирование, которые еще не перешли в сегмент на диске. .