Sphinx и SphinxQL. Установка на Ubuntu Server и первый практический опыт.

// Апрель 15th, 2011 // Sphinx, Веб-разработка

Рано или поздно при разработке поисковой системы по сайту, у программиста появляется идея — «а переведу ка я весь поиск на Sphinx». Вот и у меня возникла такая идея. После непродолжительного гугления, мне удалось установить и даже попробовать в работе SQL интерфейс доступа к Sphinx.

Установка

У вас уже должен стоять mysql сервер и клиент. Будет описываться установка для Ubuntu Server 10.10

1. Качаем пакеты

sudo apt-get install sphinxsearch

2. Создаем тестовую базу, таблицу и данные

CREATE DATABASE `testdb` ;
CREATE TABLE `testdb`.`companies` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`country_id` INT NOT NULL ,
`city_id` INT NOT NULL ,
`name` VARCHAR( 100 ) NOT NULL
) ENGINE = InnoDB;
INSERT INTO `testdb`.`companies` (
`id` ,
`country_id` ,
`city_id` ,
`name`
)
VALUES (
NULL , '1', '1', 'Some company'
), (
NULL , '1', '2', 'Some medical company'
);

3. Редактируем конфиг /etc/sphinxsearch/sphinx.conf Старый копируем на всякий случай, а в файл пишем следующее:

# Источник данных для поиска
source companies
{
	# Тип данных
	# Доступные типы: mysql, pgsql, mssql, xmlpipe, xmlpipe2, odbc
	type			= mysql

	# Необходимые параметры для подключения к базе данных
	sql_host		= localhost
	sql_user		= root
	sql_pass		= passforroot
	sql_db		= testdb
	sql_port		= 3306	# опциональный, по умолчанию 3306

	# пред-запрос, выполняется перед выполнением основного запроса на получение данных из базы
	# В нашей базе данные хранятся в UTF-8, чтобы поиск по русским символам работал успешно выполним соответсвующий запрос
	sql_query_pre		= SET NAMES utf8

	# запрос, который получает данные документов для поиска
	# первым полем обязательно должен идти уникальный положительный ID документа
	sql_query		= \
		SELECT * \
		FROM companies        

        # поля, по которым может идти группировка, фильтрация и сортировка
        sql_attr_uint    = country_id
        sql_attr_uint    = city_id

	# document info query, ONLY for CLI search (ie. testing and debugging)
	# optional, default is empty
	# must contain $id macro and must fetch the document by that id
	sql_query_info		= SELECT * FROM companies WHERE id=$id
}

# индекс каталога товаров для поиска
index companies
{
     # Источник данных для индексирования
    source            = companies

    # Адрес, где будут хранится данные индекса
    path		= /var/lib/sphinxsearch/data/companies

    # Индекс с учетом морфологии
    morphology        = stem_ru

    # Минимальная длина слова для индексации
    min_word_len        = 1

    # Кодировка
    charset_type        = utf-8
}

# поисковый демон (служба)
searchd
{
    # какой порт и какой протокол "слушает" служба
    listen 	     = localhost:3307:mysql41

    # файл с логами
    log	             = /var/log/sphinxsearch/searchd.log

    # файл с логами поисковых запросов
    query_log        = /var/log/sphinxsearch/query.log

    # PID file, searchd process ID file name
    # mandatory
    pid_file        = /var/run/searchd.pid
}

4. Запускаем индексацию нашей базы

andrey@z11:~$ sudo indexer --all
Sphinx 0.9.9-release (r2117)
Copyright (c) 2001-2009, Andrew Aksyonoff

using config file '/etc/sphinxsearch/sphinx.conf'...
indexing index 'companies'...
collected 2 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 2 docs, 32 bytes
total 0.011 sec, 2824 bytes/sec, 176.55 docs/sec
total 2 reads, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
total 7 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg

5. Запускаем демона sphinx

andrey@z11:/etc/sphinxsearch# searchd

Sphinx 0.9.9-release (r2117)
Copyright (c) 2001-2009, Andrew Aksyonoff
using config file '/etc/sphinxsearch/sphinx.conf'...
WARNING: multiple addresses found for 'localhost', using the first one (ip=127.0.0.1)
listening on 127.0.0.1:3307

6. Коннектимся к нему по SQL протоколу:

andrey@z11:/etc/sphinxsearch# mysql -h 127.0.0.1 -P 3307
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 0.9.9-release (r2117)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT * from companies WHERE MATCH('@name company');
+------+--------+------------+---------+
| id   | weight | country_id | city_id |
+------+--------+------------+---------+
|    1 |   1356 |          1 |       1 |
|    2 |   1356 |          1 |       2 |
+------+--------+------------+---------+
2 rows in set (0.00 sec)
mysql>

Отлично, теперь можно цепляться любым SQL клиентом и получать данные. А индексацию запускать по крону. Полное описание протокола SQL, реализованного в SphinxQL читайте по ссылке ниже.

Литература

Полное описание протокола SphinxQL (SQL в Sphinx)

Share

Спасибо!


Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это:


One Response to “Sphinx и SphinxQL. Установка на Ubuntu Server и первый практический опыт.”

  1. Илья:

    Спасибо, долго рыскал по гуглю, прежде чем найти что то внятное и по теме. Автору респект и уважуха

Комментировать