Sphinx - это поисковая система, позволяющая быстро индексировать таблицы баз данных и производить полнотекстовый поиск по ним. В основе работы системы лежит принцип индексации базы альтернативным приложением.

Приложение Sphinx устанавливается в систему. Все настройки для него прописываются в конфигурационном файле sphinx.conf, в числе которых присутствуют параметры соединения с базой данных, запросы к таблицам для индексирования, каталоги для хранения индексов и прочее. Полную документацию для настройки sphinx.conf можно найти здесь.
После установки вы получаете пять плагинов для поиска по различным компонентам Joomla и компонент административной части для настройки. Активировав поисковые плагины Sphinx, можно деактивировать стандартный поиск Joomla.

Для успешной индексации русскоязычных баз данных пришлось немного изменить конфиг sphinx. Пример можете посмотреть ниже.

#
# site parent
source site-parent
{
 type = mysql
 sql_host = localhost
 sql_user = dbuser
 sql_pass = dbpass
 sql_db = dbname
 sql_port = 3306
 
 sql_query_pre = SET NAMES 'utf8'
 sql_query_pre = SET SESSION query_cache_type=OFF
}
#
# Joomla articles
#
source joomla_articles : site-parent
{
 #only published and Public articles are indexed
 sql_query = \
 SELECT `id`, `title`, `introtext`, `fulltext`, `metakey`, `metadesc`, \
 UNIX_TIMESTAMP(`created`) as created, `hits`, `catid` \
 FROM nz6ol_content \
 WHERE state = 1;
sql_attr_uint = hits
sql_attr_uint = catid
sql_attr_string = title
sql_attr_timestamp = created
}

index joomla_articles
{
source = joomla_articles
path = /var/www/site.com/sphinx/data/articles
morphology = stem_enru, soundex, metaphone
charset_type = utf-8
charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6, U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101, U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109, U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F, U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, U+0116->U+0117, U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D, U+011D, U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, U+0134->U+0135, U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, U+013C, U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, U+0143->U+0144, U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, U+014B, U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, U+0152->U+0153, U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159, U+0159, U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, U+0160->U+0161, U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, U+0167, U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, U+016E->U+016F, U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175, U+0175, U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, U+017B->U+017C, U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, U+0430..U+044F, U+4E00..U+9FFF

enable_star = 1
expand_keywords = 1
index_exact_words = 1
min_word_len = 3
min_prefix_len = 0
min_infix_len = 3
}

#
# Joomla web links
#
source joomla_weblinks : site-parent
{
#only published links are indexed
sql_query = \
SELECT `id`, `catid`, `title`, `description`, UNIX_TIMESTAMP(`created`) as created, `hits` \
FROM nz6ol_weblinks \
WHERE state = 1;

sql_attr_uint = hits
sql_attr_uint = catid
sql_attr_string = title
sql_attr_timestamp = created
}

index joomla_weblinks
{
source = joomla_weblinks
path = /var/www/site.com/sphinx/data/weblinks
morphology = none

min_word_len = 3
min_prefix_len = 0
min_infix_len = 3
}

#
# Joomla contacts
#
source joomla_contacts : site-parent

{ 
sql_query = \
SELECT `id`, `catid`, `name` as title, `con_position`, `address`, `state`,\
`country`, `postcode`, `telephone`, `misc`, `email_to`, id as modified, 0 as`hits`, id as created \
FROM nz6ol_contact_details \
WHERE published = 1;

sql_attr_uint = hits
sql_attr_uint = catid
sql_attr_string = title
sql_attr_uint = created
}

index joomla_contacts
{
source = joomla_contacts
path = /var/www/site.com/sphinx/data/contacts
morphology = none

min_word_len = 3
min_prefix_len = 0
min_infix_len = 3
}

#
# Joomla categories
#
source joomla_categories : site-parent
{
#only published links are indexed
sql_query = \
SELECT `id`, id as `catid`, `title`, `description`, 0 as `hits`, 0 as `created`\
FROM nz6ol_categories \
WHERE published = 1;

sql_attr_uint = hits
sql_attr_uint = catid
sql_attr_string = title
sql_attr_uint = created
}

