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

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

  • Upload
    ontico

  • View
    198

  • Download
    1

Embed Size (px)

Citation preview

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