Wildcard поиск в Sphinx

Система Sphinx умеет искать по части слова, т.н. wildcard-поиск. Sphinx Wildcard search

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


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень