SlideShare a Scribd company logo
1 of 21
Нестандартное использование SphinxSearch
(Сага о красных телевизорах)
Кудлай Роман
Ведущий разработчик
roman.kudlay@softline.ru
09.06.2013
Нам на сайте нужен поиск
Заказчик: нам на сайте нужен поиск!
Заказчик: Быстро и «по-простому»!!!
Разработчик: Будет медленно работать!
Заказчик: Ничего, главное – быстро запустить!
Разработчик: SELECT * FROM news WHERE text LIKE %query%
Заказчик: А почему так медленно?
Разработчик: Ну так «по-простому» же!!!
Немного про эволюцию одного проекта
●
Шаг 1: Нам нужен поиск
●
Шаг 2: Нам нужен поиск
с фильтром
●
Шаг 3: Нам нужен фильтр
Постановка задачи
1. Имеется каталог товаров
2. У товаров есть ряд свойств (не зависят от категории): город,
спецпредложение, новинка, категория, подкатегория, цена, производитель и др.
3. У товаров есть ряд характеристик (зависят от категории): Цвет, вес,
поддерживаемые стандарты
4. Необходимо фильтровать товары по свойствам и/или характеристикам:
новинки в Таганроге, спецпредложения в телевизорах с поддержкой 3D, товары,
похожие на sku1248134
5. И это еще с возможностью поиска: синий мобильные телефоны «i9000» или
просто «телевизоры LG»
6. Необходимо выводить только те категории, в которых присутствуют товары с
определенными параметрами
Общая архитектура SphinxSearch (Standalone)
PHP
MySQL
daemon
searchd
Sphinx daemon
MySQL direct connect
Index
IndexerXML Pipe
General
communication
Search query
Пример архитектуры Sphinx сервера
(распределенный вариант)
Index
Indexer
searchd
Master
searchd
Slave
Index searchd
Slave
Index searchd
Slave
Indexer
2 типа полей
VS
Что рекомендует официальная документация
Example sphinx.conf part:
sql_query = SELECT id, title, content, 
author_id, forum_id, post_date FROM my_forum_posts
sql_attr_uint = author_id
sql_attr_uint = forum_id
sql_attr_timestamp = post_date
Example application code (in PHP):
// only search posts by author whose ID is 123
$cl->SetFilter ( "author_id", array ( 123 ) );
// only search posts in sub-forums 1, 3 and 7
$cl->SetFilter ( "forum_id", array ( 1,3,7 ) );
// sort found posts by posting date in descending order
$cl->SetSortMode ( SPH_SORT_ATTR_DESC, "post_date" );
http://sphinxsearch.com/docs/2.1.1/attributes.html
Что рекомендует официальная документация
Example sphinx.conf part:
sql_query = SELECT id, title, content, 
author_id, forum_id, post_date FROM my_forum_posts
sql_attr_uint = author_id
sql_attr_uint = forum_id
sql_attr_timestamp = post_date
Example application code (in PHP):
// only search posts by author whose ID is 123
$cl->SetFilter ( "author_id", array ( 123 ) );
// only search posts in sub-forums 1, 3 and 7
$cl->SetFilter ( "forum_id", array ( 1,3,7 ) );
// sort found posts by posting date in descending order
$cl->SetSortMode ( SPH_SORT_ATTR_DESC, "post_date" );
Все
лгут!
Все
лгут!http://sphinxsearch.com/docs/2.1.1/attributes.html
Что рекомендует Аксенов*
●
Храните данные для фильтрации в полнотекстовых индексных полях.
●
Храните всю полезную информацию об элементе в одном атрибуте в сериализованном виде.
●
В своих запросах
NEWS FROM LIKE %query% WHERE SELECT *
(SELECT * FROM news WHERE title LIKE %query%)
Вы не используйте
*На самом деле, на картинке изображен не Андрей Аксенов, а магистр Йода
Секретный ингредиент
Инвертированный индекс (англ. inverted index) — в процессе индексации для всех ключевых
слов строится список документов, в которых оно встречается
++ =
Как это работает
Хранение информации об объекте в записи сфинкса
@id = '100'
@category = 'TV'
@keywords = 'телевизор LG T900 цвет красный новинка'
@features = '_ID_100_ _CAT_TV_ _CAT_VIDEO_ _LASTCAT_TV_
_BRAND_LG_ _CITY_TAGANROG_ _CITY_ROSTOV_
_FEATURE_COLOR_RED_ _NEW_
_HASH_c7c9b697cb717d6a5d2ab76'
@price_taganrog = '10000'
@price_rostov = '9500'
@info = '{cities: [rostov, taganrog], brand: LG, picture: red_tv.jpg, new:
true}
Profit
●
Результат запроса вернет сразу все данные по объекту. Нет необходимости в использовании дорогих join.
●
Полнотекстовый поиск и фильтрация по множеству элементов работает очень быстро
●
Можно сортировать объекты по похожести: чем больше одинаковых свойств — тем выше релевантность.
Почему не реляционные СУБД
●
Индекс в реляционных СУБД — отсортированный столбец
●
Либо, добавлять под новое свойство новый столбец, либо создавать M:M связи
●
Нормализация: зло
JOIN
Поиск
1. Спецпредложения в Таганроге в категориях TV и DVD
@features =_SPEC_ =_CITY_TAGANROG_ =( _CAT_TV_ | _CAT_DVD_ )
2. Фен remington в Ростове
@keywords ('фен remington' | '*фен remington*') @features =_CITY_ROSTOV_
3. Поиск товара по ЧПУ
@features =_CODEHASH_c7c97af638909b697cb717d6a5d2ab76_
4. Товары в категории «приготовление пищи» в Таганроге, у которых есть картинка
@features =_CITY_TAGANROG_ =_CAT_COOKING_ =_HAS_PICTURE_
5. Телевизоры в Васюки от 3 разных производителей
@features =_LASTCAT_TV_ =_CITY_VASYUKI_ =( _MANUFACTURER_LG_ | _MANUFACTURER_SAMSUNG_ |
_MANUFACTURER_BBK_ )
6. Товары, похожие по характеристикам на необходимый
@features _FEATURE_COLOR_RED_ _FEATURE_INTERFACE_HDMI_ _FEATURE_INTERFACE_VGA_
_FEATURE_LED_YES_ _FEATURE_WIFI_NO_ _FEATURE_SMART_YES_
Управление поиском:
Поисковый запрос
MatchMode, Sort, Group и пр.
Benchmarks
●
На реальном сервере до 150 запросов в секунду. Дальше тормозит все, кроме Sphinx
●
Время запроса 0-3 мс (точнее в логи не пишется)
●
Среднее время запроса по логам 0-1мс
●
1-4 запроса на странице
●
Синтетическая нагрузка:
18000 элементов i7m 2.4 Ghz, 2 ядра, 12 потоков, 2200-2400 запр/сек
А теперь о грустном
Минусы реализации
●
Дополнительное звено — больше потенциальных проблем
●
Необходимо индексирование. Данные не всегда актуальны
●
Для группировки и сортировки надо выносить данные в
отдельные атрибуты
●
До конца не решен вопрос с диапазонами значений (сейчас
решается созданием атрибутов)
Спасибо
Вопросы?

