Sphinx search engine astra linux

Содержание
  1. Установка sphinx на linux. Индексация и поиск.
  2. Что такое sphinx?
  3. Sphinx индексация
  4. Подключиться к sphinx из консоли
  5. Заключение.
  6. Installing Sphinx¶
  7. Overview¶
  8. Linux¶
  9. Debian/Ubuntu¶
  10. RHEL, CentOS¶
  11. Other distributions¶
  12. macOS¶
  13. Homebrew¶
  14. MacPorts¶
  15. Anaconda¶
  16. Windows¶
  17. Chocolatey¶
  18. Other Methods¶
  19. Installation from PyPI¶
  20. Using virtual environments¶
  21. Docker¶
  22. Installation from source¶
  23. Sphinx. Установка и настройка.
  24. Установка и настройка Sphinx на Linux
  25. Настройка Sphinx
  26. Блок source
  27. Блок index
  28. Блок indexer
  29. Блок searchd
  30. Запускаем sphinx
  31. Запускаем переиндексацию по крону
  32. Защита служебных портов
  33. Скрипт автозапуска searchd для init.d
  34. Пример Sphinx поиска на реальном проекте — магазин автозапчастей Tecdoc
  35. 1. Вступление
  36. 2. Создание единого конфиг файла для windows development и linux production ОС
  37. 3. SetMatchMode(SPH_MATCH_EXTENDED2) и почему SPH_MATCH_ANY и другие не подходят для реального поиска
  38. 4. SetSortMode(SPH_SORT_RELEVANCE), SetFieldWeights — сортировка по релевантности и установка весов для полей индекса
  39. 5. SetLimits(0,20) — ограничение вывода результатов
  40. 6. AddQuery, RunQueries — построение мультизапросов
  41. 7. SetFilter, ResetFilters — добавление фильтрации в мультизапросе для ограничения получаемых данных
  42. 8. Wordforms — использование синонимов и преодоление ограничений для нестандартных словоформ, как «C#»
  43. Исходные коды, архивы, ссылки на полезные сайты

Установка sphinx на linux. Индексация и поиск.

Статья вводная, будет полезна новичкам, которые впервые хотят установить сфинкс, индексировать и искать контент, или тем, кто имеет небольшой опыт работы с sphinx.

Что такое sphinx?

Сфинкc — это бесплатный полнотекстовый поисковый движок, написанный на C++. С быстрой индексацией документов, стоп-словами, умеет интегрироваться с самыми известными БД: Mysql, MsSql, Oracle и тд, также имеет АПИ с популярными языками программирования PHP, Perl, Java и т.д. И! Имеет поддержку SQL синтаксиса.

Конфигурационный файл sphinx лежит по пути:

Запуск и остановка демона sphinx

Чтобы настроить конфигурацию, мы будем править конфиг:

Sphinx индексация

Производим поиск по sphinx

Результаты поиска на скрине:

Подключиться к sphinx из консоли

Подключиться к sphinx из консоли можно точно также, как и к mysql. Главное, указать порт и хост. Xост указывать обязательно, т.к. под юниксами без него не взлетит: libmysqlclient по умолчанию коннектится на UNIX-сокет, а не TCP-порт, поэтому просто -P недостаточно.

Порт тот же самый, который указан в вашем конфиге для sphinx (например, в моём конфиге sphinx.conf: строка listen = 9324:mysql41).

Заключение.

Работать со финкс достаточно просто. После добавления нового индекса делаем:

sudo indexer -c sphinx.conf wi_backend__sph_sites # производим индексацию

или sudo indexer —rotate -c sphinx.conf wi_backend__sph_sites

Затем запускаем поискового демона, если он еще не запущен. Если же уще запущен, то система любезно об этом сообщит:

Источник

Installing Sphinx¶

Overview¶

Sphinx is written in Python and supports Python 3.6+. It builds upon the shoulders of many third-party libraries such as Docutils and Jinja, which are installed when Sphinx is installed.

Linux¶

Debian/Ubuntu¶

Install either python3-sphinx using apt-get:

If it not already present, this will install Python for you.

RHEL, CentOS¶

Install python-sphinx using yum:

If it not already present, this will install Python for you.

Other distributions¶