index joomla_categories
{
source = joomla_categories
path = /var/www/site.com/sphinx/data/categories
morphology = stem_enru, soundex, metaphone
charset_type = utf-8
charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6, U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101, U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109, U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F, U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, U+0116->U+0117, U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D, U+011D, U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, U+0134->U+0135, U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, U+013C, U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, U+0143->U+0144, U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, U+014B, U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, U+0152->U+0153, U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159, U+0159, U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, U+0160->U+0161, U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, U+0167, U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, U+016E->U+016F, U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175, U+0175, U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, U+017B->U+017C, U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, U+0430..U+044F, U+4E00..U+9FFF

enable_star = 1
expand_keywords = 1
index_exact_words = 1

min_word_len = 3
min_prefix_len = 0
min_infix_len = 3
}

#
# Joomla newsfeeds
#
source joomla_newsfeeds : site-parent
{

sql_query = \
SELECT `id`, `catid`, link, name as title, numarticles as `hits`, 0 as `created`\
FROM nz6ol_newsfeeds \
WHERE published = 1;

sql_attr_uint = hits
sql_attr_uint = catid
sql_attr_string = title
sql_attr_uint = created
}

index joomla_newsfeeds
{
source = joomla_newsfeeds
path = /var/www/site.com/sphinx/data/newsfeeds
morphology = none

min_word_len = 3
min_prefix_len = 0
min_infix_len = 3
}


index joomla_search
{
type = distributed
local = joomla_articles
local = joomla_weblinks
local = joomla_contacts
local = joomla_newsfeeds
}

indexer 
{
mem_limit = 512M 
}
searchd 
{
compat_sphinxql_magics = 0 
listen = localhost:9312 
log = /var/log/sphinx/searchd.log 
query_log = /var/log/sphinx/query.log 
read_timeout = 5 
max_children = 30 
pid_file = /var/run/sphinxsearch/searchd.pid 
max_matches = 50000 
binlog_path = /var/run/sphinxsearch/ 
}

 

Обратите внимание на параметры:

enable_star = 1
expand_keywords = 1
index_exact_words = 1
min_word_len = 3
min_prefix_len = 0
min_infix_len = 3

enable_star
Позволяет использовать звездочки в запросах, к примеру по запросу *пр* будут найдены проспект, привет, апроксимация и др.

expand_keywords
Автоматически расширяет поисковый запрос до трех запросов
running -> ( running | *running* | =running )
Просто слово с морфологией, слово со звездочками и полное совпадения слова. Раньше этой опции не было и чтобы поискать со звездочками мне приходилось вручную делать дополнительный запрос, сейчас все включается одной опцией. Так же автоматом полное совпадение будет в поисковой выдаче выше чем поиск со звездочками и морфологией.

index_exact_words
Позволяет на ряду с морфологически нормализованной формой хранить и оригинальное слово в индексе. Это сильно увеличивает размер индекса, но с учетом предыдущей опции позволяет выдавать результаты более релевантно.
К примеру есть три слова “дыня”, “дыне”, “дыню” без этой опции все три слова будут сохранены в индексе как дын и на запрос “дыне” будут выданы в порядке добавления в индекс то есть “дыня”, “дыне”, “дыню”.
Если же включить опции expand_keywords и index_exact_words то на запрос “дыне” будет более релевантная выдача “дыне”, “дыня”, “дыню”.

min_word_len
Минимальный размер слова для индексации, по умолчанию 1 и индексирует все слова.

min_infix_len
Позволяет индексировать части слова инфиксы, и искать по ним с применением *, вроде search*, *search и *search*.
К примеру при min_infix_len = 2 и попаданию в индекс слова “тест”, будут сохранены в индекс “те”, “ес”, “ст”, “тес”, “ест”, “тест” и по запросу “ес” будет найдено это слово.

min_prefix_len
Является дочерним для min_infix_len и делает почти тоже самое только сохраняет начало слов или префиксы.
К примеру при min_infix_len = 2 и попаданию в индекс слова “тест”, будут сохранены в индекс “те”, “тес”, “тест” и по запросу “ес” будет найдено это слово.

И не забываем обновлять индекс

0 7 * * * /usr/bin/indexer --rotate joomla_articles joomla_categories > /dev/null 2>&1



Плагин взял здесь devwebprog.powerhost.pw
Немного информации по параметрам на habrahabr
А здесь можно найти плагин для Joomla 3 (с 2.5 почему-то не заработал) и немного информации по настройке www.ivinco.com

Добавить комментарий