More Related Content

What's hot

Robots.txt - что это такое, для чего нужен, как использовать
Robots.txt - что это такое, для чего нужен, как использоватьRobots.txt - что это такое, для чего нужен, как использовать
Robots.txt - что это такое, для чего нужен, как использоватьРамазан Миндубаев
 
26.03.19 Collaborator.pro Webinar Эффективные паттерны выбора доноров
26.03.19 Collaborator.pro Webinar Эффективные паттерны выбора доноров26.03.19 Collaborator.pro Webinar Эффективные паттерны выбора доноров
26.03.19 Collaborator.pro Webinar Эффективные паттерны выбора доноровVladislav Morgun
 
19.10 - WebPromo SEO Day - "SEO-автоматизатор: кто он?" - Владислав Моргун
19.10 - WebPromo SEO Day - "SEO-автоматизатор: кто он?" - Владислав Моргун19.10 - WebPromo SEO Day - "SEO-автоматизатор: кто он?" - Владислав Моргун
19.10 - WebPromo SEO Day - "SEO-автоматизатор: кто он?" - Владислав МоргунVladislav Morgun
 
презентация занятие №1
 презентация занятие №1 презентация занятие №1
презентация занятие №1aleksandrafanasjev
 
Игорь Горбенко (SerpStat): 5 фишек поисковой аналитики, которыми пользуются п...
Игорь Горбенко (SerpStat): 5 фишек поисковой аналитики, которыми пользуются п...Игорь Горбенко (SerpStat): 5 фишек поисковой аналитики, которыми пользуются п...
Игорь Горбенко (SerpStat): 5 фишек поисковой аналитики, которыми пользуются п...NaZapad
 