Most Linux distributions have Sphinx in their package repositories. Usually the package is called python3-sphinx , python-sphinx or sphinx . Be aware that there are at least two other packages with sphinx in their name: a speech recognition toolkit (CMU Sphinx) and a full-text search database (Sphinx search).

macOS¶

Sphinx can be installed using Homebrew, MacPorts, or as part of a Python distribution such as Anaconda.

Homebrew¶

For more information, refer to the package overview.

MacPorts¶

Install either python3x-sphinx using port:

To set up the executable paths, use the port select command:

For more information, refer to the package overview.

Anaconda¶

Windows¶

Sphinx can be install using Chocolatey or installed manually .

Chocolatey¶

You would need to install Chocolatey before running this.

For more information, refer to the chocolatey page.

Other Methods¶

Most Windows users do not have Python installed by default, so we begin with the installation of Python itself. To check if you already have Python installed, open the Command Prompt ( ⊞Win — r and type cmd). Once the command prompt is open, type python —version and press Enter. If Python is installed, you will see the version of Python printed to the screen. If you do not have Python installed, refer to the Hitchhikers Guide to Python’s Python on Windows installation guides. You must install Python 3.

Once Python is installed, you can install Sphinx using pip. Refer to the pip installation instructions below for more information.

Installation from PyPI¶

Sphinx packages are published on the Python Package Index. The preferred tool for installing packages from PyPI is pip. This tool is provided with all modern versions of Python.

On Linux or MacOS, you should open your terminal and run the following command.

On Windows, you should open Command Prompt ( ⊞Win — r and type cmd) and run the same command.

After installation, type sphinx-build —version on the command prompt. If everything worked fine, you will see the version number for the Sphinx package you just installed.

Читайте также:  Apple hfs для windows

Installation from PyPI also allows you to install the latest development release. You will not generally need (or want) to do this, but it can be useful if you see a possible bug in the latest stable release. To do this, use the —pre flag.

Using virtual environments¶

When installing Sphinx using pip, it is highly recommended to use virtual environments, which isolate the installed packages from the system packages, thus removing the need to use administrator privileges. To create a virtual environment in the .venv directory, use the following command.

You can read more about them in the Python Packaging User Guide.

Note that in some Linux distributions, such as Debian and Ubuntu, this might require an extra installation step as follows.

Docker¶

Docker images for Sphinx are published on the Docker Hub. There are two kind of images:

Former one is used for standard usage of Sphinx, and latter one is mainly used for PDF builds using LaTeX. Please choose one for your purpose.

sphinxdoc/sphinx-latexpdf contains TeXLive packages. So the image is very large (over 2GB!).

When using docker images, please use docker run command to invoke sphinx commands. For example, you can use following command to create a Sphinx project:

And you can following command this to build HTML document:

For more details, please read README file of docker images.

Installation from source¶

You can install Sphinx directly from a clone of the Git repository. This can be done either by cloning the repo and installing from the local clone, on simply installing directly via git.

Источник

Sphinx. Установка и настройка.

Поисковая машина Sphinx – это полнотекстовая поисковая система, которая бесплатна, быстра и масштабируема. Она предназначена для производительности и актуальности. Не имеет аналогов ни в одной традиционной базе данных.

Установка и настройка Sphinx на Linux

Чтобы установить Sphinx на сервер Ubuntu, введите:

Поисковая система Sphinx успешно установлена на сервер. После установки Sphinx нуждается в дополнительной настройке.

Настройка Sphinx

Конфигурации Sphinx должны храниться в файле sphinx.conf в каталоге /etc/sphinxsearch. Они состоят из трёх основных блоков: index, searchd и source. Описание каждого из них и общий вид конфигурационного файла можно найти ниже.

Для начала создайте конфигурационный файл:

Блок source

Блок source содержит описание источника данных для нашего индекса, параметров доступа к ним, атрибутов и правил их анализа.. Первый столбец sql_query должен содержать уникальный ID. Запрос SQL будет выполняться для каждого индекса, а затем передавать данные в индексный файл Sphinx.

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

Что еще интересного из настроек:

  • sql_query_range — запрос который должен возвращать минимальное и максимальное значение id индексируемых записей, парамаметр пригодится для ranged query.
  • sql_range_step — количество записей получаемых за одну итерацию в ranged query.

Блок index

Блок index содержит настройки построения индекса с использованием источника.

