Wildcard поиск в Sphinx
Система Sphinx умеет искать по части слова, т.н. wildcard-поиск.
То есть, поисковик может буквально предугадывать запрос пользователя, особенно если он неполон, или содержит ошибки. К тому же, wildcard-поиск будет незаменим в онлайн-каталогах, энциклопедиях и интернет-магазинах – пользователю достаточно ввести лишь часть слова и получить список совпадений, товаров или адресов, к примеру.
Настройка индексации
Давайте рассмотрим самый общий случай и главные настройки Sphinx для так называемого wildcard-поиска. А это всего несколько директив:
- min_prefix_len,
- min_infix_len,
- dict,
- index_exact_words,
- expand_keywords.
Логично, что все параметры нужно прописывать в файле конфигурации Sphinx в секции индексации. Для начала предлагаю разобраться, что они делают.
min_prefix_len и min_infix_len
Директивы похожи между собой как по применению, так и по описанию.
min_prefix_len определяет минимальную длину префикса слова для индексации. То есть, при индексации слова “example” будут дополнительно созданы индексы “exa”, “exam”, “examp” и “exampl”. Так что при поиске, скажем, “exam” в выдачу попадут все документы с “example”, даже если там нет слова “exam”.
min_infix_len определяет минимальную длину инфиксного префикса слова при индексации. То есть, начало, конец и середину слова.
Определение директив выглядит так:
min_prefix_len = 3
min_infix_len = 3
## Задание длины 3 префикса и инфикса для отсеивания мелких слов
Учитывайте, что включение этих директив значительно увеличит размер индекса и ухудшит скорость индексации и поиска. Так что для ускорения, возможно, придется задать два индекса с этими директивами и без них, и производить поиск по обоим базам с использованием веса SetIndexWeights().
Еще одна важная особенность – обе директивы не могут одновременно использоваться для одного и того же индекса.
dict
Так что на помощь придет директива dict, которая указывает тип словаря. С ее помощью можно значительно уменьшить размер индекса, а также производить поиск подстрок в больших БД. Она сохраняет ключевые слова в индексе и позволяет использовать wildcard-символы “*”, ”?” и “%”. Директива имеет всего одно значение:
dict = keywords
## При включении dict автоматически игнорируется директива min_infix_len
expand_keywords и index_exact_words
Эти две директивы также существенно увеличивают размер основного индекса, но улучшают поиск.
Название index_exact_words говорит само за себя – в индексе сохраняются слова как они есть. expand_keywords комбинирует в индексе все сохраненные формы слов, то есть все предыдущие директивы, так что при поиске в большинстве случаев не нужно использовать wildcard-символы.
Включаются функции очень просто:
index_exact_words = 1
expand_keywords = 1
## Обе директивы по умолчанию выключены
Пример использования
Теперь нужно собрать все вместе в секциях index файла конфигурации Sphinx:
index city1
{
source = city
path = /var/data/city1
#charset_type = utf-8
morphology = stem_enru
dict = keywords
index_exact_words = 1
expand_keywords = 1
min_word_len = 1
min_prefix_len = 3
}
index country1
{
source = country
path = /var/data/country1
#charset_type = utf-8
morphology = stem_enru
dict = keywords
index_exact_words = 1
expand_keywords = 1
min_word_len = 1
min_prefix_len = 3
}
## Будет проиндексировано две таблицы city и country
Ну а теперь проверим в работе. Для этого нужно подключиться к MySQL, и можно начинать поиск:
mysql> SELECT id, name, population FROM city1, country1 WHERE MATCH('bei');
## Искать совпадения с “bei” в индексах city1 и country1 и вывести id, name, population
На выходе получим:
| id | name | population |
+———+—————+—————+
| 2438 | Beirut | 1100000 |
| 2065 | Bei┤an | 204899 |
| 2073 | Beipiao | 194301 |
| 2203 | Beihai | 112673 |
| 2700 | Beira | 397368 |
5 rows in set (0.00 sec)
## Найдено 5 совпадений, которые совпадают с заданной частью слова
Если же отключить все указанные настройки, то выдача будет иметь вид:
Empty set (0.00 sec)
## Ничего не найдено
Самое главное
Sphinx позволяет настроить буквально все аспекты индексации и подключить различные таблицы с наборами символов. При правильной настройке индексации результаты поиска будут максимально релевантными и полными.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: