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

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

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

  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
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#
# 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/ 
}

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

1
2
3
4
5
6
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 и попаданию в индекс слова “тест”, будут сохранены в индекс “те”, “тес”, “тест” и по запросу “ес” будет найдено это слово.

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

1
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

Скачать com_sphinxsearch_J2.5_v.0.0.1.zip
Скачать sphinx.conf.tar