Подстановочный поиск между словами в режиме 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 начало и конец будут проиндексированы как отдельные слова. Юсу нужно настаивать на том, чтобы оба соответствовали. (хотя не могу придумать, как заставить их бота соответствовать одному слову!)