51
Sphinx 2013 Андрей Аксёнов sphinxsearch.com

Sphinx 2013

Embed Size (px)

DESCRIPTION

Sphinx news from 2013, presented at Highload, Moscow, Russia.

Citation preview

Page 1: Sphinx 2013

Sphinx 2013Андрей Аксёновsphinxsearch.com

Page 2: Sphinx 2013

Что такое Sphinx

• Сервер текстового поиска, http://sphinxsearch.com• Нет, не как Google/Yandex/Bing• Да, как Solr/Elastic/FAST/Verity/Autonomy/Yserver• Открытые исходники, бесплатный, GPL• 300M+ запросов/сутки, 50+ TB коллекции• Кроме “просто поиска” умеет кучу всего

Page 3: Sphinx 2013

Про что доклад

• Sphinx 2.1 == начали в 2012, выкатили в 2013• Sphinx 2.2 == начали в 2013, выкатим в 2013• ~50 новых фич в 2.1• ~40 новых фич в 2.2• Но фича, это может быть много…

Page 4: Sphinx 2013
Page 5: Sphinx 2013

Галопом по вершкам

• Линейка 2.1.x• Встроенный адаптивный HA/LB• Качество поиска• Сигналы ранжирования, RU морфология, wordbreaker

• Начальная поддержка JSON• Инструментирование (профайлинг на стероидах)• Оптимизации!

• Бета в марте, релиз в октябре

Page 6: Sphinx 2013

Галопом по вершкам

• Линейка 2.2.x• Манипуляции индексами, ALTER, ATTACH• Качество поиска• Сигналы + UDF v2, EN/DE/CN морфология, local_df

• Полная поддержка JSON• Cпецфункции, GROUP <N> BY, табличные функции• Оптимизации!

• Бета в октябре, релиз... принимаю ставки!

Page 7: Sphinx 2013

1. Про встроенный HA/LB

• Виды кластеров?• 1 шард, N реплик => HAProxy• M шардов, 1 реплика => HAProxy (+бэкапы!)• M шардов, N реплик => HAProxy • M шардов, N реплик, выбросы/гетерогено => HA/LB

• Читать про agent_mirror, ha_strategy, и т.д.• Говорят, подробнее в следующем докладе

Page 8: Sphinx 2013

2. Про качество поиска

• Качество поиска это НЕ ранжирование!

Page 9: Sphinx 2013
Page 10: Sphinx 2013
Page 11: Sphinx 2013
Page 12: Sphinx 2013

2. Про качество поиска

• Качество поиска это НЕ ранжирование• Токенизация, морфология, обработка при индексации• Анализ и переписывание запросов при поиске• Кворум, коррекция транслита/опечаток, расширения, и т.д.• 1 поиск => 1…3+ запроса к серверу

• Ассессорские оценки качества• Формула ранжирования

• Shameless plug: звоните, проконсультируем!!!

Page 13: Sphinx 2013

2. Про качество поиска: морфология• stem_ar• lemmatize_ru, _en, _de• stem(BUSY) == BUSI, stem(BUSINESS) == BUSI• lemma(BUSY) == BUSY, lemma(BUSINESS) == BUSINESS

• lemmatize_ru_all, _en_all, _de_all• lemma(LEFT) == [LEAVE, LEFT]• “He left us. Make a left turn.”• “Поручик, это у вас что?!”

Page 14: Sphinx 2013

2. Про качество поиска: обработка• $ echo lordofthering expertsexchange.com

| bin/wordbreaker --dict dict.txt splitlord of the ringsexperts exchange

• regexp_filter• wordforms = postmorph.txt:

~run > walk # maps all of run, runs, running

Page 15: Sphinx 2013

2. Про качество поиска: ранжирование• index_field_lengths, BM25A(), BM25F()• global_idf, local_df, OPTION idf=plain, normalized, etc• lccs, wlccs, exact_order, min_gaps, atc,

min_idf, max_idf, sum_idf• PACKEDFACTORS()• sphinx_get_XXX_factors()

Page 16: Sphinx 2013

2. Про качество поиска: ранжирование• … WHERE MATCH(’depeche mode’) /* no i_f_l */| id | weight() | title |+-------+----------+------------------------------------------------------+| 12659 | 2695 | eMOTIVe || 69856 | 2695 | Random Thoughts || 42194 | 2673 | Campus Invasion tour at FIU || 3146 | 2642 | || 6054 | 2642 | Когда я не нахожу себе места... || 7142 | 2642 | .... || 16695 | 2642 | приветствие))) || 17325 | 2642 | DM и Cesaria Evora || 18713 | 2642 | Музыка mp3 || 23891 | 2642 | Messages |