Как выйти из-под Google Panda. Симптомы, причины, кейсы.
Как выйти из-под Google Panda. Симптомы, причины, кейсы.Как выйти из-под Google Panda. Симптомы, причины, кейсы.
Как выйти из-под Google Panda. Симптомы, причины, кейсы.Евгений Аралов
 
Внедрение системы веб аналитики в информационный сайт
Внедрение системы веб аналитики в информационный сайтВнедрение системы веб аналитики в информационный сайт
Внедрение системы веб аналитики в информационный сайтRezonans
 
WebPromo Experts Day - Олег Искевич и Владислав Моргун - Продвижение в высоко...
WebPromo Experts Day - Олег Искевич и Владислав Моргун - Продвижение в высоко...WebPromo Experts Day - Олег Искевич и Владислав Моргун - Продвижение в высоко...
WebPromo Experts Day - Олег Искевич и Владислав Моргун - Продвижение в высоко...Vladislav Morgun
 
Анализ просадки трафика в Google - Аралов Евгений на IBCRussia
Анализ просадки трафика в Google - Аралов Евгений на IBCRussiaАнализ просадки трафика в Google - Аралов Евгений на IBCRussia
Анализ просадки трафика в Google - Аралов Евгений на IBCRussiaЕвгений Аралов
 
Практика SEO: выпуск 9. Поиск основных ошибок оптимизации сайта
Практика SEO: выпуск 9. Поиск основных ошибок оптимизации сайтаПрактика SEO: выпуск 9. Поиск основных ошибок оптимизации сайта
Практика SEO: выпуск 9. Поиск основных ошибок оптимизации сайтаДмитрий Севальнев
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Кутас Иван. Практика оптимизации сайтов на незнакомых языках bdd2017
Кутас Иван. Практика оптимизации сайтов на незнакомых языках bdd2017Кутас Иван. Практика оптимизации сайтов на незнакомых языках bdd2017
Кутас Иван. Практика оптимизации сайтов на незнакомых языках bdd2017Дмитрий Шахов
 

What's hot (14)

Типовые ошибки на сайте
Типовые ошибки на сайтеТиповые ошибки на сайте
Типовые ошибки на сайте
 
Robots.txt - что это такое, для чего нужен, как использовать
Robots.txt - что это такое, для чего нужен, как использоватьRobots.txt - что это такое, для чего нужен, как использовать
Robots.txt - что это такое, для чего нужен, как использовать
 
26.03.19 Collaborator.pro Webinar Эффективные паттерны выбора доноров
26.03.19 Collaborator.pro Webinar Эффективные паттерны выбора доноров26.03.19 Collaborator.pro Webinar Эффективные паттерны выбора доноров
26.03.19 Collaborator.pro Webinar Эффективные паттерны выбора доноров
 
19.10 - WebPromo SEO Day - "SEO-автоматизатор: кто он?" - Владислав Моргун
19.10 - WebPromo SEO Day - "SEO-автоматизатор: кто он?" - Владислав Моргун19.10 - WebPromo SEO Day - "SEO-автоматизатор: кто он?" - Владислав Моргун
19.10 - WebPromo SEO Day - "SEO-автоматизатор: кто он?" - Владислав Моргун
 
презентация занятие №1
 презентация занятие №1 презентация занятие №1
презентация занятие №1
 
Игорь Горбенко (SerpStat): 5 фишек поисковой аналитики, которыми пользуются п...
Игорь Горбенко (SerpStat): 5 фишек поисковой аналитики, которыми пользуются п...Игорь Горбенко (SerpStat): 5 фишек поисковой аналитики, которыми пользуются п...
Игорь Горбенко (SerpStat): 5 фишек поисковой аналитики, которыми пользуются п...
 
