# Dictionary types: CRC vs keywords

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

[dictionary](https://docs.manticoresearch.com/latest/html/conf_options_reference/index_configuration_options.html#dict) — это компонент индекса, который хранит проиндексированные слова. Первые индексы использовали тип словаря '**crc**', при котором слова заменяются их контрольной суммой, вычисляемой либо CRC32, либо FVN64, в зависимости от того, был ли Sphinx скомпилирован с **enable-id64**. В Manticore используется только FVN64, поскольку 32‑битные идентификаторы были удалены.

С появлением RealTime‑индексов и из‑за некоторых потенциальных недостатков возникла необходимость в альтернативном типе словаря. В Sphinx 2 был добавлен словарь **'keywords'**, который хранит реальные слова и устраняет недостатки **'crc'**, о которых мы расскажем ниже, но у него есть свои небольшие проблемы.

RealTime‑индексы (а также недавно появившийся [percolate index](https://docs.manticoresearch.com/latest/html/searching/percolate_query.html)) могут использовать только тип **'keywords'**, тогда как тип **'crc'** доступен только для обычных индексов. Обычные индексы требуют словарь **'keywords'**, чтобы позволить конвертацию в RealTime. Некоторые новые функции, такие как [CALL QSUGGEST](https://docs.manticoresearch.com/latest/html/sphinxql_reference/call_qsuggest_syntax.html), требуют хранения реальных слов, что невозможно с словарём **'crc'**.

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

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

Для подстановочных запросов в режиме **'keywords'** ключевое слово расширяется до всех возможных сохранённых слов в индексе, которые соответствуют поиску с подстановкой. В некоторых граничных случаях расширение может охватывать тысячи слов, что может замедлить запрос. Эффект можно ограничить с помощью '[expansion\_limit](https://docs.manticoresearch.com/latest/html/conf_options_reference/searchd_program_configuration_options.html#expansion-limit)' или избегая проблемных расширений. '**CRC**' не имеет этой проблемы, так как расширения вычисляются во время индексации, а не во время запроса. Хотя у него есть преимущество в скорости, размер индекса остаётся основной проблемой для типа '**crc**'. Также невозможно использовать специальные символы `'?'` и `'%'` для подстановочных запросов, например `'t?st*'` или `'run%'`.

В целом тип '**keywords**' является лучшим выбором, так как он предоставляет больше возможностей и размер индекса остаётся под контролем, если планируется использовать подстановочный поиск. Тем не менее, подстановочные запросы могут требовать внимания в некоторых случаях.
Хотя '**crc**' был помечен как устаревший в Sphinx, мы решили снять эту пометку, поскольку '**crc**' всё ещё может быть полезен в некоторых случаях.

Преимущество '**crc**' — скорость индексации, что может иметь значение при использовании дельта‑индексов, которым необходимо укладываться в определённый временной интервал. Для подстановочного поиска '**crc**' имеет двойную грань: хотя у него нет потенциальных проблем с производительностью, как у '**keywords**', его требования к объёму памяти следует учитывать при использовании.
