В этой статье мы обсудим различия между двумя типами словарей, доступными в Manticore Search.
dictionary — это компонент индекса, который хранит проиндексированные слова. Первые индексы использовали тип словаря 'crc', при котором слова заменяются их контрольной суммой, вычисляемой либо CRC32, либо FVN64, в зависимости от того, был ли Sphinx скомпилирован с enable-id64. В Manticore используется только FVN64, поскольку 32‑битные идентификаторы были удалены.
С появлением RealTime‑индексов и из‑за некоторых потенциальных недостатков возникла необходимость в альтернативном типе словаря. В Sphinx 2 был добавлен словарь 'keywords', который хранит реальные слова и устраняет недостатки 'crc', о которых мы расскажем ниже, но у него есть свои небольшие проблемы.
RealTime‑индексы (а также недавно появившийся percolate index ) могут использовать только тип 'keywords', тогда как тип 'crc' доступен только для обычных индексов. Обычные индексы требуют словарь 'keywords', чтобы позволить конвертацию в RealTime. Некоторые новые функции, такие как CALL QSUGGEST , требуют хранения реальных слов, что невозможно с словарём 'crc'.
Если префикс/инфикс не включён: индексы со словарём 'keywords' работают медленнее при индексации. Первая причина — 'keywords' хранит полное слово в словаре (до 127 символов), тогда как 'crc' сводит любые слова к 4‑байтовому хешу. На завершающем этапе индексации тип 'keywords' должен выполнить сортировку слов, что может занять некоторое время. Короче говоря, индексация с 'keywords' может быть 10%-40% медленнее, чем с 'crc'. Размер индекса и время поиска схожи, когда префикс/инфикс отключены.
Если префикс/инфикс включён: 'crc' необходимо создавать дополнительные перестановки слов для подстрок и может быть медленнее, чем 'keywords' в этом случае. Словарь 'keywords' не требует дополнительных шагов при индексации, когда включён только префикс. Только для инфикса он извлекает и собирает триграммы из слов (для QSUGGEST). Из‑за дополнительных перестановок слов размер индекса 'crc' может взорваться более чем в 10x по сравнению с версией без префикса/инфикса. Поскольку нет необходимости хранить дополнительные подстроки, индекс со словарём 'keywords' не увеличивается в размере по сравнению с версией без префикса/инфикса.
Для подстановочных запросов в режиме 'keywords' ключевое слово расширяется до всех возможных сохранённых слов в индексе, которые соответствуют поиску с подстановкой. В некоторых граничных случаях расширение может охватывать тысячи слов, что может замедлить запрос. Эффект можно ограничить с помощью '
expansion_limit
' или избегая проблемных расширений. 'CRC' не имеет этой проблемы, так как расширения вычисляются во время индексации, а не во время запроса. Хотя у него есть преимущество в скорости, размер индекса остаётся основной проблемой для типа 'crc'. Также невозможно использовать специальные символы '?' и '%' для подстановочных запросов, например 't?st*' или 'run%'.
В целом тип 'keywords' является лучшим выбором, так как он предоставляет больше возможностей и размер индекса остаётся под контролем, если планируется использовать подстановочный поиск. Тем не менее, подстановочные запросы могут требовать внимания в некоторых случаях.
Хотя 'crc' был помечен как устаревший в Sphinx, мы решили снять эту пометку, поскольку 'crc' всё ещё может быть полезен в некоторых случаях.
Преимущество 'crc' — скорость индексации, что может иметь значение при использовании дельта‑индексов, которым необходимо укладываться в определённый временной интервал. Для подстановочного поиска 'crc' имеет двойную грань: хотя у него нет потенциальных проблем с производительностью, как у 'keywords', его требования к объёму памяти следует учитывать при использовании.