В Moguta.CMS поддерживается три типа поиска товаров по каталогу.
Можно настроить фильтры по товарам различным образом, например вы можете выводить фильтры по характеристикам вложенных категорий или фильтровать товар исключительно в конкретной категории.
По умолчанию, из коробки используется "Обычный" тип поиска по вхождению подстроки в названии товара или артикул. Реализовано это обычным оператором LIKE %...% в MySQL запросе. Но так же присутствует и два альтернативных механизма поиска: "Полнотекстовый" (FULTEXT) и "Морфологический" (SPHINX).
Чтобы поиск учитывал описание товара, можно переключить режим на полнотекстовый поиск, для этого в настройка панели управления, перейдите в раздел "Фильтры и поиск по сайту" и выберите из выпадающего списка "Полнотекстовый" тип поиска.
Переключение на полнотекстовый поиск ускорит поиск в объемных каталогах. Но данный способ поиска требует дополнительных настроек MySQL сервера на вашем хостинге. Например, по умолчанию в MySQL не будут искаться слова содержащие знаки дефиса, это может быть неудобно при поиске товара по артикулу или модельному номеру, также изначально поиск ищет только по словам не меньше 4-х букв. Чтобы изменить это на сервере в MySQl, необходимо отредактировать конфигурационный файл my.cnf
[mysqld] ft_min_word_len=3
После этого сервер необходимо перезагрузить, чтобы настройки применились.
Данный тип поиска не доступен начиная с версии 9.4 из-за перехода на новый тип хранения таблиц в базе InnoDB. Для полнотекстового поиска необходимо настраивать Sphinx.
Хотите поиск как в Yandex или Google? Тогда вам подойдет этот вариант. Самый удобный и качественный поиск в Moguta.CMS достигается путем использования поискового движка Sphinx! Официальный сайт движка: http://sphinxsearch.com/ Чтобы пользоваться этим поисковым движком необходимо установить его на вашем сервере.
Сложность заключается в том, что необходимо администрировать сервер, но не все хостинги позволяют это сделать. Для установки и настройки поискового движка Sphinx мы сделали две инструкции. Если не получилось по первой, то выполните вторую инструкцию.
Получаем надпись Complete!
Настройка Sphinx
source s_DB
{
type = mysql
sql_host = localhost
sql_user = moguta
sql_pass = 8X7n2F3o
sql_db = moguta
sql_port = 3306
}
source product: s_DB
{
sql_query_pre = SET NAMES UTF8
sql_query = SELECT p.id, p.title, pv.title_variant, p.code, pv.code as codevariant, p.meta_title, p.description, p.meta_desc, p.meta_keywords FROM `mg_product` as p LEFT JOIN `mg_product_variant` pv ON p.id = pv.product_id
}
source property: s_DB
{
sql_query_pre = SET NAMES UTF8
sql_query = SELECT product_id as id, name FROM `mg_product_user_property_data`
}
index product
{
source = product
path = /var/lib/sphinx/product
ondisk_attrs = 1
morphology = stem_en, stem_ru
dict = keywords
min_word_len = 2
min_infix_len = 2
html_strip = 0
index_exact_words = 1
expand_keywords = 1
}
index property
{
source = property
path = /var/lib/sphinx/property
ondisk_attrs = 1
morphology = stem_en, stem_ru
dict = keywords
min_word_len = 2
min_prefix_len = 2
html_strip = 0
index_exact_words = 1
expand_keywords = 1
}
indexer
{
mem_limit = 32M
}
searchd
{
listen = 9312
listen = 9306:mysql41
log = /var/log/sphinx/searchd.log
query_log = /var/log/sphinx/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/sphinx/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # for RT to work
binlog_path = /var/lib/sphinx/
}
Остановить sphinx можно так service searchd stop
Запустить sphinx можно так service searchd start
Установка из пакета скаченного с официального сайта http://sphinxsearch.com/downloads/release/ После установки необходимо будет заменить содержание конфигурационного файла /etc/sphinxsearch/sphinx.conf на предоставленные ниже:
source s_DB
{
type = mysql
sql_host = localhost
sql_user = #Пользователь базы данных
sql_pass = #Пароль базы данных
sql_db = #Название базы данных
sql_port = 3306
}
source product: s_DB
{
sql_query_pre = SET NAMES UTF8
sql_query = SELECT p.id, p.title, pv.title_variant, p.code, pv.code as codevariant, p.meta_title, p.description, p.meta_desc, p.meta_keywords FROM `mg_product` as p LEFT JOIN `mg_product_variant` pv ON p.id = pv.product_id
}
source property : s_DB
{
sql_query_pre = SET NAMES UTF8
sql_query = SELECT product_id as id, name FROM `mg_product_user_property_data`
}
index product
{
source = product
path = /usr/local/sphinx/var/data/product
ondisk_attrs = 1
morphology = stem_en, stem_ru
dict = keywords
min_word_len= 2
min_infix_len = 2
html_strip = 0
index_exact_words = 1
expand_keywords = 1
}
index property
{
source = property
path = /usr/local/sphinx/var/data/property
ondisk_attrs = 1
morphology = stem_en, stem_ru
dict = keywords
min_word_len = 2
min_prefix_len = 2
html_strip = 0
index_exact_words = 1
expand_keywords = 1
}
indexer
{
mem_limit = 32M
}
searchd
{
listen = 9312
listen = 9306:mysql41
log = /usr/local/sphinx/var/log/searchd.log
query_log = /usr/local/sphinx/var/log/query.log
read_timeout = 5
client_timeout = 300
max_children = 30
pid_file = /usr/local/sphinx/var/log/searchd.pid
seamless_rotate = 1
preopen_indexes = 0
unlink_old = 1
mva_updates_pool = 1M
max_packet_size = 8M
max_filters = 256
max_filter_values = 4096
}
# --eof--
Когда конфиг будет изменен и сохранен, можно будет проиндексировать базу товаров, для этого в терминале запускаем индекс:
/usr/bin/indexer --all --rotate
Индекс прошел успешно если в папке /usr/local/sphinx/var/data/ создадутся подпапки product/ и property/ файлы с индексами, а в терминале должны увидеть что-то похожее:
Sphinx 2.2.11-id64-release (95ae9a6)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinxsearch/sphinx.conf'...
indexing index 'product'...
WARNING: Attribute count is 0: switching to none docinfo
collected 51 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 51 docs, 49931 bytes
total 0.096 sec, 515517 bytes/sec, 526.55 docs/sec
indexing index 'property'...
WARNING: Attribute count is 0: switching to none docinfo
collected 300 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 300 docs, 4449 bytes
total 0.014 sec, 304913 bytes/sec, 20560.61 docs/sec
total 6 reads, 0.000 sec, 16.4 kb/call avg, 0.0 msec/call avg
total 18 writes, 0.000 sec, 9.3 kb/call avg, 0.0 msec/call avg
rotating indices: successfully sent SIGHUP to searchd (pid=2390).
Дальше следует запустить сам поисковый движок командой: /usr/bin/searchd
После этого в файле config.ini, который находится в корне вашего сайта установите значение директив (В новых версиях это нужно сделать в настройках в панели управления, при выборе типа морфологического поиска)
EARCH_SPHINX = 1
SEARCH_SPHINX_HOST = "localhost"
SEARCH_SPHINX_PORT = "9312"
Теперь можно проверить результаты работы поиска на сайте. Поиск теперь будет учитывать не только названия товаров, артикулов, и описания, но также будет искать среди характеристик товаров. Помимо этого поиск будет учитывать словоформы. Если вы хотите настроить поисковую выдачу по особенным параметрам, то сделать это можно в файле /etc/sphinxsearch/sphinx.conf полагаясь на официальную документацию: http://sphinxsearch.com/docs/current.html
Инструкция №3
Если не получилось установить из готового пакета, то можно собрать сервер из исходников следующим способом:
1. Скачиваем сфинкс и в терминале пишем следующее
wget -c "http://sphinxsearch.com/files/sphinx-2.2.11-release.tar.gz" && ls
tar -xf sphinx-2.2.11-release.tar.gz
cd sphinx-2.2.11-release
2. Устанавливаем необходимые библиотеки для работы и установки сфинкса
aptitude install g++
aptitude install libmysqlclient-dev
3. Теперь компилируем Sphinx из исходников скачаных на шаге 1:
./configure --with-mysql --prefix=/usr/local/sphinx
Если на этом этапе возникает ошибка "ERROR: cannot find MySQL include files.". в таком случае выполняем пункт 2 и 3 заново.
4. Теперь должно появиться сообщение "You can now run 'make install' to build and install Sphinx binaries".
5. Выполняем команду sudo make install . Если все прошло успешно, то на сервере появится папка по адресу /usr/local/sphinx
6. Копируем шаблон файла настроек, приведенный выше с настройками для Moguta.CMS и редактируем его содержимое под наши нужды:
cp /usr/local/sphinx/etc/sphinx.conf.dist /usr/local/sphinx/etc/sphinx.conf
nano /usr/local/sphinx/etc/sphinx.conf
Запускаем индексацию:
/usr/local/sphinx/bin/indexer --all --rotate
Запускаем Sphinx:
/usr/local/sphinx/bin/searchd
Осталось сделать чтобы Sphinx запускался сразу при загрузке/перезагрузке сервера, а также настроить периодичность индексирования данных создаем файл searchd в директории /etc/init.d/
nano /etc/init.d/searchd
Копипастим нижеприведенный скрипт в файл /etc/init.d/searchd :
#!/bin/bash
#!/bin/sh
### BEGIN INIT INFO
# Provides: searchd
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: true
# Short-Description: Stop/Start SphinxSearch Daemon
### END INIT INFO
case "${1:-''}" in
'start')
/usr/local/sphinx/bin/searchd
;;
'stop')
/usr/local/sphinx/bin/searchd --stop
;;
'restart')
/usr/local/sphinx/bin/searchd --stop
sleep 1
/usr/local/sphinx/bin/searchd
;;
*)
echo "Usage: $SELF start|stop|restart"
exit 1
;;
esac
Даем права на скрипт запуска и регистрируем его в автозапуске:
chmod +x /etc/init.d/searchd
update-rc.d searchd defaults
Для проверки перезапустим сервер и проверим запустился ли демон searchd:
reboot
ps ax | grep searchd
Добавляем в крон (crontab) запуск индексатора каждые сутки (или другую периодичность запуска), для этого открываем файл:
/etc/crontab
Дописываем в конец эту строчку:
0 0 * * * root /usr/local/sphinx/bin/indexer --rotate --all --config /usr/local/sphinx/etc/sphinx.conf
можно указать любой другой путь к файлу с конфигом
0 0 * * * root /usr/bin/indexer --rotate --all --config /etc/sphinx/sphinx.conf
Все готово!
Вы установили и настроили поисковый сервер Sphinx. Sphinx открывает порты 9312, 9306 (указанные в настройках) на всех интерфейсах, настоятельно рекомендуем прикрыть их при помощи фаервола на наружном интерфейсе. Вот два простых правила для IPTABLES. Где eth0 - имя наружного сетевого интерфейса.
ptables -A INPUT -p tcp -i eth0 --dport 9306 -j DROP
iptables -A INPUT -p tcp -i eth0 --dport 9312 -j DROP