Подстановочный поиск между словами в режиме CRC в Sphinx

Я использую sphinx с режимом CRC и min_infix_length = 1, и я хочу использовать поиск по шаблону между символами ключевого слова. Предположим, у меня есть такие данные в моих индексных файлах:

name
-------
mickel
mick
mickol
mickil
micknil
nickol
nickal

и когда я ищу все записи, их имена начинаются с "mick" и заканчиваются на "l":

select * from all where match ('mick*l')

Я ожидаю, что результаты должны быть такими:

name
-------
mickel
mickol
mickil
micknil

но ничего не вернулось. Как я могу это сделать?

  • Я знаю, что могу сделать это в режиме dict= Keywords, но я должен использовать режим crc по некоторым причинам.

  • Я также использовал операторы '^' и '$' и не работал.

1 ответ

Решение

Вы не можете использовать "средние" шаблоны с CRC. Одна из причин, по которой dict= ключевые слова, подстановочные знаки, которые он может поддерживать, гораздо более гибкая.

С помощью CRC он "предварительно вычисляет" все комбинации символов и вставляет их в качестве отдельных ключевых слов в индексе, например, для

например mickel как слово документа, и с min_prefix_len=1, indexer создадим слова:

mickel
mickel*
micke*
mick*
mic*
mi*
m*

... как слова в индексе, так что все комбинации могут совпадать. При использовании min_infix_len, он также должен делать все комбинации в начале (так (word_length)^2 + 1 комбинации)

... если бы он должен был предварительно вычислить все комбинации для подстановочных знаков в середине, было бы намного больше снова. Особенно, если тогда все разрешено для средних и начальных / конечных комбинаций)


Хотя, сказав это, вы можете переписать

select * from all where match ('mick*l')

как

select * from all where match ('mick* *l')

потому что с min_infix_len начало и конец будут проиндексированы как отдельные слова. Юсу нужно настаивать на том, чтобы оба соответствовали. (хотя не могу придумать, как заставить их бота соответствовать одному слову!)

Другие вопросы по тегам