Использование Sphinx в сложных задачах поиска

Использование Sphinx в сложных задачах поискаИспользование Sphinx в сложных задачах поиска

Sphinx – это поисковый сервер / движок. Sphinx предназначен для практически всех поисковых задач. Он может искать по тексту по релевантности, умеет искать склоняемые слова («котят» – «котята»), масштабируется горизонтально и имеет удобный интерфейс. Мне недавно пришлось изучить данный комбайн для одной весьма специфической задачи.

Постановка задачи

котят часто продают...

На самом деле, в проекте много сложных для объяснения вещей (не совсем полное техническое задание занимает под 500 страниц 12-м шрифтом), но в сильно упрощённом виде всё выглядит следующим образом:

Имеется Classified система - система с объявлениями различных категорий. У всех объявлений одной категории имеется определённый набор полей различных типов. Набор полей изменяется из административной панели.

Например, для объявлений раздела “Авто - Легковые авто” у нас имеется следующий набор полей:

  • Марка
  • Модель
  • Тип кузова
  • ...

Для объявлений раздела “Недвижимость - Квартиры - Продажа” поля такие:

  • Область
  • Город
  • Район
  • ...

Необходимо реализовать все возможные операции над объявлениями и, самое главное, их поиск.

Почему именно Sphinx?

Без Sphinx тут только костыли...

Я много, много думал и нашел всего 2 варианта хранения значения полей - сериализованные данные (JSON / XML / ...) в общей таблице объявлений или “кучка таблиц”. На первых порах, когда мы затевали этот проект, я не нашел ни одного варианта полноценного поиска по сериализованным данным (возможно, я просто плохо искал) и нам пришлось реализовывать “костыльный” вариант №2 - создавать по таблице значений для каждой категории, но с появлением в Sphinx (с версии 2.2.x) возможности поиска по JSON столбцам решено было перевести поиск на Sphinx.

Кроме того, у Sphinx есть определённые преимущества:

  • Sphinx быстрый и стабильный.
  • Sphinx лёгкий в освоении. Официально рекомендуемым протоколом работы со Sphinx есть SphinxQL - протокол на базе SQL. Полнотекстовый поиск, поиск по JSON и даже манипуляции с RealTime индексами не составляют особого труда тем, кто уже знает SQL.
  • Sphinx масштабируемый. Если в процессе роста проекта, загруженность поискового сервера будет подходить к пиковой - вы спокойно можете поднять поисковый кластер из нескольких машин и распределить нагрузку.
  • Sphinx популярный. Следовательно, в сети полно документации, проект постоянно развивается и его уверенно можно использовать в коммерческих продуктах.
  • Sphinx кроссплатформенный. У нас машины разработчиков работают, в основном, на Windows, а на сервере установлен Debian. Однако подобный “зоопарк” по зубам нашему монстру.

Итак, решено - будем использовать Sphinx. Так с чего же начать?

Установка Sphinx на Debian

В репозиториях Debian версии Sphinx обновляются достаточно редко, поэтому нам придётся устанавливать пакет вручную.