Как выйти из-под Google Panda. Симптомы, причины, кейсы.
Как выйти из-под Google Panda. Симптомы, причины, кейсы.Как выйти из-под Google Panda. Симптомы, причины, кейсы.
Как выйти из-под Google Panda. Симптомы, причины, кейсы.
 
Внедрение системы веб аналитики в информационный сайт
Внедрение системы веб аналитики в информационный сайтВнедрение системы веб аналитики в информационный сайт
Внедрение системы веб аналитики в информационный сайт
 
WebPromo Experts Day - Олег Искевич и Владислав Моргун - Продвижение в высоко...
WebPromo Experts Day - Олег Искевич и Владислав Моргун - Продвижение в высоко...WebPromo Experts Day - Олег Искевич и Владислав Моргун - Продвижение в высоко...
WebPromo Experts Day - Олег Искевич и Владислав Моргун - Продвижение в высоко...
 
Как провести глубокую техническую оптимизацию сайта для SEO. Вебинар WebPromo...
Как провести глубокую техническую оптимизацию сайта для SEO. Вебинар WebPromo...Как провести глубокую техническую оптимизацию сайта для SEO. Вебинар WebPromo...
Как провести глубокую техническую оптимизацию сайта для SEO. Вебинар WebPromo...
 
Анализ просадки трафика в Google - Аралов Евгений на IBCRussia
Анализ просадки трафика в Google - Аралов Евгений на IBCRussiaАнализ просадки трафика в Google - Аралов Евгений на IBCRussia
Анализ просадки трафика в Google - Аралов Евгений на IBCRussia
 
Практика SEO: выпуск 9. Поиск основных ошибок оптимизации сайта
Практика SEO: выпуск 9. Поиск основных ошибок оптимизации сайтаПрактика SEO: выпуск 9. Поиск основных ошибок оптимизации сайта
Практика SEO: выпуск 9. Поиск основных ошибок оптимизации сайта
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Кутас Иван. Практика оптимизации сайтов на незнакомых языках bdd2017
Кутас Иван. Практика оптимизации сайтов на незнакомых языках bdd2017Кутас Иван. Практика оптимизации сайтов на незнакомых языках bdd2017
Кутас Иван. Практика оптимизации сайтов на незнакомых языках bdd2017
 

Similar to Tagconf 13 - SphinxSearch - 2

Алексей Рылко, iProspect — «SEO-инсайды, которые вы можете достать из логов ...
Алексей Рылко, iProspect  — «SEO-инсайды, которые вы можете достать из логов ...Алексей Рылко, iProspect  — «SEO-инсайды, которые вы можете достать из логов ...
Алексей Рылко, iProspect — «SEO-инсайды, которые вы можете достать из логов ...shevchuk_conf
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agencyit-people
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresqlOleg Churkin
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCDevDay
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищиCUSTIS
 
мониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonмониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonSlach
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
создание тематических сдл порталов, их оптимизация и монетизация. артишук олег
создание тематических сдл порталов, их оптимизация и монетизация.   артишук олегсоздание тематических сдл порталов, их оптимизация и монетизация.   артишук олег
создание тематических сдл порталов, их оптимизация и монетизация. артишук олегOleg Artyshuk
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Mikhail Shcherbakov
 
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...HappyDev
 
Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.Andrew Mayorov
 
Проектирование большого интернет-магазина
Проектирование большого интернет-магазинаПроектирование большого интернет-магазина
Проектирование большого интернет-магазинаArtem Markov
 
Разработка интернет-магазина: от идеи до реализации
Разработка интернет-магазина: от идеи до реализацииРазработка интернет-магазина: от идеи до реализации
Разработка интернет-магазина: от идеи до реализацииsportgid
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаMikhail Shcherbakov
 
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014it-people
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Ontico
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Oleksii Okhrymenko
 
Continuous integration testing of mobile SDK
Continuous integration testing of mobile SDKContinuous integration testing of mobile SDK
Continuous integration testing of mobile SDKTestableapple
 

Similar to Tagconf 13 - SphinxSearch - 2 (20)