Page 17: Sphinx 2013

2. Про качество поиска: ранжирование• … OPTION ranker=expr('1000000*(sum(lcs)+bm25a(1.2,0.7))')

| id | weight() | title |+-------+----------+------------------------------------+| 3146 | 2716617 | || 16695 | 2709227 | приветствие)))| 12659 | 2698512 | eMOTIVe || 69856 | 2682182 | Random Thoughts || 24204 | 2680355 | he never told me his name || 17325 | 2663691 | DM и Cesaria Evora || 42781 | 2657857 | Handle Your Scandal || 84337 | 2651555 | || 23891 | 2648728 | Messages || 40876 | 2646811 | Ganking from bob....... once again |

Page 18: Sphinx 2013

2. Про качество поиска: ранжированиеmysql> select id, packedfactors() from lj where match('the i') limit 1 option ranker=expr('1')

id: 14packedfactors(): bm25=487, bm25a=0.482982, field_mask=2, doc_word_count=2, field1=(lcs=1, hit_count=4, word_count=2, tf_idf=-0.045190, min_idf=-0.012686, max_idf=-0.007131, sum_idf=-0.019817, min_hit_pos=254, min_best_span_pos=254, exact_hit=0, max_window_hits=1, min_gaps=1, exact_order=1, lccs=1, wlccs=-0.012686, atc=0.000063), word0=(tf=1, idf=-0.007131), word1=(tf=3, idf=-0.012686)

Page 19: Sphinx 2013

2. Про качество поиска: ранжирование• PACKEDFACTORS()

=> много циииферок! + данные ассессорских оценок (еще циииферки!)=> машинное обучение=> модель в UDF, sphinx_get_XXX_factors()=> вложенные SELECT для переранжирования = элитный поиск!!!

• NDCG boost = ?

Page 20: Sphinx 2013
Page 21: Sphinx 2013

1969-2003

Page 22: Sphinx 2013

2007+

Page 23: Sphinx 2013

3. Про JSON

• NoSQL это модно! Даешь optionally schemaless! ©• 2.1: частичная поддержка, { toplevel: “value” }• 2.2: полная поддержка, массивы, подобъекты• Умеренно эффективный внутренний формат• Блум-фильтр ключей, типизированные массивы

• sql_attr_json, rt_attr_json• json_autoconv_numbers, json_autoconv_keynames

Page 24: Sphinx 2013

3. Про JSON: что можно?

• SELECT j.key1, BIGINT(j.abc.def[3][x+456])…• ... WHERE j.key1=123• … ORDER BY j.key1[3] ASC, … GROUP BY j.key1[3]• INSERT INTO rt (id, j) VALUES (123, '{x:[3,7,40]}')• SELECT id, ANY(t=3 FOR t IN j.x) FROM rt• ALL(), ANY(), INDEXOF()

• UPDATE rt SET j.scalar=123 WHERE id=456

Page 25: Sphinx 2013

3. Про JSON: что (пока) нельзя?

• 2.1 поддерживает только { toplevel: ”value” }• Нужно пользоваться 2.2

• Лимит в 4 GB JSON и строк на индекс• Нужно шардить

• UPDATE не может добавлять, удалять ключи• UPDATE не может менять тип, длину значений• Нужно пользоваться REPLACE

Page 26: Sphinx 2013

3. Про JSON: скорость

• Алярм! По умолчанию значение это строка!!!• 0.566 sec, SELECT * FROM lj ORDER BY j.c• 0.038 sec, SELECT id, INTEGER(j.c) cc, title FROM lj

ORDER BY cc ASC• 0.032 sec, SELECT id, c, title FROM lj ORDER BY c ASC

• Разница от 18% до 18 раз• Знаешь тип => помоги движку!

Page 27: Sphinx 2013

4. Про более динамические индексы• ALTER TABLE diskindex ADD COLUMN moo INTEGER• ALTER TABLE rtindex ADD COLUMN moo INTEGER• Пока нету ALTER TABLE rtindex DROP COLUMN moo

• ATTACH INDEX megabatch TO RTINDEX myrtindex• myrtindex теперь может быть НЕ пустым!

• OPTIMIZE INDEX myrtindex

Page 28: Sphinx 2013

5. Про три спец-функции

• Номер 1, механизм табличных функций• Можно полностью поменять result set• Пока только одна и встроенная, REMOVE_REPEATS• Планирую добавить UDF интерфейс• Или сразу уже пора скрипты?!• Голосуем, лес рук!!!!

Page 29: Sphinx 2013

5. Про три спец-функции