Описание настроек:

  • docinfo — тип хранения атрибутов индекса. Может принимать значения none, extern и inline. None уместен когда индекс не имеет атрибутов, при выборе inline атрибуты будут храниться в .spd файле вместе с документами, а при extern для них будет создан отдельный .spa файл.
  • dict — тип словаря, crc или keywords. crc лучше использовать когда не нужен поиск по подстрокам. Keywords быстрее работает с подстроками, поддерживает wildcard поиск и размер индекса получается в 3-10 раз меньше.
  • morphology — морфологический препроцессор. Препроцессор применяется к индексируемым словам чтобы заменить различные формы одного слова нормализованной формой. Sphinx имеет три вида морфологических препроцессоров: лемматизатор, стеммер и фонетические алгоритмы. Стоит отметить, что Sphinx имеет поддержку русского языка из коробки. Также имеется поддержка libstemmer.
  • stopwords — путь к файлу со списком стоп-слов (разделенных пробелами). Стоп-слова не учитываются при поиске.stopwords — путь к файлу со списком стоп-слов (разделенных пробелами). Стоп-слова не учитываются при поиске.
  • wordforms — путь к файлу со списком словоформ, например «hypertext preprocessor > php».
  • min_word_len — минимальная длина индексируемого слова.
  • html_strip — параметр определяет нужно ли удалять html теги из входных данных.

Блок indexer

Блок indexer содержит настройки индексатора

Блок searchd

Блок searchd содержит порты и переменные для запуска демона Sphinx.

Настройки демона обычно всегда стандартные, указываем адрес, порт демона и пути к логам

Описание настроек:

  • listen — адрес и порт, на котором нужно запустить Sphinx, и используемый протокол (в руководстве – 9306:mysql41). Популярные протоколы Sphinx — sphinx (SphinxAPI) и :mysql41 (SphinxQL).
  • log — путь к файлу лога.
  • query_log — путь к файлу лога запросов.
  • read_timeout — тайм-аут чтения в секундах.
  • max_children — максимальное количество форков.
  • seamless_rotate — предотвращает останов searchd при кэшировании большого объема данных.
  • preopen_indexes — указывает, нужно ли предварительно открывать все индексы.
  • pid_file — путь к PID файлу, обязательный параметр.
  • workers — тип мультипроцессорного режима. None для выключения, все запросы будут выполняться синхронно один за одним. Fork и prefork — новый процесс будет форкнут для обработки запроса. И thread — когда для обработки запроса будет создан новый поток. Последний необходим для работы real-time индекса.
Читайте также:  Смена аватарки windows 10

Запускаем sphinx

После того как мы создали файл конфигурации sphinx.conf, нам надо проиндексировать данные из нашей БД. Для этого в консоли запускаем индексатор:

В случае успешного индексирования получим примерно вот такие строки:

Ошибок нет, все работает.

Запускаем поискового демона:

В случае успешного запуска должны увидеть примерно вот такой вывод:

Коннектимся к демону по SQL протоколу что бы проверить его работоспособность:

Теперь можно использовать консольный mysql клиент. Полное описание протокола SQL, реализованного в SphinxQL читайте по ссылке http://sphinxsearch.com/docs/current.html#sphinxql-reference

Запускаем переиндексацию по крону

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

Защита служебных портов

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

Где eth0 — имя сетевого интерфейса, который смотрит в интернет.

Скрипт автозапуска searchd для init.d

Теперь нужно сделать так чтобы демон searchd стартовал при загрузке/перезагрузке операционной системы. Ниже приведен пример создания и настройки скрипта для Debian/Ubuntu GNU/Linux без использования systemd.

Откроем для редактирования новый скрипт инициализации в папке «/etc/init.d» и добавим туда следующие строчки:

Установим права на скрипт запуска и зарегистрируем его в автозапуске:

Для надежности можете перезагрузить свой сервер и проверить запустился ли демон searchd:

Источник

Пример Sphinx поиска на реальном проекте — магазин автозапчастей Tecdoc

1. Вступление

Если сфинкс еще не установлен и хотите начать, ссылка на статью для новичка: Создание ознакомительного поискового движка на Sphinx + php. Потестировать и посмотреть как работает этот поиск можно по адресу autoklad.biz/?action=search.

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

