Инсталиране и конфигуриране на Sphinx за работа с MySQL.
Автор:
Мартин Петров (www.mpetrov.net)
Благодарности
на: www.dhstudio.eu
1.
Какво е Sphinx ?
1.1. Ключови характеристики
1.2. Какви
приложения включва Sphinx
1.3. Автор и сътрудници в разработването
на Sphinx
1.3.1. Автор на Sphinx и главен разработчик е
1.3.2.
Разработчици на Sphinx
2. Защо да ползваме Sphinx
3. Кой
използва Sphinx:
4. Инсталиране на SphinxSE (MySQL Server 5.1 +
Sphinx)
4.1 Инсталиране на Sphinx
5. Извършване на тест.
6.
Често срещани проблеми
6.1 Проблем при заявки с encoding UTF-8
6.2
Грешка при изпълнение н аautorun.sh (warning: underquoted definition
of AM_PATH_LIBMCRYPT)
6.3 Грешка при стартиране на mysql (Can't
find messagefile '/usr/share/mysql/english/errmsg.sys')
6.4
Извеждане на повече от 1000 резултата при търсене
6.5 Конфликт на
различни колации
1. Какво е Sphinx?
Sphinx e full text search engine с отворен код, които се разпространява под GPL версия 2. Разработването на Sphinx е започнато още през далечната 2001 година. Най- общо казано той е search engine които предоставя бързо и релевантно търсене на текст т.е. функцията fulltext search. Sphinx е специално проектиран да бъде интегриран добре в SQL бази данни както и в скриптовите езици. В момента Sphinx поддържа MySQL, PosgreSQL както и XML. Името “Sphinx” е акроним които официално означава “SQL Phrase Index”
1.1. Ключови характеристики
-
Висока
скорост на индексиране (до 10 MB/сек.
на съвременни процесори)
- Висока скорост на търсене (Средното
изпълнение на заявка е под 0.1 секунди на 2-4
GB
текст.)
- Поддържа разпределено търсене (след версия 0.9.6)
-
Поддържа MySQL
(Таблиците
с MyISAM
и
InnoDB
са поддържани успешно)
- Поддържа търсене по фрази
- Предоставя
английски и руски стеминг.
- Предоставя различни режими за търсене
(„match_all”,
“match_phrase”
и „match_any”)
1.2. Какви приложения включва Sphinx:
indexer: приложение което създава индексите
search: просто приложение която се използва изпълнение на заявки от командния ред
searchd: Демон които се стартира за да се предостави възможност на външни приложения да търсят в по- рано създадения индекс от indexer.
sphinxapi: API библиотека за популярните WEB езици като PHP, Python, Java, Perl и Ruby.
1.3.
Автор
и сътрудници в разработването на Sphinx:
1.3.1.
Автор
на Sphinx
и
главен разработчик е:
Andrew
Aksyonoff, < shodan(at)shodan.ru>
1.
3.2. Разработчици
на Sphinx:
Robert
"coredev" Bengtsson, PostgreSQL data source
Len
Kranendonk, Perl API
Dmytro Shteflyuk, Ruby API
2. Защо да ползваме Sphinx:
-
Search engine с
отворен код
-
Не
изисква java(написан
е на C++)
-
Уникална
скорост за индексиране:
50-100
пъти по- бързо от MySQL
FULLTEXT
4-10
пъти по- бърз от различни search
машини
-
Отново
уникална скорост за търсене:
-
До
1000 пъти по бърз от колкото MySQL
FULLTEXT
в екстремни случай
-
До
2-10 пъти по- бърз от различните търсещи машини
Възможност
за паралелизиране
на Sphinx
на повече от една машини.
3. Кой използва Sphinx:
NowPublic-
www.nowpublic.com
MySQL-
www.mysql.com
The
Pirate Bay- www.thepiratebay.org
MiniNova
- www.mininova.org
Други
изброени тук: www.sphinxsearch.com/powered.html
4. Инсталиране на SphinxSE (MySQL Server 5.1 + Sphinx)
Първата стъпка е да направим папка която да обедини архивите на MySQL и Sphinx които ще изтеглим след това.
mkdir /tmp/mysql_sphinx
cd /tmp/mysql_sphinx
Следващата стъпка е да изтеглим сорс пакетите. Първо ще започнем с пакета на MySQL Server 5.1 които може да бъде изтеглен от тук www.dev.mysql.com/downloads/ и Sphinx които може да бъде изтеглен от тук: http://www.sphinxsearch.com/downloads.html
wget
http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
wget
http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
Разархивираме пакетите
tar
zxvf
mysql-5.1.38.tar.gz
tar
zxvf sphinx-0.9.8.1.tar.gz
Копираме файловете от sphinx папката във mysql директорията:
cp -Rvp sphinx-0.9.8.1/mysqlse mysql-5.1.38/storage/sphinx
Изпълняване autorun.sh
cd
mysql-5.1.38
sh BUILD/autorun.sh
Следва да изпълним :
./configure
--prefix=/usr/local/mysql51 --with-plugins=sphinx
--with-plugins=innobase
Сега
е необходимо да компилираме сорс файловете и да ги инсталираме:
make
&& make install
MySQL
has a Web site at http://www.mysql.com/ which carries details on
the
latest release, upcoming features, and other information to
make your
work or play with MySQL more productive. There you can
also find
information about mailing lists for MySQL discussion.
Remember
to check the platform specific part of the reference manual for
hints
about installing MySQL on your platform. Also have a look at
the
files in the Docs directory.
Thank you for choosing MySQL!
След като компилирахме и инсталирахме MySQL + SphinxSE е необходимо да копираме подразбиращия се конфигурационен файл на MySQL
cp support-files/my-medium.cnf /etc/mysq/my.cnf
и да добавим в секция [mysqld]
plugin_dir=/var/lib/mysql/plugins
Сега ще копираме компилираните файлове (които по- рано добавихме в сорсовете на MySQL) в папката с плъгини на MySQL:
mkdir /var/lib/mysql/plugins
cp storage/sphinx/.libs/ha_sphinx.* /var/lib/mysql/plugins
Сега ни остава да стартираме MySQL с командата:
/usr/local/mysql51/bin/mysqld_safe
--user=mysql &
След
като
mysql
е
стартиран успешно остава да заредим Sphinx
плъгина:
mysql
-u root
mysql>
INSTALL PLUGIN sphinx SONAME 'ha_sphinx.so';
Ако не изведе грешка всичко е наред при зареждането на плъгина, но за да сме на 100% сигурни можем да проверим с командата:
mysql> show engines;
|
CSV | YES | CSV storage engine
.....
|
SPHINX | YES | Sphinx storage engine 0.9.8
Друга
полезна команда е извеждането на заредените плъгини като в случая
акцентираме върху
sphinx:
mysql> show plugins;
|
binlog | ACTIVE | STORAGE ENGINE | NULL | GPL
.....
| SPHINX |
ACTIVE | STORAGE ENGINE | ha_sphinx.so | GPL
4.1 Инсталиране на Sphinx
След като инсталирахме Mysql server 5.1 и заредихме в него storage engine= Sphinx трябва да компилираме и самият sphinx. Инсталирането на sphinx става по следния начин:
cd sphinx-0.9.8.1
./configure
make
&& make install
5.
Извършване
на тест.
Създаване на база „test”
create database test;
Импортиране на примерната таблица documents или файл example.sql. Файлът се намира в сорс директорията на sphinx или по- конкретно „sphinx-0.9.8.1”
За да импортираме таблицата documents изпълняваме следните команди по- долу:
cd
/tmp/mysql_sphinx/
sphinx-0.9.8.1;
mysql
-uroot test-p
< example.sql
Има
и ръчен вариант за създаване на таблицата “documents”:
CREATE
TABLE `t1` (
`id` int(11) NOT NULL,
`weight` int(11) NOT
NULL,
`query` varchar(3072) NOT NULL,
`group_id` int(11)
DEFAULT NULL,
KEY `query` (`query`)
) ENGINE=SPHINX
CONNECTION='sphinx://localhost:3312/test1';
Запълваме таблицата „documents” с информация която да използваме за нашите тестове. За целта създаваме процедура sphinx_mysql_dhstudio която изпълняваме веднага;
drop procedure sphinx_mysql_dhstudio;
delimiter
$$
CREATE PROCEDURE sphinx_mysql_dhstudio()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE
(i<=1000000) DO
insert into documents
(group_id,group_id2,date_added,title,content) VALUES
("1","2",NOW(),"Mysql and sphinx
rulz-dhstudio +{:>>","Mysql and sphinx rulz rulz
rulz^~content");
SET i=i+1;
END WHILE;
END$$
delimiter ;
call
sphinx_mysql_dhstudio();
Сега ще редактираме конфигурационния файл sphinx.conf (/usr/local/etc/sphinx.conf)
#
Minimal Sphinx configuration sample (clean, simple, functional)
#
source
src1
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass
=
sql_db
= test
sql_port
= 3306 # optional, default is 3306
sql_query
= \
SELECT id, group_id,
UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents
sql_attr_uint =
group_id
sql_attr_timestamp = date_adde
sql_query_info = SELECT * FROM documents WHERE
id=$id
}
index test1
{
source
= src1
path
= /var/data/test1
docinfo
= extern
charset_type = sbcs
}
indexer
{
mem_limit = 256M
}
searchd
{
port = 3312
log
= /var/log/searchd.log
query_log = /var/log/query.log
read_timeout = 5
max_children
= 30
pid_file
= /var/log/searchd.pid
max_matches = 10000
seamless_rotate = 1
preopen_indexes
= 0
unlink_old = 1
}
Имаме всичко необходимо и сега е необходимо просто да стартираме searchd и да изпълним командата indexer която да индексира данните:
backup:/usr/local/etc#
searchd
Sphinx
0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using
config file '/usr/local/etc/sphinx.conf'...
creating server socket
on 0.0.0.0:3312
backup:/usr/local/etc#
indexer
--rotate test1
Sphinx
0.9.8.1-release (r1533
Copyright (c) 2001-2008, Andrew Aksyonoff
using
config file '/usr/local/etc/sphinx.conf'...
indexing index
'test1'...
collected 1009000 docs, 28.3 MB
sorted 4.0 Mhits,
100.0% done
total 1009000 docs, 28252000 bytes
total 6.186 sec,
4567380.69 bytes/sec, 163120.74 docs/sec
rotating indices:
succesfully sent SIGHUP to searchd (pid=31470).
Сега ще разгледаме една примерна заявка при която използва sphinx извежда 10 000 реда (ако има такива):
amri@backup:~$
mysql -uroot -p
Enter
password:
Welcome
to the MySQL monitor. Commands end with ; or \g.
Your
MySQL connection id is 77
Server
version: 5.1.38 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
use test;
Reading
table information for completion of table and column names
You
can turn off this feature to get a quicker startup with –A
Database changed
mysql>
select content from documents,t1 where t1.id=documents.id and
query="index=test1;martin;limit=10000;maxmatches=10000";
+---------------------+
|
content |
+---------------------+
| sphinx mysql
|
| sphinx
mysql
|
. . .
10000 rows in set (0,19 sec)
6.
Често
срещани проблеми
6.1 Проблем при заявки с encoding UTF-8
За разрешаване на този проблем се използва следния ред които указва на текущата връзка, че енкодинга ще бъде UTF-8:
sql_query_pre = SET NAMES utf8
6.2 Грешка при изпълнение н аautorun.sh (warning: underquoted definition of AM_PATH_LIBMCRYPT)
При изпълнението на autorun.sh е възможност да възникне грешка от рода:
/usr/share/aclocal/libmcrypt.m4:17:
warning: underquoted definition of
AM_PATH_LIBMCRYPT
/usr/share/aclocal/libmcrypt.m4:17: run info
‘(automake)Extending
aclocal’
/usr/share/aclocal/libmcrypt.m4:17: or see
http://sources.redhat.com/automake/automake.html#Extending-aclocal
Проблемът
е във файл “libmcrypt.m4” или
“/usr/share/aclocal/libmcrypt.m4″ , ред 17:
AC_DEFUN(AM_PATH_LIBMCRYPT,
За да поправим проблема редактираме 17-ти ред по следния начин:
AC_DEFUN([AM_PATH_LIBMCRYPT],
6.3
Грешка
при стартиране на mysql
(Can't
find messagefile '/usr/share/mysql/english/errmsg.sys')
При стартирането на mysql е възможно да изникне следната грешка
Sep
8 22:43:35 backup mysqld_safe: Starting mysqld daemon with databases
from /var/lib/mysql
Sep 8 22:43:35 backup mysqld: 090908 22:43:35
[ERROR] Can't find messagefile
'/usr/share/mysql/english/errmsg.sys'
Sep 8 22:43:35 backup
mysqld: 090908 22:43:35 InnoDB: Started; log sequence number 0
43655
Sep 8 22:43:35 backup mysqld: 090908 22:43:35 [ERROR]
Aborting
Sep 8 22:43:35 backup mysqld:Sep 8 22:43:35 backup
mysqld: 090908 22:43:35 InnoDB: Starting shutdown...
Sep 8
22:43:36 backup mysqld: 090908 22:43:36 InnoDB: Shutdown completed;
log sequence number 0 43655
Sep 8 22:43:36 backup mysqld: 090908
22:43:36 [Note]
Решението е:
ln -s /usr/local/mysql51/share/mysql/ /usr/share/mysql
6.4 Извеждане на повече от 1000 резултата при търсене
Търсих как да изведа повече от 1000 резултата и не успях. Намерих доста решения, но нито едно от тях не стана. Например: да променя sphinx.conf [searchd] от max_matches = 1000 на max_matches = 10000 или в заявката да добавя „limit=10000 max_matches=10000”, но отново не стана.
Решението е:
Комбинация между горните предложения за решение, а именно:
1.
Редактиране
на sphinx.conf,
секция [searchd]
: max_matches=10000
2.
Добавяне
на допълнителни аргументи към заявката “limit=10000;maxmatches=10000”
Пример:
select content from documents,t1 where t1.id=documents.id and query="index=test1;martin;limit=10000;maxmatches=10000";
6.5 Конфликт на различни колации
ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (cp1251_general_ci,COERCIBLE) for operation
Това се получава когато се сбиват двете колации. За целта може да използвате ето тази примерна таблица в която се указва колация за да не се сбиват при изпълнението на заявките:
CREATE
TABLE `t1` (
`art_text_id` int(11) NOT NULL,
`weight`
int(11) NOT NULL,
`query` varchar(3072) NOT NULL,
`art_id`
int(11) DEFAULT NULL,
KEY `query` (`query`)
) ENGINE=SPHINX
CONNECTION='sphinx://localhost:3312/referati' COLLATE
cp1251_general_ci;