Wildcard поиск в Sphinx

admin

Система 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 позволяет настроить буквально все аспекты индексации и подключить различные таблицы с наборами символов. При правильной настройке индексации результаты поиска будут максимально релевантными и полными.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023