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

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

Что такое прокси-сервер: пояснение простыми словами, зачем нужны прокси

Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…

21.11.2024

Что такое PWA приложение? Зачем необходимо прогрессивное веб-приложение

Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…

19.11.2024

Как создать игру на телефоне: программирование с помощью конструктора

Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…

17.11.2024

Google Bard: эффективный аналог ChatGPT

В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…

14.11.2024

Скрипт и программирование: что это такое простыми словами

Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…

12.11.2024

Дедлайн в разработке: что это такое простыми словами

Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…

11.11.2024