• Номер 2, сделали GROUP <N> BY• Сделали группировку по нескольким ключам• Сделали поддержку HAVING• GROUP <N> BY aaa, bbb, ccc

WITHIN GROUP ORDER BY ddd ASC, eee DESCHAVING fff

• И все это вроде как работает!!!

Page 30: Sphinx 2013

5. Про три спец-функции

mysql> SELECT id, channel_id FROM lj GROUP 2 BY channel_id LIMIT 4;

+------+------------+

| id | channel_id |

+------+------------+

| 1 | 1107024 |

| 2 | 1107024 |

| 5 | 1107004 |

| 6 | 1107004 |

+------+------------+

Page 31: Sphinx 2013

5. Про три спец-функции

• Номер 3, сделали max_predicted_time• predicted_time_costs =

doc=A, hit=B, skip=C, match=D # наносекунды• predicted_time =

A*docs + B*hits + C*matches + D*skips• OPTION max_predicted_time=100 # миллисекунды• Стабильная терминация• + Внезапно, аккаунтинг ресурсов!

Page 32: Sphinx 2013

6. Про инструментирование

• Что такое инструментирование?• Это как клининг-менеджер, да?

Page 33: Sphinx 2013
Page 34: Sphinx 2013
Page 35: Sphinx 2013

6. Про инструментирование

• Профилирование, трассировка, счетчики, логи…

• SET profiling=1• SHOW PROFILE• SHOW PLAN• SHOW INDEX myindex STATUS• iostats, cpustats, predict_counters in SHOW META

Page 36: Sphinx 2013

6. Про инструментированиеmysql> SET profiling=1; SELECT * FROM lj WHERE MATCH(’the who’); SHOW PROFILE;...+--------------+----------+----------+---------+ | read_docs | 0.000197 | 2 | 1.23 || Status | Duration | Switches | Percent | | read_hits | 0.000347 | 22 | 2.16 |+--------------+----------+----------+---------+ | get_docs | 0.002969 | 151 | 18.48 || unknown | 0.001153 | 6 | 7.18 | | get_hits | 0.003537 | 609 | 22.02 || net_read | 0.000007 | 1 | 0.04 | | filter | 0.000276 | 147 | 1.72 || dist_connect | 0.000001 | 1 | 0.01 | | rank | 0.004032 | 748 | 25.10 || local_search | 0.000075 | 1 | 0.47 | | sort | 0.001183 | 33 | 7.36 || sql_parse | 0.000275 | 1 | 1.71 | | finalize | 0.000694 | 1 | 4.32 || dict_setup | 0.000002 | 1 | 0.01 | | dist_wait | 0.000002 | 1 | 0.01 || parse | 0.000083 | 1 | 0.52 | | aggregate | 0.000069 | 1 | 0.43 || transforms | 0.000003 | 1 | 0.02 | | net_write | 0.000034 | 1 | 0.21 || init | 0.001014 | 3 | 6.31 | | total | 0.016065 | 1733 | 0 || open | 0.000112 | 1 | 0.70 | +--------------+----------+----------+---------+... 22 rows in set (0.00 sec)

Page 37: Sphinx 2013

6. Про инструментированиеmysql> SET profiling=1; SELECT ...; SHOW PROFILE;+--------------+----------+----------+---------+| Status | Duration | Switches | Percent |+--------------+----------+----------+---------+| unknown | 0.001153 | 6 | 7.18 |...| read_docs | 0.000197 | 2 | 1.23 || read_hits | 0.000347 | 22 | 2.16 || get_docs | 0.002969 | 151 | 18.48 || get_hits | 0.003537 | 609 | 22.02 || filter | 0.000276 | 147 | 1.72 || rank | 0.004032 | 748 | 25.10 || sort | 0.001183 | 33 | 7.36 || finalize | 0.000694 | 1 | 4.32 |...

Page 38: Sphinx 2013

6. Про инструментированиеmysql> SELECT * FROM test WHERE MATCH('@title abc* @body hey') \G SHOW PLAN \G...

Variable: transformed_tree Value: AND( OR(fields=(title), KEYWORD(abcx, querypos=1, expanded), KEYWORD(abcm, querypos=1, expanded)), AND(fields=(body), KEYWORD(hey, querypos=2)))

Page 39: Sphinx 2013

6. Про инструментированиеmysql> SHOW INDEX lj STATUS;+-------------------+-----------+| Variable_name | Value |+-------------------+-----------+| index_type | disk || indexed_documents | 99984 || indexed_bytes | 129481542 || ram_bytes | 11945925 || disk_bytes | 89392682 |+-------------------+-----------+5 rows in set (0.00 sec)

