Advertisement

More Related Content

Slideshows for you(20)

Similar to Sphinx 2013(20)

Advertisement

Sphinx 2013

  1. Sphinx 2013 Андрей Аксёнов sphinxsearch.com
  2. Что такое Sphinx • • • • • • Сервер текстового поиска, http://sphinxsearch.com Нет, не как Google/Yandex/Bing Да, как Solr/Elastic/FAST/Verity/Autonomy/Yserver Открытые исходники, бесплатный, GPL 300M+ запросов/сутки, 50+ TB коллекции Кроме “просто поиска” умеет кучу всего
  3. Про что доклад • • • • • Sphinx 2.1 == начали в 2012, выкатили в 2013 Sphinx 2.2 == начали в 2013, выкатим в 2013 ~50 новых фич в 2.1 ~40 новых фич в 2.2 Но фича, это может быть много…
  4. Галопом по вершкам • Линейка 2.1.x • Встроенный адаптивный HA/LB • Качество поиска • Сигналы ранжирования, RU морфология, wordbreaker • Начальная поддержка JSON • Инструментирование (профайлинг на стероидах) • Оптимизации! • Бета в марте, релиз в октябре
  5. Галопом по вершкам • Линейка 2.2.x • Манипуляции индексами, ALTER, ATTACH • Качество поиска • Сигналы + UDF v2, EN/DE/CN морфология, local_df • Полная поддержка JSON • Cпецфункции, GROUP <N> BY, табличные функции • Оптимизации! • Бета в октябре, релиз... принимаю ставки!
  6. 1. Про встроенный HA/LB • Виды кластеров? • • • • 1 шард, N реплик => HAProxy M шардов, 1 реплика => HAProxy (+бэкапы!) M шардов, N реплик => HAProxy  M шардов, N реплик, выбросы/гетерогено => HA/LB • Читать про agent_mirror, ha_strategy, и т.д. • Говорят, подробнее в следующем докладе
  7. 2. Про качество поиска • Качество поиска это НЕ ранжирование!
  8. 2. Про качество поиска • Качество поиска это НЕ ранжирование • Токенизация, морфология, обработка при индексации • Анализ и переписывание запросов при поиске • Кворум, коррекция транслита/опечаток, расширения, и т.д. • 1 поиск => 1…3+ запроса к серверу • Ассессорские оценки качества • Формула ранжирования • Shameless plug: звоните, проконсультируем!!!
  9. 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.” • “Поручик, это у вас что?!”
  10. 2. Про качество поиска: обработка • $ echo lordofthering expertsexchange.com | bin/wordbreaker --dict dict.txt split lord of the rings experts exchange • regexp_filter • wordforms = postmorph.txt: ~run > walk # maps all of run, runs, running
  11. 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()
  12. 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 |
  13. 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 |
  14. 2. Про качество поиска: ранжирование mysql> select id, packedfactors() from lj where match('the i') limit 1 option ranker=expr('1') id: 14 packedfactors(): 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)
  15. 2. Про качество поиска: ранжирование • PACKEDFACTORS() => много циииферок! + данные ассессорских оценок (еще циииферки!) => машинное обучение => модель в UDF, sphinx_get_XXX_factors() => вложенные SELECT для переранжирования = элитный поиск!!! • NDCG boost = ?
  16. 19692003
  17. 2007+
  18. 3. Про JSON • • • • NoSQL это модно! Даешь optionally schemaless! © 2.1: частичная поддержка, { toplevel: “value” } 2.2: полная поддержка, массивы, подобъекты Умеренно эффективный внутренний формат • Блум-фильтр ключей, типизированные массивы • sql_attr_json, rt_attr_json • json_autoconv_numbers, json_autoconv_keynames
  19. 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
  20. 3. Про JSON: что (пока) нельзя? • 2.1 поддерживает только { toplevel: ”value” } • Нужно пользоваться 2.2 • Лимит в 4 GB JSON и строк на индекс • Нужно шардить • UPDATE не может добавлять, удалять ключи • UPDATE не может менять тип, длину значений • Нужно пользоваться REPLACE
  21. 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 раз • Знаешь тип => помоги движку!
  22. 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
  23. 5. Про три спец-функции • • • • Номер 1, механизм табличных функций Можно полностью поменять result set Пока только одна и встроенная, REMOVE_REPEATS Планирую добавить UDF интерфейс • Или сразу уже пора скрипты?! • Голосуем, лес рук!!!!
  24. 5. Про три спец-функции • • • • Номер 2, сделали GROUP <N> BY Сделали группировку по нескольким ключам Сделали поддержку HAVING GROUP <N> BY aaa, bbb, ccc WITHIN GROUP ORDER BY ddd ASC, eee DESC HAVING fff • И все это вроде как работает!!!
  25. 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 | +------+------------+
  26. 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 # миллисекунды • Стабильная терминация • + Внезапно, аккаунтинг ресурсов!
  27. 6. Про инструментирование • Что такое инструментирование? • Это как клининг-менеджер, да?
  28. 6. Про инструментирование • Профилирование, трассировка, счетчики, логи… • • • • • SET profiling=1 SHOW PROFILE SHOW PLAN SHOW INDEX myindex STATUS iostats, cpustats, predict_counters in SHOW META
  29. 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)
  30. 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 | ...
  31. 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)))
  32. 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)
  33. 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)
  34. 7. Про оптимизации • Вкрации ™ стало быстрее!!! • Местами В РАЗЫ • Скиплисты, GEODIST, мегасхемы, JSON, токенизация, индексация XML, биграммы, сниппеты…
  35. 7. Про оптимизации: что включить • Скиплисты, [редкое частое], [the who] • В среднем 1.7x раза (*) на тестовой коллекции LJ1M • В пределе до 100x раз (*) на синтетических (?) тестах • Как включить? Либо просто ребилд, либо --buildskips • Биграммы, *“редкое любое”+, *“back to school”+ • => либо “back+to to+school” либо “back to+school” • Как включить? bigram_freq_words, bigram_index
  36. 7. Про оптимизации: что автоматом • Быстрее токенизатор => индексация, сниппеты • Индексация до 1.25x раз, сниппеты до 1.6x (*) раз • Быстрее фильтрация => спецслучаи • Спецкод для WHERE arg=value • Спецкод для 2, 3 условий через AND • Быстрее обработка схем в SELECT, UPDATE • От 1.02x до 3.5x (!) раз на гигантских схемах
  37. 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})
  38. 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() ...и еще всякие “мелочи” 
  39. “Итоги подведем” © Гамлет Чуть обсудили новости 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, subSELECT, ZONESPAN, GROUP_CONCAT ...
  40. “Итоги подведем” © Гамлет • HA/LB, качество поиска, мега-оптимизации, JSON, ALTER, ATTACH, GEODIST, wildcards, OPTIMIZE, double INSERT buffer… многое стало лучше ;) • А многое еще станет!!! • Хотите еще подробнее? Кулуары, мастер-класс • Хотите еще короче? Консультации ;)
  41. Вопросы! • shodan@sphinxsearch.com • skype:shodanium • http://slideshare.net/shodan/ • @shodanium #highload2013
Advertisement