Шаг 1. Качаем отсюдава (http://sphinxsearch.com/downloads/release/). необходимый нам пакет.

Шаг 2. Устанавливаем библиотеки, необходимые для Sphinx:

$ sudo apt-get install mysql-client unixodbc libpq5

Шаг 3. Устанавливаем Sphinx из скачанного .deb пакета:

$ sudo dpkg -i sphinxsearch_2.3.1-beta-0ubuntu11~trusty_amd64.deb

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

Настройка Sphinx

Все настройи хранятся в файле sphinx.conf.

Исходная таблица

Я сильно упростил таблицу

Получение исходных данных

Конфигурация обычно начинается с секций source. Эти секции описывают данные, которые мы будем тянуть с SQL сервера.

Тут мы описываем тип подключения (mysql), параметры подключения, SQL запросы (самый главный - sql_query - для выборки данных).

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

  1. source src_classified_offers{
  2.     type   		 = mysql
  3.     sql_host   	 = 127.0.0.1
  4.     sql_user   	 = *******
  5.     sql_pass   	 = *******
  6.     sql_db   	 = classified_test
  7.     sql_port   	 = 3306    # optional, default is 3306
  8.     #pre-query
  9.     sql_query_pre   	 = SET NAMES utf8
  10.     # main document fetch query
  11.     sql_query   	 = \
  12.    	 SELECT `id`,`catid`,`vals`, \
  13.    	 `price`,`currency`, \
  14.    	 `name`,`description`, \
  15.    	 UNIX_TIMESTAMP(`published_from`) as published_from_ts \
  16.    	 FROM classified_ads \
  17.    	 WHERE ((`published`=1)AND(`id`>=$start)AND(`id`<=$end))
  18.  
  19.     sql_query_range   	 = SELECT MIN(id),MAX(id) FROM classified_ads
  20.     sql_range_step   	 = 1000
  21.     sql_attr_uint   	 = catid
  22.     sql_attr_json   	 = vals
  23.     sql_attr_float   	 = price
  24.     sql_attr_uint   	 = currency
  25.     sql_attr_timestamp    = published_from_ts    
  26.     sql_ranged_throttle    = 0
  27.     }

Параметры sql_query_range, sql_range_step и sql_ranged_throttle описывают “выборку частями” из нашей таблицы. Поскольку таблица будет большая, теоретически (в процессе выборки большого количества данных) нас может выбить по таймауту. Запросы частями решают данную проблему.

Как видите, в конце секции source, идёт описание типов некоторых полей. Например, sql_attr_json - это значения наших полей. Все неописанные поля добавляются в полнотекстовый индекс.

Выбор типа индекса

Далее нам необходимо создать секцию индекса. В Sphinx есть 2 типа индекса - обычный и realtime. Давайте выберем обычный индекс. Он проще в обслуживании и более производительный (минус - обновляется с запаздыванием).

  1. index classified_offers{
  2.     source   		 = src_classified_offers
  3.     path   		 = /data/sphinx/classified_offers/
  4.     docinfo   		 = extern
  5.     dict   		 = keywords
  6.     mlock   		 = 0
  7.     morphology   	 = stem_enru
  8.     min_word_len   	 = 1
  9.     html_strip   	 = 0
  10.     }

Стоит отметить, что директория path должна существовать на момент запуска демона.

Запуск Sphinx и поиск

Перед стартом сервиса нам необходимо проиндексировать данные. При изменении структуры (добавили столбец в индекс или поменялся тип) необходимо вначале остановить сервис, а затем запускать полное индексирование командой:

  1. $ sudo service sphinxsearch stop
  2. $ indexer --all

Затем запускаем демон:

  1. $ sudo service sphinxsearch start

Если ничего не изменилось - просто вызываем переиндексацию данных без остановки сервиса. Данную команду следует запихнуть в cron для поддержания валидных данных:

  1. $ indexer --all --rotate

Подключение к серверу Sphinx в PHP (мы используем протокол SphinxQL) ничем не отличается от SQL. Вот только порт придётся использовать нестандартный (обычно 9306).

Для поиска по JSON указываем поле через точку. Например:

  1. SELECT values.fuel_type from classified_ads where (values.fuel_type=4);

Для полнотекстового поиска используется ключевое слово MATCH:

  1. SELECT * FROM classified_ads WHERE MATCH('my document');

Вот и всего-то.

Комментарии

06.03.2018 05:36:09
Avatar of StevenInextStevenInext
tadalafil <a href=http://kjcialishuef.us/#6442>generic cialis</a> cialis pills <a href=http://kjcialishuef.us/#5418>cialis generic</a>
10.03.2018 04:10:41
Avatar of TerryhowTerryhow
<a href=http://viagrawithoutdoctorprescr.today/#6976>viagra without a doctor prescription</a> <a href=http://viagrawithoutdoctorprescr.today/#6644>viagra without a doctor prescription</a>
10.03.2018 11:32:44
Avatar of TerryhowTerryhow
<a href=http://viagrawithoutdoctorprescr.today/#274>viagra without a doctor prescription</a> <a href=http://viagrawithoutdoctorprescr.today/#821>viagra without prescription</a>
11.03.2018 07:34:02
Avatar of TerryhowTerryhow
<a href=http://viagrawithoutdoctorprescr.today/#1421>viagra without prescription</a> <a href=http://viagrawithoutdoctorprescr.today/#3702>viagra without a doctor prescription</a>
12.03.2018 01:24:29
Avatar of TerryhowTerryhow
<a href=http://viagrawithoutdoctorprescr.today/#8785>viagra without a doctor prescription</a> <a href=http://viagrawithoutdoctorprescr.today/#4505>viagra without a doctor prescription</a>
12.03.2018 11:14:22
Avatar of TerryhowTerryhow
<a href=http://viagrawithoutdoctorprescr.today/#2886>viagra without a doctor prescription</a> <a href=http://viagrawithoutdoctorprescr.today/#6301>viagra without prescription</a>
13.03.2018 07:21:50
Avatar of TerryhowTerryhow
<a href=http://viagrawithoutdoctorprescr.today/#8942>viagra without prescription</a> <a href=http://viagrawithoutdoctorprescr.today/#9837>viagra without prescription</a>
13.03.2018 05:50:18
Avatar of TerryhowTerryhow
<a href=http://viagrawithoutdoctorprescr.today/#5540>viagra without prescription</a> <a href=http://viagrawithoutdoctorprescr.today/#4695>viagra without prescription</a>
14.03.2018 03:30:48
Avatar of TerryhowTerryhow
<a href=http://viagrawithoutdoctorprescr.today/#4334>viagra without a doctor prescription</a> <a href=http://viagrawithoutdoctorprescr.today/#8367>viagra without a doctor prescription</a>
15.03.2018 03:06:08
Avatar of TerryhowTerryhow
<a href=http://viagrawithoutdoctorprescr.today/#2330>viagra without prescription</a> <a href=http://viagrawithoutdoctorprescr.today/#5129>viagra without prescription</a>
16.03.2018 02:45:22
Avatar of GerazdBuiseGerazdBuise
cialis vs cialis drugs gaestebuch.cgi
http://walmartcialis.shop - cialis over the counter at walmart
cialis pills canada you have posted in this thread
<a href="http://walmartcialis.shop">generic cialis at walmart
</a> - can you use cialis two days in a row
cialis best
16.03.2018 04:47:49
Avatar of TerryhowTerryhow
<a href=http://viagrawithoutdoctorprescr.today/#7059>viagra without a doctor prescription</a> <a href=http://viagrawithoutdoctorprescr.today/#2463>viagra without a doctor prescription</a>
18.03.2018 04:09:37
Avatar of RobertbowRobertbow
viagra without a doctor’s prescription <a href=http://viagrawithoutdoctorprescr.today/#7375>viagra without a doctor prescription</a> viagra without a doctor <a href=http://viagrawithoutdoctorprescr.today/#4992>viagra on line no prec</a>
24.03.2018 06:38:32
Avatar of ThozasronThozasron
viagra 10mg or 20mg login
http://rxviagracan.com - viagra for men for sale
viagra 20mg coupons the team
<a href="http://rxviagracan.com">generic viagra for sale
</a> - viagra side effects wiki commentaire.php?id=
viagra 10mg or 20mg i forgot my password
25.03.2018 04:06:45
Avatar of MelvizMaibEMelvizMaibE
what works best viagra or viagra
http://gtviagracan.com - viagra for sale canadian
does viagra work more than once bbs.cgi?mode=
<a href="http://gtviagracan.com">viagra for sale
</a> - viagra erection pictures
viagra and viagra
25.03.2018 06:13:14
Avatar of JasozitegoJasozitego
cialis versus cialis espa ol
http://walmartcialis.com - cialis over the counter at walmart
bph cialis
<a href="http://walmartcialis.com">cialis over the counter at walmart
</a> - cialis 20mg canada administrators
cardiomyopathy cialis
25.03.2018 10:46:25
Avatar of MiltozExesyMiltozExesy
viagra s t
http://glviagragtr.com - generic viagra for sale
vigria
<a href="http://glviagragtr.com">viagra for sale for men
</a> - cheap viagra u.k.
viagra information viagra vs levitra new posts
25.03.2018 01:01:44
Avatar of RomeztNaGRomeztNaG
viagra impotence drug eli lilly co
http://xlviagragtr.com - real viagra for sale
viagra buy online no prescription date registered
<a href="http://xlviagragtr.com">viagra for sale
</a> - viagra available in thailand
viagra order
27.03.2018 12:02:04
Avatar of mugmug
28.03.2018 06:01:39
Avatar of kamagra 100 mg oral jellykamagra 100 mg oral jelly
the medical supply store kamagra
<a href="http://kamagradxt.com/">kamagra jelly india for sell</a>
kamagra 100mg chewable tablets
<a href="http://kamagradxt.com/">buy kamagra online</a>
kamagra 100mg tablets for sale uk
29.03.2018 04:25:27
Avatar of ThozasronThozasron
viagra 10mg or 20mg knowledge base
http://rxviagracan.com - viagra for sale for men
can i have a few drinks will taking viagra
<a href="http://rxviagracan.com">viagra for sale cheap
</a> - viagra pills for sale posts per day
viagra 20mg tablets most users ever online was
08.04.2018 10:48:58
Avatar of cialis cheapcialis cheap
#1 Bing <a href=https://genericcialisonline2018.com/>buy cialis online</a> Hello best Buy cialis online https://genericcialisonline2018.com/ Yes <a href=https://genericcialisonline2018.com/>buy cialis online</a>
#2 Bing <a href=https://genericcialisonline2018.com/>cialis</a>
#3 Bing <a href=https://genericcialisonline2018.com/>tadalafil</a>
#4 Bing <a href=https://genericcialisonline2018.com/>cialis pharmacy</a>
One more thing to say is that an online business administration training course is designed for individuals to be able to easily proceed to bachelor degree courses. The Ninety credit certification meets the other bachelor diploma requirements when you earn your current associate of arts in BA online, you should have access to the most recent technologies in this field. Some reasons why students want to be able to get their associate degree in business is because they can be interested in this area and want to obtain the general training necessary just before jumping in to a bachelor college diploma program. Thanks alot : ) for the tips you actually provide within your blog.