Алексей Рылко, iProspect — «SEO-инсайды, которые вы можете достать из логов ...
Алексей Рылко, iProspect  — «SEO-инсайды, которые вы можете достать из логов ...Алексей Рылко, iProspect  — «SEO-инсайды, которые вы можете достать из логов ...
Алексей Рылко, iProspect — «SEO-инсайды, которые вы можете достать из логов ...
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresql
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
мониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonмониторинг производительности Web приложений на python
мониторинг производительности Web приложений на python
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
создание тематических сдл порталов, их оптимизация и монетизация. артишук олег
создание тематических сдл порталов, их оптимизация и монетизация.   артишук олегсоздание тематических сдл порталов, их оптимизация и монетизация.   артишук олег
создание тематических сдл порталов, их оптимизация и монетизация. артишук олег
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
Diplom
DiplomDiplom
Diplom
 
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
 
Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.
 
Проектирование большого интернет-магазина
Проектирование большого интернет-магазинаПроектирование большого интернет-магазина
Проектирование большого интернет-магазина
 
Разработка интернет-магазина: от идеи до реализации
Разработка интернет-магазина: от идеи до реализацииРазработка интернет-магазина: от идеи до реализации
Разработка интернет-магазина: от идеи до реализации
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014
Извлечение информации из веб-страниц - Михаил Коробов, PyCon RU 2014
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Continuous integration testing of mobile SDK
Continuous integration testing of mobile SDKContinuous integration testing of mobile SDK
Continuous integration testing of mobile SDK
 
Seo Tools
Seo ToolsSeo Tools
Seo Tools
 

