Фильтры и поиск по сайту

В Moguta.CMS поддерживается три типа поиска товаров по каталогу.

Можно настроить фильтры по товарам различным образом, например вы можете выводить фильтры по характеристикам вложенных категорий или фильтровать товар исключительно в конкретной категории.

Видео

По умолчанию, из коробки используется "Обычный" тип поиска по вхождению подстроки в названии товара или артикул. Реализовано это обычным оператором LIKE %...% в MySQL запросе. Но так же присутствует и два альтернативных механизма поиска: "Полнотекстовый" (FULTEXT) и "Морфологический" (SPHINX).

Настройки поиска в Moguta.CMS

Тип поиска "Полнотекстовый" (FULLTEXT) 

Чтобы поиск учитывал описание товара, можно переключить режим на полнотекстовый поиск, для этого в настройка панели управления, перейдите в раздел "Фильтры и поиск по сайту" и выберите из выпадающего списка "Полнотекстовый" тип поиска.

Переключение на полнотекстовый поиск ускорит поиск в объемных каталогах. Но данный способ поиска требует дополнительных настроек MySQL сервера на вашем хостинге. Например, по умолчанию в MySQL не будут искаться слова содержащие знаки дефиса, это может быть неудобно при поиске товара по артикулу или модельному номеру, также изначально поиск ищет только по словам не меньше 4-х букв. Чтобы изменить это на сервере в MySQl, необходимо отредактировать конфигурационный файл my.cnf

[mysqld] ft_min_word_len=3

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

Данный тип поиска не доступен начиная с версии 9.4 из-за перехода на новый тип хранения таблиц в базе InnoDB. Для полнотекстового поиска необходимо настраивать Sphinx.

Тип поиска "Морфологический" (SPHINX)

Хотите поиск как в Yandex или Google? Тогда вам подойдет этот вариант. Самый удобный и качественный поиск в Moguta.CMS достигается путем использования поискового движка Sphinx! Официальный сайт движка: http://sphinxsearch.com/ Чтобы пользоваться этим поисковым движком необходимо установить его на вашем сервере.

Сложность заключается в том, что необходимо администрировать сервер, но не все хостинги позволяют это сделать. Для установки и настройки поискового движка Sphinx мы сделали две инструкции. Если не получилось по первой, то выполните вторую инструкцию.

Инструкция №1

  1. Подключаемся по SSH к вашему серверу
  2. Скачиваем RPM архив wget http://sphinxsearch.com/files/sphinx-2.3.2-1.rhel6.x86_64.rpm
  3. Устанавливаем Sphinx командой: sudo yum install -y sphinx-2.3.2-1.rhel6.x86_64.rpm

Получаем надпись Complete!

Настройка Sphinx

  1. Открываем файл настроек, который доступен тут /etc/sphinx/sphinx.conf
  2. Вставляем следующее содержимое, не забыв указать свои параметры для подключения к БД. Актуальные параметры доступа, для подключения к базе, можно взять в config.ini находящемся в корне сайте.

Копируем содержимое этого спойера в файл sphinx.conf

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/
}

  1. Создаём новый индекс командой: sudo -u sphinx indexer --all --rotate
  2. В файл crontab прописываем задачу на переиндексацию базы, каждый час. @hourly /usr/bin/indexer --rotate --config /etc/sphinx/sphinx.conf --all

Остановить sphinx можно так service searchd stop
Запустить sphinx можно так service searchd start

Инструкция №2

Установка из пакета скаченного с официального сайта http://sphinxsearch.com/downloads/release/ После установки необходимо будет заменить содержание конфигурационного файла /etc/sphinxsearch/sphinx.conf на предоставленные ниже:


Копируем содержимое этого спойера в файл 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

sudo make install

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