<a href=http://buycialisgenericzs.com/Free-cialis.html>Free cialis</a>
<a href=http://cialisworld.com/Cialis-30-day-trial-coupon.html>Cialis 30 day trial coupon</a>
<a href=http://buyrealcialisonline.com/Cialis-without-a-doctors-prescription.html>Cialis without a doctor's prescription</a>
<a href=http://buyrealcialisonline.com/Cheap-cialis.html>Cheap cialis</a>
<a href=http://cialisworld.com/Cialis-patent-expiration.html>Cialis patent expiration</a>
<a href=http://buyrealcialisonline.com/Cialis-online.html>Cialis online</a>
<a href=http://buycialiszsx.com/Buy-generic-cialis-40mg.html>Buy generic cialis 40mg</a>
<a href=http://cialisforyou.com/Tadalafil-20mg-lowest-price.html>Tadalafil 20mg lowest price</a>
<a href=http://cialisworld.com/Cialis-200-dollar-savings-card.html>Cialis 200 dollar savings card</a>
<a href=http://cialisforyou.com/Cialis-5-mg-funziona.html>Cialis 5 mg funziona</a>
<a href=http://cialisforyou.com/5-Mg-cialis-coupon-printable.html>5 Mg cialis coupon printable</a>
<a href=http://buycialiszsx.com/Cialis-30-day-sample.html>Cialis 30 day sample</a>
<a href=http://cialisforyou.com/Low-cost-cialis-20mg.html>Low cost cialis 20mg</a>
<a href=http://buycialiszsx.com/Cialis-generika.html>Cialis generika</a>
<a href=http://cialisforyou.com/Side-effects-for-cialis.html>Side effects for cialis</a>