Авто запчастями, а точнее продажей интернет магазинов по запчастям, наша компания занимается давно, плодотворно и довольно успешно. Но в силу ряда причин релевантный поиск понадобился только сейчас. Основная причина скорее всего в том, что большинству запчастей полнотекстовый поиск не подходит. Но есть 5-10% товаров, для которых он катастрофически нужен и без него уж никак. А наш стандартный поиск с прямыми по своей сути кросс связями и указанием четкой модели и марки авто из tecdoc, для этой группы товаров не работает. Пример таких «неправильных» товаров: масла, шины, аккумуляторы и другие подобные.

Средний прайс по запчастям небольшой рядовой компании — 2-10 млн позиций, соответственно 10% от этой базы и будут занимать нужные нам данные. То есть индекс в приведенных ниже примерах строится по базе около 300 тысяч документов.

2. Создание единого конфиг файла для windows development и linux production ОС

Решаемая проблема — конфигурационные файлы машины разработчика и продакшин сервера отличаются, а при разработке нужно оперативно обновлять неустоявшуюся структуру и постоянно менять эти сфинкс конфиги. Усугубилось в нашем случае тем, что эти конфиги на сервере нужно делить с отдельным проектом другой команды разработки, а такой секции как «include *.conf» в сфинксе пока не предусмотрено.

На локальной windows машине конфиг лежит в «D:\Sphinx\sphinx.conf», на сервере в «/etc/sphinx/sphinx.conf», причем на линукс машине создана символическая ссылка на обновляемый скриптом Search->CreateConfigFile() файл в /var/www/autoklad.com.ua/imgbank/sphinx/sphinx.conf. Локальный файл обновляется прямо в папку, так как он не мешает соседям.

Исходный код методов:

Шаблон config_price_group.tpl, остальные — в архиве, чтобы не растягивать статью

Запрос можно было бы упростить представлением (view), но насколько я понял этого делать не рекомендуют и прямой запрос к данным с джойнами эффективнее по соображениям создаваемой нагрузки при индексировании.

Значение констант, которые берутся из бд для локального сайта

Значение констант, которые берутся из бд для продакшин сайта

В результате работы для локального сфинкса мы имеем вот такой конфиг файл:
http://www.mstarproject.com/temp/3/sphinx/sphinx.conf

3. SetMatchMode(SPH_MATCH_EXTENDED2) и почему SPH_MATCH_ANY и другие не подходят для реального поиска

Для того, чтобы работала морфология и в запросе «масла Castrol 5W40» нашлись документы с текстом «Масло» и «15W40» — нужно одновременно использовать символ «*» и поиск по словоформе «масл», а для этого нужен построитель запросов, который работает именно в режиме «SPH_MATCH_EXTENDED2». Есть также SPH_MATCH_EXTENDED, но как я понял это старая версия и рекомендуют использовать новую версию режима.

В режиме SPH_MATCH_ANY нельзя добиться того, чтобы при увеличении слов в запросе — количество результатов уменьшалось. В режиме SPH_MATCH_ALL нельзя добиться одновременной работы режима по частичному вхождению и словоформе. Другие режимы вскользь просмотрел, пока не пригодились, поэтому ничего сказать по ним не могу.

Сам запрос к сфинксу по фразе «масла Castrol 5W40» будет выглядеть так:

Важно: в конфиге используемого индекса должно быть 2 строки:

Читайте также:  Asus sonicmaster drivers windows 10

Первая позволяет искать по частичному вхождению слово справа и слева, то есть с конца и с начала слова. Вторая строка позволяет использовать в запросе «*». Можно использовать min_prefix_len, если нужно к примеру только вхождения слева (с начала) слова.

Функция, которая обрабатывает входящую строку и формирует правильный запрос:

Результат запроса можно протестировать по адресу: http://autoklad.biz/?action=search&search[query]=%D0%BC%D0%B0%D1%81%D0%BB%D0%BE%20Castrol%205W40&search[id_price_group]=35
Ниже результатов поиска выведен результирующий массив, который возвращает сфинкс для обработки — обратить внимание на секцию [words], в котором указано, по каким словам какое количество документов найдено. Другие секции не менее важны, но о них пока речь не идет.

Также очень частым на форуме и сайте разработчиков вопросом является «Как поднять повыше точное вхождение фразы?», то есть чтобы вес документа «Искомое_слово» был выше «Искомое_слово а также еще кучу текста». Ответ — нужно использовать SPH_RANK_SPH04, специально созданный под эту типовую задачу, как я понял.

