"Успеть за 100 миллисекунд: контекстная реклама на...

24
Успеть за 100 миллисекунд: контекстная реклама на Sphinx Дмитрий Хасанов Avito

Upload: avitotech

Post on 15-Apr-2017

245 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Успеть за 100 миллисекунд: контекстная реклама на SphinxДмитрий Хасанов Avito

Page 2: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Контекст

Page 3: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Требования• 50 млн рекламных объявлений • 300 тыс запросов в минуту • 100 мс на ответ

Page 4: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Принцип работы• отбор

• текстовый запрос

• регион

• категория

• время суток

• сортировка: bid * CTR

Page 5: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Модели• десятки параметров • миллионы коэффициентов • обратная связь • эксперименты, АБ-тесты

Page 6: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Варианты решения• реляционная БД • in-memory БД • самописный инструмент • внешний поисковый движок

Page 7: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Поиск в Sphinx'е• индексация объявлений • поиск • ранжирование

Page 8: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Индексация• БД -> TSV -> индекс • один мастер • разливка rsync'ом

Page 9: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Поиск• запрос • параметры окружения • параметры пользователя

Page 10: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Ранжирование• UDF для предсказания CTR • компиляция на одной ноде • разливка rsync'ом

Page 11: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

UDF — user defined function#include "sphinxudf.h"

double myudf ( SPH_UDF_INIT * init, SPH_UDF_ARGS * args, char * error_flag ) { double res = 0; // ... return res; }

int myudf_init (SPH_UDF_INIT * init, SPH_UDF_ARGS * args, char * error_message) { return 0; }

void myudf_deinit ( SPH_UDF_INIT * init ) { }

int myudf_ver () { return SPH_UDF_VERSION; }

Page 12: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

UDF: коэффициенты внутриpostgres -> coeffs.h

#include "sphinxudf.h" #include coeffs.h

double myudf ( SPH_UDF_INIT * init, SPH_UDF_ARGS * args, char * error_flag ) { double result = f(coeffs); // ... return result; }

...

Page 13: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

UDF: компиляция, деплойgcc -fPIC -shared -o ./myudf.so ./myudf.c

mysql> create function myudf returns float soname 'myudf.so';

mysql> show plugins;+------+--------------------+------------------+-------+-------+| Type | Name | Library | Users | Extra |+------+--------------------+------------------+-------+-------+| udf | myudf | myudf.so | 0 | FLOAT |+------+--------------------+------------------+-------+-------+

Page 14: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

UDF: вызовmysql> select myudf(4);+----------------+| myudf(4) |+----------------+| 0.38 |+----------------+1 row in set (0.00 sec)

Page 15: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Инфраструктура

Page 16: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Хитрости: распределённый индексindex adverts_distr {    type = distributed    agent = server1:9312:adverts    agent = server2:9312:adverts }

update adverts_distr set bid=100 where id=1;

Page 17: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Хитрости: подзапросыselect myudf() as sort_slowfrom advertsorder by sort_fast desc, sort_slow desclimit 100

select * from (select myudf() as sort_slowfrom advertsorder by sort_fast desclimit 100

) order by sort_slow desc

Page 18: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Хитрости: мультизапросыselect myudf() from adverts where foo=bar order by sort_1 asc limit 100;select myudf() from adverts where foo=bar order by sort_2 asc limit 100;

Page 19: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Хитрости: индекс для атрибутов

Медленно:select * from adverts where category_id=109;

Быстро:select * from adverts where match('cat_109');

Page 20: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Хитрости: постфильтрация• часто изменяемое • зависит от пользователя • не селективное

Page 21: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Хитрости: tmpfs

mount -t tmpfs -o size=10g tmpfs /home/sphinx/sources

Page 22: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Результат

Page 23: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

SphixSearch meetup18 июня

http://bit.ly/sphinxmeetup

Page 24: "Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов  (Avito)

Дмитрий Хасанов[email protected] github.com/pik4ez