⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.

How kill-lists changed in Manticore Search 3

В этой статье мы обсудим, как работают kill-lists в Manticore Search 3.

Обычные индексы неизменяемы в отношении добавления новых документов: после создания добавить дополнительные данные невозможно, можно лишь обновлять атрибуты существующих документов. Чтобы индекс соответствовал основным данным (которые могут быть базой данных или файлами), его необходимо обновлять, выполняя полную перестройку. Эта операция может занимать время. В некоторых случаях полная перестройка может занимать часы и более.

Это означает, что поисковые данные могут отставать от оригинального хранилища, и новый контент будет ждать, пока индекс не будет перестроен. Чтобы решить эту проблему, была введена концепция дельта‑индекса. Дельта — это индекс с той же структурой, что и основной (также называемый «main») индекс, но он предназначен для захвата документов, добавленных в базу данных после построения основного индекса. Точкой отсчёта обычно является идентификатор документа или момент времени.

В то время как дельта захватывает новые документы (которые ранее не существовали), в большинстве случаев также требуется захватывать изменённые документы. Ещё одно распространённое требование — иметь возможность как‑то отбрасывать удалённые документы. Изменённые документы могут быть включены в дельту, но это создаёт проблему: поиск одновременно по основному и дельта‑индексам возвращает две версии одного и того же документа — старую в основном индексе и новую в дельте — и движок не знает, какую выбрать.

Чтобы преодолеть эти проблемы, была добавлена новая концепция: kill-list — список идентификаторов документов в дельта‑индексе, которые известны как изменённые или удалённые, чтобы основной индекс игнорировал их при поиске.

Пока всё было хорошо. Однако в версии 2 движок должен был применять kill-list к набору результатов, извлечённому из основного индекса, перед объединением с набором результатов из дельты, чтобы получить окончательный результат. В целом это работало нормально для многих пользователей, но применение kill‑list при каждом запросе влияет на производительность. Это не заметно на небольших индексах или небольших kill‑list’ах, но начинает сказываться на больших индексах, которые «много времени» требуют для перестройки, и дельта‑индексы могут иметь большие наборы kill‑list’ов.

<img src="killlists-v2-optimized.webp" alt="img"> Kill-lists в 2.x

Manticore 3 внесла разрушающее изменение, проведя масштабное обновление движка хранения индексов. Kill‑list’ы также потребовали изменения.

Это было по двум причинам: существующий способ работы с kill‑list’ами оказался проблематичным в некоторых граничных случаях, и он также плохо вписывался в новый движок хранения.

Итак, вместо применения kill‑list’ов при каждом запросе, почему бы не сделать это один раз? В версии 3 в источнике(ах) дельта‑индекса мы всё ещё определяем источник для kill‑list’ов (sql_query_killlist), но в конфигурации индекса необходимо определить цели kill‑list’ов.

Когда индексы загружаются, движок проверяет, есть ли для индекса kill‑list, который необходимо применить. Если найден один (или несколько), он применяет этот kill‑list к индексу, помечая соответствующие документы как удалённые. При выполнении запроса к индексу такие помеченные документы просто игнорируются (как будто их нет). Поскольку это подавление уже выполнено при запуске или ротации индекса, наличие дельты не требуется, чтобы удалённые документы больше не появлялись в результатах.

<img src="killlists-v3-optimized.webp" alt="img"> Цели kill‑list определяются в директиве индекса killlist_target . Директива ожидает список индексов и режим применения kill‑list’ов. В настоящее время поддерживаются 3 режима:

  • kl — идентификаторы документов из определённого kill‑list (по sql_query_killlist) будут использоваться для подавления

  • id — идентификаторы документов берутся из индекса (и любой определённый sql_query_killlist будет игнорироваться)

  • или по умолчанию, если не указать 'kl' или 'id', будут использоваться как идентификаторы из индекса, так и из sql_query_killlist

Пример

index delta {
  ...
  killlist_target = index_one:kl, index_two:id
  ...
}

Директиву target можно изменить с помощью команды ALTER TABLE, но чтобы изменения вступили в силу, целевые индексы необходимо перезагрузить. Кроме того, ALTER не может 'отключить' уже удалённые идентификаторы в целевом индексе (удалив индекс из списка целей).

Новый способ работы kill‑list’ов улучшает производительность запросов, поскольку теперь во время выполнения запроса нет дополнительной операции сравнения найденных идентификаторов документов со списком подавления. Более того, постоянное помечение подавленных идентификаторов приводит к более короткому списку id, который нужно просматривать при каждом запросе. Это также добавляет гибкость: могут использоваться не только идентификаторы из специального списка (генерируемого sql_killlist_query), но и идентификаторы документов всего индекса, если это необходимо.

Установить Manticore Search

Установить Manticore Search