Быстрый старт sphinx+Evolution CMS

Недавно появилась необходимость использования Sphnix в связке с Evolution CMS.

Sphinx — это система полнотекстового поиска. У неё есть два преимущества по сравнению с обычным LIKE или MATCH AGAINST.
Скорость поиска(для базы в 40 тысяч товаров и 11 языковов 0.005 секунд);
Морфология русского и английского языка(например если вам нужно найти шпалы, то результат у нас будет по словам шпала/щпалы/шпалами и т.д.)

Изначально задача казалась чем-то страшным и непонятным, но на деле всё оказалось значительно проще.
Фактически для того чтобы Sphinx работал, нам необходимо сделать три вещи.
  • Настроить конфиг SPHINX
  • Подготовить запрос по которому мы сможем получить данные для индексации
  • Сделать запрос в сфинкс

Конфиг SPHINX

Изначальный конфиг выглядит примерно так:
source src1 #Название и конфиг источника данных
{
	type = mysql
	sql_host = localhost
	sql_user = user
	sql_pass = pass
	sql_db = db_name
	sql_port = 3306
	sql_query_pre = SET NAMES utf8
	sql_query = #здесь запрос на выбор данных из нашей БД
}

index products #Название индекса
{
	source = src1 #Указываем источник данных
	min_infix_len = 2 #Длина инфикса, это необходимо для морфологии
	index_exact_words = 1 
	morphology = stem_enru #Указываем наличие морфологии
	path = /var/lib/sphinx/data/products #Папка где будут лежать наши индексы
}


Основная вещь которая может вызвать сложность в конфиге это sql_query. Так как нам фактически одним запросом нужно получить все данные для индекса. В случае когда необходимо получить только стандартные поля ресурса, то запрос будет выглядеть как-то так:
sql_query = SELECT * FROM `evo_site_content`;

В целом всё ограничено только вашей фантазией в составлении запроса.

Фактически после составления конфига вам необходимо всё проиндексировать. Для первого индекса команда
indexer --all --config
После этого нам необходимо в крон добавить вторую команду
indexer --rotate --all
эта команда позволяет обновлять уже существующий индекс.

Теперь непосредственно о реализации поиска внутри Evolution CMS.
Особенность сфинкса в том, что по хорошему мы от него должны получить только id ресурсов, а дальше имея список id мы можем выводить их как душе угодно.

Для самого простого поиска нам необходима одна вещь это DBAPI.

$search_word = $modx->db->escape($_GET[‘search’]);
//Подключение к сфинксу
$modx->db->connect('localhost:9306', null, null, null);  
//Запрос в сфинск
$result = $modx->db->query("SELECT * FROM products WHERE MATCH('".$search_word."'); ");  
	while( $row = $modx->db->getRow( $result ) ) {  
		$ids[] = $row['id']; //Получили все id ресурсов
	}  
// Отключение  
$modx->db->disconnect() ; 

// Повторное подключение  
$modx->db->connect();


В итоге мы имеем массив $ids который хранит все нужные нам id в порядке релевантности.

То что касается релевантности поиска, это уже можно отнести к отдельной статье. И как бы банально не звучало, необходимо читать документацию, чтобы подстроится под каждую определённую ситуацию.
Я реализовывал два поиска в рамках работы в Dmi3yy Team и у каждого из них был свой вариант настройки релевантности и они абсолютно различались друг от друга.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.