Настройка поиска sphinx (Linux)

Как установить и настроить поиск sphinx в Linux?

Инструкция была написана для системы Ubuntu/Debian, но такой-же принцип используется на любой ОС Linux.
Чем хорош поиск sphinx? Тем, что он способен сделать выборку из гигантской базы при минимальных затратах на ресурсы и минимальном времени, так же используется свой индекс, и при поиске обращение идет к его индексу, а не к базе данных, что в свою очередь минимизирует нагрузку. Использование sphinx для масштабных проектов неотъемлемая часть, так как оптимизация, всегда играет важную роль.
 

Установка и настройка

Команда установки:
sudo apt-get install sphinxsearch
Создание конфигурационного файла.
sudo nano /etc/sphinxsearch/sphinx.conf
В конфиг файл следующее
#############################################################################
## data source definition
#############################################################################

source entityprefixSource
{                                                                     
type = mysql

sql_host = localhost
sql_user = TYT USER
sql_pass = TYT PASSWD
sql_db = TYT BAZA
sql_port = 3306

sql_sock = /var/run/mysqld/mysqld.sock

mysql_connect_flags = 32 # enable compression

#Кодировка	
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF	
}


source entityprefixArticlesSource : entityprefixSource
{
#Ваш запрос для выборки из базы в index sphinx
#Валидные запросы mysql, pgsql, mssql 
#Обращение к таблицам: tablea, tableab, tableuser. используется для корректной выборки.
#Пример:                                                             
sql_query = \
SELECT tablea.article_id, tablea.article_title, UNIX_TIMESTAMP(tablea.article_date_add) as article_date_add, \
tableab.article_text, tableab.article_publication, tableuser.username_login \
# Обращение к таблицам
FROM dbprefix_article tablea, dbprefix_article_body tableab, dbprefix_user tableuser \
# Выборка, только из тех, которые опубликованы.
WHERE tablea.article_id=tableab.article_id AND tablea.article_publication=1 \
# Образуем начало и конец запросов для выборки, что бы небыло бесконечного цикла
AND tablea.article_id>=$start AND tablea.article_id<=$end

# Объединение полей для разгрузки запроса.
#Пример:
sql_joined_field = tags from query; select article_id, atricle_tag \
from dbprefix_article_tag order by article_id ASC

# Запрос, указанный в этой опции должны быть с минимальным идентификатором и максимальным, которые будут использоваться в качестве границ диапазона. Запрос должен возвращать ровно два целочисленных поля, мин ID первого и второго макс ID; имена полей игнорируются.
sql_query_range = SELECT MIN(article_id),MAX(article_id) FROM dbprefix_article

#Диапазон Начало и Конца выборки, необязательный, по умолчанию 1024
# Выборка начало 1, конец 1000
# след. начало 1001, конец 2002
# след. начало 2003, конец 3002
# шаг равен 999.
sql_range_step = 1000

# Таблица декларации
sql_attr_bool = article_publication

# Поле хранение даты
sql_attr_timestamp = article_date_add

# Несколько значений для одного параметра
sql_attr_multi = uint tag from query; SELECT article_id, article_tag_id FROM dbprefix_article_tag
}
#Такой шаблон можно использовать для любой выборки, например: записей, комментариев, статусов и т.д. Замените название таблиц и полей.


#############################################################################
## index definition
#############################################################################

#Индексация

index entityprefixarticlesIndex
{
# Исходник выборки
source = entityprefixArticlesSource

# Путь до файла хранения выборки
path = /var/lib/sphinxsearch/data/entityprefix/articlesIndex

# Путь до файла жаргона слов
wordforms = /var/lib/sphinxsearch/data/entityprefix/wordforms.txt

# Необязательный, по умолчанию extern
# Как будет храниться информация, варианты: none | extern | inline
docinfo = extern

# Необязательный, по умолчанию пустой
# При поиске слова: собак, собака, собаку - в результате одно и тоже.
# Возможные значения: none | lemmatize_ru | lemmatize_en | lemmatize_de | lemmatize_ru_all | lemmatize_en_all | lemmatize_de_all | stem_en | stem_ru | stem_enru | stem_cz | stem_ar | soundex | metaphone | rlp_chinese | rlp_chinese_batched
morphology = stem_enru

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

# Вырезка html тегов, по умолчанию 0 - отключено | 1 - включено
html_strip = 1

# Удаление содержимого внутри таких элементов, по умолчанию пустой.
html_remove_elements = style, script, code
}