4. SetSortMode(SPH_SORT_RELEVANCE), SetFieldWeights — сортировка по релевантности и установка весов для полей индекса

Данный метод определяет, какие результаты будут выше в отсортированном массиве данных, возвращаемых сфинксом. В случае с SPH_SORT_RELEVANCE — результат будет отсортирован по т.н. «релевантности». Релевантность, как бы нам того не хотелось, работает по чисто арифметическим правилам, а не так как у гугл или яндекс поиска. То есть никакой магии: перемножение и сложение веса индекса, веса поля, количества вхождения искомого слова в документ и частота этого слова в других документах.

Мы на вход задаем в самом простом случае веса для полей индекса:

а на выходе получаем отсортированный по «релевантности»=«суммарному весу» массив, где вес — это целочисленное значение. Этими числами можно управлять, настраивая релевантность под себя, то есть более важному полю нужно присваивать больший вес. В нашем примере самое важное поле — это код запчасти «code».

5. SetLimits(0,20) — ограничение вывода результатов

Данный метод самый простой, работает аналогично майскл-евскому limit 0,20 и нужен соответственно для того же: для получения порционных данных для построения степперов. В нашем проекте нужны просто первые 20 (константа) результатов, так как дальше по шагам, если их будет 3 и более смысла идти нету.

6. AddQuery, RunQueries — построение мультизапросов

Мультизапросы — очень удобное решение пакетных запросов, когда нужно послать не один запрос сфинксу, а несколько. В нашем примере это отправка всем группам запчастей одного и того же запроса для получения списка групп и количества записей в каждой группе. То есть посылается около 100 запросов, а возвращается один результат в одном соединении к сфинксу. Также «решено» ограничение в 32 максимально допустимых одновременных запросов в одном пакете запросов.

По причине того, что у выполняемого задания были конечные сроки, — вникнуть во все тонкости запросов на старте, задача не ставилась. Поэтому я наверняка написал велосипед, который решает задачу «группированного» запроса, аналогичного group by в mysql. С другой стороны, если бы я разобрался с группировкой в сфинкс — не было бы примера, где можно использовать мультизапросы.

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

7. SetFilter, ResetFilters — добавление фильтрации в мультизапросе для ограничения получаемых данных

Для того, чтобы использовать фильтры — нужно сначала прописать в конфиг индекса поля, по которым будет использоваться фильтрация. В нашем примере это поле id_price_group:

Соответственно в коде используется вот так:

То есть в цикле foreach для каждого запроса в мультизапросе сначала устанавливается фильтр, а после добавления — сбрасывается, чтобы для других запросов он не работал. По-моему все логично, очевидно и трудностей возникнуть не должно.

8. Wordforms — использование синонимов и преодоление ограничений для нестандартных словоформ, как «C#»

Чтобы работали синонимы и нестандартные (свои) словоформы — нужно в конфиг индекса включить файл с такими словоформами:

Сам файл может содержать к примеру такой набор данных в UTF-8 кодировке:

То есть с левой стороны все возможные синонимы — с правой значения этих слов. Причем слева не должно быть к примеру «bosch», если он уже есть справа. По крайней мере если это сделать — поиск ведет себя не так, как я ожидал.

В нашем примере можно использовать запрос «масла кастрол 5W40» и он найдет то же, что и «масла Castrol 5W40». В примере с «C#» нужно включать такие нестандартные словоформы, чтобы они не обрабатывались по стандартной схеме индекса и работали вручную именно так, как вы их настроите. Только вы знаете, какой именно смысл в вашем проекте несет фраза, к примеру «C#» = «ДО ДИЕЗ для музыкантов»

Данного функционала нету в конфиг файле и примере на сервере, приведен только пример, но еще не внедрен в существующей структуре синонимов проекта.

Исходные коды, архивы, ссылки на полезные сайты

* Неофициальная вики документация, в том числе и на не английском языках http://sphinxsearch.com/wiki/doku.php

Буду рад конструктивной критике и постараюсь ответить на возникшие вопросы. На конференцию в Санкт-Петербурге скорее всего не поеду: очень неудобный перелет, да и зима как никак. Решил, что пользы будет больше от статьи, а с автором сфинкса можно встретиться в Украине, нужно только подождать.

Источник

Оцените статью