Sphinx и SphinxQL. Установка на Ubuntu Server и первый практический опыт.
Рано или поздно при разработке поисковой системы по сайту, у программиста появляется идея – “а переведу ка я весь поиск на Sphinx”. Вот и у меня возникла такая идея. После непродолжительного гугления, мне удалось установить и даже попробовать в работе SQL интерфейс доступа к Sphinx.
Установка
У вас уже должен стоять mysql сервер и клиент. Будет описываться установка для Ubuntu Server 10.10
1. Качаем пакеты
1 |
sudo apt-get install sphinxsearch |
2. Создаем тестовую базу, таблицу и данные
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 Старый копируем на всякий случай, а в файл пишем следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# Источник данных для поиска 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. Запускаем индексацию нашей базы
1 2 3 4 5 6 7 8 9 10 11 12 |
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
1 2 3 4 5 6 7 |
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 протоколу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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 читайте по ссылке ниже.
Спасибо, долго рыскал по гуглю, прежде чем найти что то внятное и по теме. Автору респект и уважуха