Tagconf 13 - SphinxSearch - 2

  • 1. Нестандартное использование SphinxSearch (Сага о красных телевизорах) Кудлай Роман Ведущий разработчик roman.kudlay@softline.ru 09.06.2013
  • 2. Нам на сайте нужен поиск Заказчик: нам на сайте нужен поиск! Заказчик: Быстро и «по-простому»!!! Разработчик: Будет медленно работать! Заказчик: Ничего, главное – быстро запустить! Разработчик: SELECT * FROM news WHERE text LIKE %query% Заказчик: А почему так медленно? Разработчик: Ну так «по-простому» же!!!
  • 3. Немного про эволюцию одного проекта ● Шаг 1: Нам нужен поиск ● Шаг 2: Нам нужен поиск с фильтром ● Шаг 3: Нам нужен фильтр
  • 4. Постановка задачи 1. Имеется каталог товаров 2. У товаров есть ряд свойств (не зависят от категории): город, спецпредложение, новинка, категория, подкатегория, цена, производитель и др. 3. У товаров есть ряд характеристик (зависят от категории): Цвет, вес, поддерживаемые стандарты 4. Необходимо фильтровать товары по свойствам и/или характеристикам: новинки в Таганроге, спецпредложения в телевизорах с поддержкой 3D, товары, похожие на sku1248134 5. И это еще с возможностью поиска: синий мобильные телефоны «i9000» или просто «телевизоры LG» 6. Необходимо выводить только те категории, в которых присутствуют товары с определенными параметрами
  • 5. Общая архитектура SphinxSearch (Standalone) PHP MySQL daemon searchd Sphinx daemon MySQL direct connect Index IndexerXML Pipe General communication Search query
  • 6. Пример архитектуры Sphinx сервера (распределенный вариант) Index Indexer searchd Master searchd Slave Index searchd Slave Index searchd Slave Indexer
  • 8. Что рекомендует официальная документация Example sphinx.conf part: sql_query = SELECT id, title, content, author_id, forum_id, post_date FROM my_forum_posts sql_attr_uint = author_id sql_attr_uint = forum_id sql_attr_timestamp = post_date Example application code (in PHP): // only search posts by author whose ID is 123 $cl->SetFilter ( "author_id", array ( 123 ) ); // only search posts in sub-forums 1, 3 and 7 $cl->SetFilter ( "forum_id", array ( 1,3,7 ) ); // sort found posts by posting date in descending order $cl->SetSortMode ( SPH_SORT_ATTR_DESC, "post_date" ); http://sphinxsearch.com/docs/2.1.1/attributes.html
  • 9. Что рекомендует официальная документация Example sphinx.conf part: sql_query = SELECT id, title, content, author_id, forum_id, post_date FROM my_forum_posts sql_attr_uint = author_id sql_attr_uint = forum_id sql_attr_timestamp = post_date Example application code (in PHP): // only search posts by author whose ID is 123 $cl->SetFilter ( "author_id", array ( 123 ) ); // only search posts in sub-forums 1, 3 and 7 $cl->SetFilter ( "forum_id", array ( 1,3,7 ) ); // sort found posts by posting date in descending order $cl->SetSortMode ( SPH_SORT_ATTR_DESC, "post_date" ); Все лгут! Все лгут!http://sphinxsearch.com/docs/2.1.1/attributes.html
  • 10.
  • 11. Что рекомендует Аксенов* ● Храните данные для фильтрации в полнотекстовых индексных полях. ● Храните всю полезную информацию об элементе в одном атрибуте в сериализованном виде. ● В своих запросах NEWS FROM LIKE %query% WHERE SELECT * (SELECT * FROM news WHERE title LIKE %query%) Вы не используйте *На самом деле, на картинке изображен не Андрей Аксенов, а магистр Йода
  • 12. Секретный ингредиент Инвертированный индекс (англ. inverted index) — в процессе индексации для всех ключевых слов строится список документов, в которых оно встречается ++ =
  • 14. Хранение информации об объекте в записи сфинкса @id = '100' @category = 'TV' @keywords = 'телевизор LG T900 цвет красный новинка' @features = '_ID_100_ _CAT_TV_ _CAT_VIDEO_ _LASTCAT_TV_ _BRAND_LG_ _CITY_TAGANROG_ _CITY_ROSTOV_ _FEATURE_COLOR_RED_ _NEW_ _HASH_c7c9b697cb717d6a5d2ab76' @price_taganrog = '10000' @price_rostov = '9500' @info = '{cities: [rostov, taganrog], brand: LG, picture: red_tv.jpg, new: true}
  • 15. Profit ● Результат запроса вернет сразу все данные по объекту. Нет необходимости в использовании дорогих join. ● Полнотекстовый поиск и фильтрация по множеству элементов работает очень быстро ● Можно сортировать объекты по похожести: чем больше одинаковых свойств — тем выше релевантность.
  • 16. Почему не реляционные СУБД ● Индекс в реляционных СУБД — отсортированный столбец ● Либо, добавлять под новое свойство новый столбец, либо создавать M:M связи ● Нормализация: зло JOIN
  • 17. Поиск 1. Спецпредложения в Таганроге в категориях TV и DVD @features =_SPEC_ =_CITY_TAGANROG_ =( _CAT_TV_ | _CAT_DVD_ ) 2. Фен remington в Ростове @keywords ('фен remington' | '*фен remington*') @features =_CITY_ROSTOV_ 3. Поиск товара по ЧПУ @features =_CODEHASH_c7c97af638909b697cb717d6a5d2ab76_ 4. Товары в категории «приготовление пищи» в Таганроге, у которых есть картинка @features =_CITY_TAGANROG_ =_CAT_COOKING_ =_HAS_PICTURE_ 5. Телевизоры в Васюки от 3 разных производителей @features =_LASTCAT_TV_ =_CITY_VASYUKI_ =( _MANUFACTURER_LG_ | _MANUFACTURER_SAMSUNG_ | _MANUFACTURER_BBK_ ) 6. Товары, похожие по характеристикам на необходимый @features _FEATURE_COLOR_RED_ _FEATURE_INTERFACE_HDMI_ _FEATURE_INTERFACE_VGA_ _FEATURE_LED_YES_ _FEATURE_WIFI_NO_ _FEATURE_SMART_YES_ Управление поиском: Поисковый запрос MatchMode, Sort, Group и пр.
  • 18. Benchmarks ● На реальном сервере до 150 запросов в секунду. Дальше тормозит все, кроме Sphinx ● Время запроса 0-3 мс (точнее в логи не пишется) ● Среднее время запроса по логам 0-1мс ● 1-4 запроса на странице ● Синтетическая нагрузка: 18000 элементов i7m 2.4 Ghz, 2 ядра, 12 потоков, 2200-2400 запр/сек
  • 19. А теперь о грустном
  • 20. Минусы реализации ● Дополнительное звено — больше потенциальных проблем ● Необходимо индексирование. Данные не всегда актуальны ● Для группировки и сортировки надо выносить данные в отдельные атрибуты ● До конца не решен вопрос с диапазонами значений (сейчас решается созданием атрибутов)