#############################################################################
## indexer settings
#############################################################################
## Объём памяти для index default 32
# рекомендация для Sphinx от 256 до 1024
#Примерно для 1000 статей — индекс занимает 15 мегабайт
indexer
{
mem_limit = 256M
}

#############################################################################
## searchd settings
#############################################################################

searchd
{	
#открытие сокета для коннекта:
listen = /var/run/sphinx.socket

log = /var/log/sphinxsearch/searchd.log

#лог поисковых запросов. Можно отключить. Для поиска потенциальных синонимов для wordforms.txt
query_log = /var/log/sphinxsearch/query.log
                                     
read_timeout = 5
                                        
client_timeout = 300
                                           
max_children = 100
                   
pid_file = /var/run/searchd.pid

#workers = threads. По умолчание используется workers = fork. fork хорош тем, что работает #везде, но он же и наиболее ресурсоёмкий по CPU.                      
workers	= threads

#убирает безобидный, но раздражающий Warning при старте демона.
compat_sphinxql_magics = 0
}

# --eof--

Данный шаблон конфигурации это пример важных и оптимизированных деталей, подстройте его для себя заменив dbprefix_ на нужный_  и не забудьте про ваши коннекты к базе и конечно-же отредактируйте sql запросы под вашу структуру базы данных.

Создайте папку entityprefix, вот этой папке сохраняется вся информация о индексах базы, после запуска командой.
mkdir /var/lib/sphinxsearch/data/entityprefix/

создать файл wordforms.txt для синонимов жаргона.
sudo nano /var/lib/sphinxsearch/data/entityprefix/wordforms.txt
CTRL+O записать файл.
CTRL+X выйти.
 


Дополнительно:  Запуск и Использование

Как запустить:
searchd

Как остановить:
searchd --stop

Как проверить, запущен или нет:
ps ax | grep searchd

Как запустить полную пере-индексацию (демон для этого должен быть остановлен):
indexer --all

Где, по умолчанию, должен быть файл sphinx.conf:
/etc/sphinxsearch/
 

Индексация в автоматическом режиме

Создание правила для крона:
*/60 * * * * /usr/bin/indexer --rotate entityprefixarticlesIndex > /dev/null 2>&1
Статьи будут пере-индексироваться раз в час.
Полная индексация в среднем занимает менее двух секунд...
Можно менять как угодно.
P.S> Удобно дать крон через webmin url: /cron/index.cgi?
1. Создать новое задание
2. Выполнять задание от имени пользователя, обычно root
3. (для статей) Команда:
/usr/bin/indexer --rotate entityprefixarticlesIndex > /dev/null 2>&1
4. Выбрать время, как душе угодно.
 

Файл конфигурации php

Пример файла конфигурации.php для коннекта.
$config['entity_prefix']  = 'entityprefix';
$config['sphinx_host'] = 'unix:///var/run/sphinx.socket';
 

Файл для синонимов слов в поиске

Примеры wordforms.txt
unix > linux
линукс > linux
Служит для облегчения поиска используя жаргон.


Запуск SPHINX при старте системы
1. Вариант
По умолчанию SPHINXSEARCH отключен при загрузке системы.
Для его включения редактируйте файл
sudo nano /etc/default/sphinxsearch
Найдите строку START=no и поменяйте её на START=yes

2. Вариант для searchd
В консоли:
crontab -e
выбрать 2 пункт.
дописать в новой строке:
@reboot searchd --config /etc/sphinxsearch/sphinx.conf
--config путь/дофайла/sphinx.conf

Выберите для Вас удобный…

Более подробная документация на оф. сайте.
На этом всё успехов.
Статья "Настройка поиска sphinx (Linux)" содержит 0 комментариев
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.