Page 40: Sphinx 2013

6. Про инструментированиеmysql> select * from lj where match('the who') OPTION max_predicted_time=1000000; # also --iostats --cpustats SHOW META;...+-------------------------+--------+ | fetched_docs | 75190 || Variable_name | Value | | fetched_hits | 262942 |+-------------------------+--------+ | fetched_skips | 148 || total | 1000 | | keyword[0] | the || total_found | 16207 | | docs[0] | 58128 || time | 0.013 | | hits[0] | 460421 || prediction_fetched_docs | 75190 | | keyword[1] | who || prediction_fetched_hits | 262942 | | docs[1] | 17175 || prediction_skips | 148 | | hits[1] | 32456 || predicted_time | 18 | +-------------------------+--------+| dist_predicted_time | 0 | 17 rows in set (0.00 sec)

Page 41: Sphinx 2013
Page 42: Sphinx 2013
Page 43: Sphinx 2013

7. Про оптимизации

• Вкрации ™ стало быстрее!!!• Местами В РАЗЫ• Скиплисты, GEODIST, мегасхемы, JSON,

токенизация, индексация XML, биграммы, сниппеты…

Page 44: Sphinx 2013

7. Про оптимизации: что включить• Скиплисты, [редкое частое], [the who]• В среднем 1.7x раза (*) на тестовой коллекции LJ1M• В пределе до 100x раз (*) на синтетических (?) тестах• Как включить? Либо просто ребилд, либо --buildskips

• Биграммы, [“редкое любое”], [“back to school”]• => либо “back+to to+school” либо “back to+school”• Как включить? bigram_freq_words, bigram_index

Page 45: Sphinx 2013

7. Про оптимизации: что автоматом• Быстрее токенизатор => индексация, сниппеты• Индексация до 1.25x раз, сниппеты до 1.6x (*) раз

• Быстрее фильтрация => спецслучаи• Спецкод для WHERE arg=value• Спецкод для 2, 3 условий через AND

• Быстрее обработка схем в SELECT, UPDATE• От 1.02x до 3.5x (!) раз на гигантских схемах

Page 46: Sphinx 2013

7. Про оптимизации: что автоматом• Быстрее доступ к JSON• Спецкод для j.key1 случая, ~20%• Начиная с 2.2 укладываем по порядку, ~20%

• Быстрее и едят СИЛЬНО меньше памяти сниппеты• 32 MB док, было 970 MB, стало 50 MB• Ведем работы про внедрение forward index cache

• Быстрее, умнее и точнее (!) GEODIST(a,b,c,d,{in=deg, out=mi, method=adaptive})

Page 47: Sphinx 2013

8. А что еще?

• Поиск по маске, [t?st*]• Двойная буферизация RT (нет задержек INSERT)• POLY2D(), GEOPOLY2D(), CONTAINS()• Многопоточный опрос удаленных нод (агентов)• Поиск в любых списках, SELECT … FROM dist1,dist2,local3 …• Вложенные выборки, SELECT * FROM (SELECT …) ORDER BY …• Строки в UDF функциях, CREATE FUNCTION … RETURNS STRING• Оператор ZONESPAN:xxx, функция ZONESPANLIST()• Агрегатная функция GROUP_CONCAT()• ...и еще всякие “мелочи”

Page 48: Sphinx 2013

“Итоги подведем” © Гамлет

Чуть обсудили новости 2013: agent_mirror, ha_strategy, stem_ar, lemmatize_ru, _en, _de, _all, RLP segmenter, wordbreaker, regexp_filter, BM25F, global_idf, local_df, index_field_lengths, wlccs, atc, PACKEDFACTORS, rt_attr_json, ANY(), ALL(), ALTER TABLE, ATTACH INDEX, OPTIMIZE INDEX, tablefuncs, GROUP <N> BY key1,key2 HAVING, SHOW PROFILE, SHOW PLAN, max_predicted_time, SHOW INDEX STATUS, bigram_index, POLY2D, GEODIST, sub-SELECT, ZONESPAN, GROUP_CONCAT ...

Page 49: Sphinx 2013

“Итоги подведем” © Гамлет

• HA/LB, качество поиска, мега-оптимизации, JSON, ALTER, ATTACH, GEODIST, wildcards, OPTIMIZE, double INSERT buffer… многое стало лучше ;)

• А многое еще станет!!!

• Хотите еще подробнее? Кулуары, мастер-класс• Хотите еще короче? Консультации ;)

Page 50: Sphinx 2013
Page 51: Sphinx 2013

Вопросы!

[email protected]• skype:shodanium

• http://slideshare.net/shodan/• @shodanium #highload2013