Типы словарей: CRC vs ключевые слова

В этой статье мы обсудим различия между двумя типами словарей, доступными в Manticore Search.

Словарь является компонентом индекса, который хранит индексированные слова. Первые индексы использовали тип словаря ‘crc’, в котором слова заменяются значением их контрольной суммы с использованием либо CRC32, либо FVN64, в зависимости от того, был ли Sphinx скомпилирован с enable-id64 или нет. В Manticore используется только FVN64, так как 32-битные идентификаторы были удалены.

С введением индексов RealTime и из-за некоторых потенциальных недостатков возникла необходимость в альтернативном типе словаря. В Sphinx 2 был добавлен словарь ‘keywords’, который хранит фактические слова и устраняет недостатки ‘crc’, о которых мы будем говорить ниже, но имеет свои собственные незначительные проблемы.

Индексы RealTime (а также недавно появившийся индекс перколяции ) могут использовать только тип ‘keywords’, в то время как тип ‘crc’ доступен только для обычных индексов. Обычные индексы требуют словаря ‘keywords’ для преобразования в RealTime. Некоторые новые функции, такие как CALL QSUGGEST , требуют хранения фактических слов, что невозможно со словарем ‘crc’.

В случае если префиксация/инфиксация не включены: индексы со словарем ‘keywords’ индексируются медленнее. Первая причина заключается в том, что ‘keywords’ хранит целое слово в словаре (до 127 символов), в то время как ‘crc’ сворачивает любые слова до 4-байтового хэша. На заключительном этапе индексации, тип ‘keywords’ должен выполнять сортировку слов, что может занять некоторое время. Короче говоря, индексация в случае ‘keywords’ может быть на 10%-40% медленнее, чем в случае ‘crc’. Размер индекса и время поиска аналогичны, когда префикс/инфикс отключены.

В случае если префиксация/инфиксация включены: ‘crc’ должен строить дополнительные перестановки слов для подстрок и может быть медленнее, чем ‘keywords’ в этом случае. Словарь ‘keywords’ не имеет дополнительных шагов при индексации, когда включена только префиксация. Только для инфиксации он извлекает и собирает триграммы из слов (для QSUGGEST). Из-за дополнительных перестановок слов, размер индекса ‘crc’ может увеличиться даже более чем в 10 раз по сравнению с версией с отключенной префиксацией/инфиксацией. Поскольку ему не нужно хранить дополнительные подстроки, индекс с словарем ‘keywords’ не увеличивается в размере по сравнению с версией с отключенной префиксацией/инфиксацией.

Для подстановочных знаков в режиме ‘keywords’ ключевое слово разворачивается во все возможные сохраненные слова в индексе, которые соответствуют поиску с подстановочными знаками. В некоторых крайних случаях расширение может включать тысячи слов, что может замедлить запрос. Эффект можно ограничить с помощью ‘ expansion_limit ’ или избегая проблемных расширений. У ‘CRC’ нет этой проблемы, так как расширения вычисляются во время индексации, а не во время запроса. Хотя у него есть преимущество в скорости, размер индекса остается главной проблемой для типа ‘crc’. Также невозможно использовать специальные символы '?' и '%' для поиска с подстановочными знаками, такими как 't?st*' или 'run%'.

В целом, тип ‘keywords’ является лучшим выбором, так как он обеспечивает больше функциональности, и размер индекса остается под контролем, если нужно использовать поиск с подстановочными знаками. Однако поиск с подстановочными знаками может потребовать внимания в некоторых случаях.
Хотя ‘crc’ был помечен как устаревший в Sphinx, мы решили снять эту отметку, так как ‘crc’ все еще может быть полезен в некоторых случаях.

Преимущество ‘crc’ - скорость индексации, которая может иметь значение в случае использования дельта-индексов, которые должны укладываться в определенное окно времени. Для поиска с подстановочными знаками ‘crc’ является двусторонним: хотя у него нет потенциальных проблем с производительностью, как у ‘keywords’, необходимо учитывать его требования к пространству при использовании.

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

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