Поиск по каталогу

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

По умолчанию, из коробки используется поиск по вхождению подстроки в названии товара или артикул. Реализовано это обычным оператором LIKE %...% в MySQL запросе.


Тип поиска "FULLTEXT"


Чтобы поиск учитывал описание товара, можно переключить режим на полнотекстовый поиск, для этого в файле config.ini необходимо установить значение директивы



SEARCH_FULLTEXT = 1


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

Чтобы изменить это на сервере в MySQl, необходимо отредактировать конфигурационный файл my.cnf




[mysqld]
ft_min_word_len=3


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

Тип поиска "SPHINX"

Хотите поиск как в яндекс или гугл? Тогда вам подойдет этот вариант.

Самый удобный и качественный поиск в Moguta.CMS достигается путем использования поискового движка сфинкс! Официальный сайт движка: http://sphinx.ogr 

Чтобы пользоваться этим поисковым движком необходимо установить его на вашем хостинге или VPS сервере.
Сложность заключается в том что не все хостинги позволяют это сделать. 

Как установить Sphinx? В интернете куча различных материалов по данному вопросу.
Самый простой способ это установка из пакета скаченного с официального сайта 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, value FROM `mg_product_user_property`
}

index product 
{
    source = product 
    path = /usr/local/sphinx/var/data/product
    ondisk_attrs=1
    morphology = stem_en, stem_ru
    dict = keywords
    min_word_len= 1
    min_prefix_len = 2
    html_strip = 0
    index_exact_words=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= 1
    min_prefix_len = 2
    html_strip = 0
    index_exact_words=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, который находится в корне вашего сайта установите значение директив



SEARCH_SPHINX = 1
SEARCH_SPHINX_HOST = "localhost"
SEARCH_SPHINX_PORT = "9312"


Теперь можно проверить результаты работы поиска на сайте. Поиск теперь будет учитывать не только названия товаров, артикулов, и описания, но также будет искать среди своиств товаров мета данных. Помимо этого поиск будет учитывать словоформы. Если вы хотите настроить поисковую выдачу по особенным параметрам, то сделать это можно в файле  /etc/sphinxsearch/sphinx.conf полагаясь на официальную документацию: http://sphinxsearch.com/docs/current.html


Тем у кого не получилось установить из пакета можно собрать сервер из исходников следующим способом:

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. Теперь компилируем наш сфинкс из исходников скачаных на шаге 1:
   
 ./configure --with-mysql --prefix=/usr/local/sphinx

    "Внимание! если на этом этапе возникает ошибка ERROR: cannot find MySQL include files.
    значит вы не установили выполнили aptitude install libmysqlclient-dev 
    В таком случае выполняем пункт 2 и снова запускаем команду: ./configure --with-mysql --prefix=/usr/local/sphinx

4. После выше сделанного еперь должно появиться сообщение 
    You can now run 'make install' to build and install Sphinx binaries.
5. Теперь делаем 
    make
    sudo make install

    Если все прошло успешно, то на сервере появится папка со финксом по адресу /usr/local/sphinx

6. Копируем шаблон файла настроек, приведенный выше с настройками для могуты и редактируем его содержимое под наши нужды:




   cp /usr/local/sphinx/etc/sphinx.conf.dist /usr/local/sphinx/etc/sphinx.conf
    nano /usr/local/sphinx/etc/sphinx.conf

запускаем индекс:



/usr/bin/indexer --all --rotate


Запускаем поисковик



/usr/bin/searchd


Надеюсь у вас все получилось? - отлично! Теперь осталось сделать чтобы демон стартовал при загрузке/перезагрузке ОС, а также настроить периодику индексирования данных.




nano /etc/init.d/searchd
Копипастим (CTRL+C, CTRL+V) этот текст в скрипт /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

Добавляем в крон(crontab) запуск индексатора каждые сутки:




nano /etc/crontab

Дописываем в конец эту строчку:




0  0    * * *   root    /usr/local/sphinx/bin/indexer --rotate --all --config /usr/local/sphinx/etc/sphinx.conf

Все готово! Вы установили и настроили поисковый сервер Sphinx.

Ах да...про безопасность еще хочу упомянуть: сфинкс открывает порты 9312, 9306(указанные в настройках) на всех интерфейсах, настоятельно рекомендую прикрыть их при помощи файрвола на наружном интерфейсе(интернет). Вот два простых правила для IPTABLES:





iptables -A INPUT -p tcp -i eth0 --dport 9306 -j DROP
iptables -A INPUT -p tcp -i eth0 --dport 9312 -j DROP

Где eth0 - имя наружного сетевого интерфейса.

Комментарии

Имя:
E-mail:
Введите текст с картинки: Введите текст с картинки