Инсталиране и конфигуриране на Sphinx за работа с Mysql



Дата23.03.2017
Размер59.1 Kb.
#17557
Инсталиране и конфигуриране на 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;
Каталог: articles
articles -> Иван (Ванчо) Флоров и м а г и н е р н о с т а
articles -> Закон за върховната сметна палата на 14 декември 2005 г се навършват 125 години от приемането на първия Закон за Върховната сметна палата
articles -> Одитен доклад №0400005712 за извършен одит за съответствие на декларираните приходи
articles -> Сценарий: Андрю Кевин Уолкър, Дейдив Селф
articles -> Одитирани обекти и дейности от сметната палата І. Първостепенни и второстепенни разпоредители с бюджетни кредити
articles -> Закон за върховната сметна палата на българия уважаеми господин председател на Народното събрание
articles -> Onto-pedia: онтология, представяща модел на просветната система в българия в периода 1940-1945 г


Сподели с приятели:




©obuch.info 2024
отнасят до администрацията

    Начална страница