29
20/06/16 16:04 SphinxSearch Page 1 of 29 file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/ ИГОРЬ ЧАКРЫГИН OZON.RU

"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

Embed Size (px)

Citation preview

Page 1: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 1 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

ИГОРЬ ЧАКРЫГИНOZON.RU

Page 2: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 2 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

ДЛЯ ЧЕГО ИСПОЛЬЗУЕМ SPHINXТоварная выдача: каталог, поиск, фасетные фильтры.Поисковые подсказки. Просто выгружаем логзапросов в индекс.Обработка запросов: исправление опечаток(триграммы), расширение запросов, планируем разборзапросов по параметрам.

Page 3: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 3 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

НЕМНОГО ЦИФР

Page 4: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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 нетоварных индексов

Page 5: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 5 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

ОБНОВЛЕНИЕ ИНДЕКСОВ

Page 6: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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.

Page 7: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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 цены и доступности

Page 8: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 8 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

ОСОБЕННОСТИ

Page 9: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 9 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

Почему индексируем именно xml:Данные для индексации в нескольких системах:Система описания, БО, CMS, RnD, и т.д.Много связий в описании товаров, например:Товар → Модель → Бренд → ПроизводительСхема индексов постоянно меняется менеджерами.

Механизм проверки схем.Мало полнотекстового поиска, в основном атрибуты.Пробовали JSON

Page 10: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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');

Page 11: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 11 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

ГРУППИРОВКА ТОВАРОВ ПОМОДЕЛЯМ

Page 12: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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 …

Page 13: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 13 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

МУЛЬТИЗАПРОСЫ

Page 14: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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;

Page 15: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 15 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

МУЛЬТИЗАПРОСЫКак это выглядит для пользователя:

Page 16: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 16 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

МУЛЬТИЗАПРОСЫ

Page 17: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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;

Page 18: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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

Page 19: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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

Page 20: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 20 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

РАНЖИРОВАНИЕ

Page 21: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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');

Page 22: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 22 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

РАНЖИРОВАНИЕ

Page 23: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 23 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

Из опыта: Если Sphinx падает или тормозит,и вы используете ранкер, то скорее всего тормозитили падает именно ранкер.В планах:Разобраться, как работает наш собственный ранкер.(Внезапно!)Уйти от поиска по словам, если это возможно.Заменить его фильтрацией по атрибутам.

Page 24: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 24 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

РАЗБОР ЗАПРОСОВ - ЗАЧЕМ?

Page 25: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 25 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

Page 26: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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;

Page 27: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 27 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

Page 28: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

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') …;

Page 29: "Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)

20/06/16 16:04SphinxSearch

Page 29 of 29file:///Users/mmklyuev/Desktop/meetup/index.html?print-pdf#/

ЖДЁМ SPHINX 3.0Sphinx 3.0 пока нет…

…но вы держитесь здесь, вам всего доброго,хорошего настроения и здоровья.