"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)
Transcript of "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)
20/06/16 16:04SphinxSearch
Page 1 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
ИГОРЬ ЧАКРЫГИНOZON.RU
20/06/16 16:04SphinxSearch
Page 2 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
ДЛЯ ЧЕГО ИСПОЛЬЗУЕМ SPHINXТоварная выдача: каталог, поиск, фасетные фильтры.Поисковые подсказки. Просто выгружаем логзапросов в индекс.Обработка запросов: исправление опечаток(триграммы), расширение запросов, планируем разборзапросов по параметрам.
20/06/16 16:04SphinxSearch
Page 3 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
НЕМНОГО ЦИФР
20/06/16 16:04SphinxSearch
Page 4 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
6 млн. товаров, 25Gb, ~20 индексов, 5 нодМного товаров:Книги: 2.6 млн., 6.2Gb, ~100 attrsPrint-on-Demand: 2.2 млн., 5Gb, ~100 attrs
Много атрибутов:Товары для дома: 350 тыс., 2.5Gb, ~1300 attrsЭлектроника: 150 тыс., 1.1Gb, ~1400 attrs
Все товары (кроме книг): 1 млн., 2.5Gb, ~60 attrs+1,2 Gb статистики для ранкера (×2 во времятестов)
+5 Gb нетоварных индексов
20/06/16 16:04SphinxSearch
Page 5 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
ОБНОВЛЕНИЕ ИНДЕКСОВ
20/06/16 16:04SphinxSearch
Page 6 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
Индексируем xml, отдельно выгружая схемы итовары.Раз в сутки происходит полная переиндексация.Пробовали:Сборка индексов и поиск на Windows.main (1д.) + delta (10 мин): проблемы спроизводительностью и размером kill-list.main (1д.) + delta (10 мин) + merge: проблемы состабильностью и падениями.main (1д.) + rt: сложно поддерживать, нет kill-list.
20/06/16 16:04SphinxSearch
Page 7 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
ОБНОВЛЕНИЕ ИНДЕКСОВИспользуем сейчас:Сборка индексов на Windows, поиск на Linux.main (1д. → 2-3ч.) + update цены и доступности.
Есть мысли попробовать:main + delta + признак is_deleted на товарах.main + delta + merge + update цены и доступности
20/06/16 16:04SphinxSearch
Page 8 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
ОСОБЕННОСТИ
20/06/16 16:04SphinxSearch
Page 9 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
Почему индексируем именно xml:Данные для индексации в нескольких системах:Система описания, БО, CMS, RnD, и т.д.Много связий в описании товаров, например:Товар → Модель → Бренд → ПроизводительСхема индексов постоянно меняется менеджерами.
Механизм проверки схем.Мало полнотекстового поиска, в основном атрибуты.Пробовали JSON
20/06/16 16:04SphinxSearch
Page 10 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
ФИЛЬТРАЦИЯ ЧЕРЕЗ MATCHФильтрация по атрибуту:
Фильтрация по полю:
select … from electronicswhere match('ноутбук') and category_id = 1133681;
select … from electronicswhere match('ноутбук @category_id =1133681');
20/06/16 16:04SphinxSearch
Page 11 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
ГРУППИРОВКА ТОВАРОВ ПОМОДЕЛЯМ
20/06/16 16:04SphinxSearch
Page 12 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
Запрос на товары:
Запрос на фильтры:
select model_id, group_concat(id) idsfrom electronics where match('…')group by model_id within group order by …order by …;
select groupby() brand_id, brand_name, count(distinct model_id)from electronics where match('…')group by brand_idorder by …
20/06/16 16:04SphinxSearch
Page 13 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
МУЛЬТИЗАПРОСЫ
20/06/16 16:04SphinxSearch
Page 14 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
Когда нужно взвесить много фильтров за один раз:select brand_id, count(distinct model_id) as countfrom electronics where match('@category_id =1156814')group by brand_id order by count desc;
select cpu_id,cpu, count(distinct model_id) as countfrom electronics where match('@category_id =1156814')group by cpu_id order by count desc;
select ram_id,ram, count(distinct model_id) as countfrom electronics where match('@category_id =1156814')group by ram_id order by count desc;
select os_id, os, count(distinct model_id) as countfrom electronics where match('@category_id =1156814')group by os_id order by count desc;
20/06/16 16:04SphinxSearch
Page 15 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
МУЛЬТИЗАПРОСЫКак это выглядит для пользователя:
20/06/16 16:04SphinxSearch
Page 16 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
МУЛЬТИЗАПРОСЫ
20/06/16 16:04SphinxSearch
Page 17 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
Но когда пользователь выбирает один из фильтров:select brand_id, count(distinct model_id) as countfrom electronics where match('@category_id =1156814') and ram_id =33860group by brand_id order by count desc;
select cpu_id,cpu, count(distinct model_id) as countfrom electronics where match('@category_id =1156814') and ram_id =33860group by cpu_id order by count desc;
select ram_id,ram, count(distinct model_id) as countfrom electronics where match('@category_id =1156814')group by ram_id order by count desc;
select os_id, os, count(distinct model_id) as countfrom electronics where match('@category_id =1156814') and ram_id =33860group by os_id order by count desc;
20/06/16 16:04SphinxSearch
Page 18 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
МУЛЬТИЗАПРОСЫЛог до выбора фильтра:
Лог после выбора фильтра:
Можно группировать запросы в пакеты по where:
[…] 0.000 sec 0.000 sec x4 [ext2/0/ext 8 (0,500) @brand_id] [electronics]@category_id =1156814[…] 0.000 sec 0.000 sec x4 [ext2/0/ext 48 (0,500) @cpu_id] [electronics]@category_id =1156814[…] 0.000 sec 0.000 sec x4 [ext2/0/ext 9 (0,500) @ram_id] [electronics]@category_id =1156814[…] 0.000 sec 0.000 sec x4 [ext2/0/ext 11 (0,500) @os_id] [electronics]@category_id =1156814
[…] 0.001 sec 0.001 sec [ext2/1/ext 5 (0,500) @brand_id] [electronics]@category_id =1156814[…] 0.001 sec 0.001 sec [ext2/1/ext 19 (0,500) @cpu_id] [electronics]@category_id =1156814[…] 0.001 sec 0.001 sec [ext2/0/ext 9 (0,500) @ram_id] [electronics]@category_id =1156814[…] 0.001 sec 0.001 sec [ext2/1/ext 7 (0,500) @os_id] [electronics]@category_id =1156814
20/06/16 16:04SphinxSearch
Page 19 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
Можно группировать запросы в пакеты по where:
Мультизапросы с сортировкой по строке не работают.
[…] 0.000 sec 0.000 sec x3 [ext2/1/ext 5 (0,500) @brand_id] [electronics]@category_id =1156814[…] 0.000 sec 0.000 sec x3 [ext2/1/ext 19 (0,500) @cpu_id] [electronics]@category_id =1156814[…] 0.000 sec 0.000 sec x3 [ext2/1/ext 7 (0,500) @os_id] [electronics]@category_id =1156814
20/06/16 16:04SphinxSearch
Page 20 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
РАНЖИРОВАНИЕ
20/06/16 16:04SphinxSearch
Page 21 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
Долго использовали ранжирование bm25.Начали собирать логи по действиям пользователей.Считаем статистику вида:
Написали свою функцию вычисления веса котораясмешивает полнотекстовый вес и статистику:
Запрос1: [{товар1, вес1}, {товар2, вес2}, {товар3, вес3}, …]Запрос2: [{товар4, вес4}, {товар5, вес5}, {товар6, вес6}, …]…
select …, ranker( packedfactors(), bm25f(0.2, 0.3), bm25f(0.2, 0.7), /* alpha */ 3.5, /* mode */ 0, 'electronics', 'ноутбук' id, item_ratingvalue, item_bargainsale, item_bestsellerqty, item_ratingcount, item_price, item_baseprice) as rankfrom electronics …option ranker=expr('0');
20/06/16 16:04SphinxSearch
Page 22 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
РАНЖИРОВАНИЕ
20/06/16 16:04SphinxSearch
Page 23 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
Из опыта: Если Sphinx падает или тормозит,и вы используете ранкер, то скорее всего тормозитили падает именно ранкер.В планах:Разобраться, как работает наш собственный ранкер.(Внезапно!)Уйти от поиска по словам, если это возможно.Заменить его фильтрацией по атрибутам.
20/06/16 16:04SphinxSearch
Page 24 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
РАЗБОР ЗАПРОСОВ - ЗАЧЕМ?
20/06/16 16:04SphinxSearch
Page 25 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
20/06/16 16:04SphinxSearch
Page 26 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
РАЗБОР ЗАПРОСОВindex_field_lengths = 1
select term, term_len, filter, (weight()=term_len) ffrom term where match('"женские джинсы tom tailor"/1') and f = 1option ranker=wordcount;
20/06/16 16:04SphinxSearch
Page 27 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
20/06/16 16:04SphinxSearch
Page 28 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
РАЗБОР ЗАПРОСОВЗаменяем это:
На это:
select model_id, group_concat(id) ids, …from … where match('женские джинсы tom tailor') …;
select model_id, group_concat(id) ids, …from … where match('@filter =type_38734 =sex_545 =brand_6466561') …;
20/06/16 16:04SphinxSearch
Page 29 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/
ЖДЁМ SPHINX 3.0Sphinx 3.0 пока нет…
…но вы держитесь здесь, вам всего доброго,хорошего настроения и здоровья.