В этой статье мы обсудим различия между двумя типами словарей, доступными в 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' может увеличиться даже более чем в 10 раз по сравнению с версией с отключенным префикс/инфикс. Поскольку он не нуждается в хранении дополнительных подстрок, индекс со словарем 'keywords' не увеличивается в размере по сравнению с версией с отключенным префикс/инфикс.
Для подстановки, в случае режима 'keywords' ключевое слово расширяется до всех возможных сохраненных слов в индексе, которые соответствуют поиску с подстановочным знаком. В некоторых крайних случаях расширение может составлять тысячи слов, операция, которая может замедлить запрос. Эффект можно ограничить с помощью '
expansion_limit
' или избегая проблемных расширений. 'CRC' не имеет этой проблемы, так как расширения рассчитываются во время индексации, а не во время запроса. Хотя у него есть скорость на его стороне, размер индекса остается основной проблемой для типа 'crc'. Также невозможно использовать специальные символы '?' и '%' для поисков с подстановочными знаками, таких как 't?st*' или 'run%'.
В целом, тип 'keywords' является лучшим выбором, так как он предоставляет больше функциональности, и размер индекса контролируется, если предполагается использование поисков с подстановочными знаками. Однако поиски с подстановочными знаками могут требовать внимания в некоторых случаях.
Хотя 'crc' был помечен как устаревший в Sphinx, мы решили убрать эту пометку, так как 'crc' все еще может быть полезен в некоторых случаях.
Преимущество 'crc' — это скорость индексации, что может иметь значение в случае использования дельта-индексов, которые должны вписываться в определенное временное окно. Для поиска с подстановочными знаками 'crc' является двусторонним мечом: хотя у него нет потенциальных проблем с производительностью, как у 'keywords', его требования к пространству должны учитываться при использовании.