<a href=https://buycialiszsx.com>buy cialis</a>
<a href=https://cialiszxc.com>buy cialis online</a>
<a href=https://buyrealcialisonline.com>buy cialis online</a>
<a href=https://cialisworld.com>generic cialis</a>
<a href=https://genericcialisonline2018.com>buy cialis</a>
<a href=https://buycialisgenericzs.com>cialis online</a>
10.04.2018 07:56:22
Avatar of RomeztNaGRomeztNaG
viagra buy announcements
http://xlviagragtr.com - viagra for sale
online pharmacy, viagra, viagra, uk
<a href="http://xlviagragtr.com">viagra for sale cheap
</a> - canada generic in viagra soft
buy viagra online profile
10.04.2018 10:28:11
Avatar of MiltozExesyMiltozExesy
effects taking asprin and viagra together
http://glviagragtr.com - real viagra for sale
viagra coupon online memberlist
<a href="http://glviagragtr.com">viagra for sale canadian
</a> - viagra 20 mg cost password
viagra 20mg views
14.04.2018 08:36:16
Avatar of MazuelMutleMazuelMutle
viagra tadalafil canada form.php
http://viagrawithoutdoctorshop.com - viagra without a doctor prescription usa
viagra and alcohol use posts
<a href="http://viagrawithoutdoctorshop.com">viagra without prescription
</a> - viagra grneric
viagra 20mg review who is online
20.04.2018 09:58:34
Avatar of JaizeordesJaizeordes
online viagra pharmacy
http://viagrawithoutdoctorstore.com - viagra without a doctor prescription
cures for ed
<a href="http://viagrawithoutdoctorstore.com">viagra without a doctor prescription
</a> - effects taking asprin and viagra together
buy viagra online email e-mail
23.04.2018 10:41:26
Avatar of RoberthoumeRoberthoume
achat cialis en europe <a href="http://sfghjkuyiolki.com/#">cialis generique</a> cialis 5mg prix <a href=http://sfghjkuyiolki.com/#>canadian cialis</a>
Captcha Обновить
Go Top