• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Sphinx 2013
 

Sphinx 2013

on

  • 1,441 views

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

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

Statistics

Views

Total Views
1,441
Views on SlideShare
1,274
Embed Views
167

Actions

Likes
2
Downloads
11
Comments
1

1 Embed 167

https://twitter.com 167

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • Чем лучше/хуже ElasticSearch?
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Sphinx 2013 Sphinx 2013 Presentation Transcript

    • Sphinx 2013 Андрей Аксёнов sphinxsearch.com
    • Что такое Sphinx • • • • • • Сервер текстового поиска, http://sphinxsearch.com Нет, не как Google/Yandex/Bing Да, как Solr/Elastic/FAST/Verity/Autonomy/Yserver Открытые исходники, бесплатный, GPL 300M+ запросов/сутки, 50+ TB коллекции Кроме “просто поиска” умеет кучу всего
    • Про что доклад • • • • • Sphinx 2.1 == начали в 2012, выкатили в 2013 Sphinx 2.2 == начали в 2013, выкатим в 2013 ~50 новых фич в 2.1 ~40 новых фич в 2.2 Но фича, это может быть много…
    • Галопом по вершкам • Линейка 2.1.x • Встроенный адаптивный HA/LB • Качество поиска • Сигналы ранжирования, RU морфология, wordbreaker • Начальная поддержка JSON • Инструментирование (профайлинг на стероидах) • Оптимизации! • Бета в марте, релиз в октябре
    • Галопом по вершкам • Линейка 2.2.x • Манипуляции индексами, ALTER, ATTACH • Качество поиска • Сигналы + UDF v2, EN/DE/CN морфология, local_df • Полная поддержка JSON • Cпецфункции, GROUP <N> BY, табличные функции • Оптимизации! • Бета в октябре, релиз... принимаю ставки!
    • 1. Про встроенный HA/LB • Виды кластеров? • • • • 1 шард, N реплик => HAProxy M шардов, 1 реплика => HAProxy (+бэкапы!) M шардов, N реплик => HAProxy  M шардов, N реплик, выбросы/гетерогено => HA/LB • Читать про agent_mirror, ha_strategy, и т.д. • Говорят, подробнее в следующем докладе
    • 2. Про качество поиска • Качество поиска это НЕ ранжирование!
    • 2. Про качество поиска • Качество поиска это НЕ ранжирование • Токенизация, морфология, обработка при индексации • Анализ и переписывание запросов при поиске • Кворум, коррекция транслита/опечаток, расширения, и т.д. • 1 поиск => 1…3+ запроса к серверу • Ассессорские оценки качества • Формула ранжирования • Shameless plug: звоните, проконсультируем!!!
    • 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.” • “Поручик, это у вас что?!”
    • 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
    • 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()
    • 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 |
    • 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 |
    • 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)
    • 2. Про качество поиска: ранжирование • PACKEDFACTORS() => много циииферок! + данные ассессорских оценок (еще циииферки!) => машинное обучение => модель в UDF, sphinx_get_XXX_factors() => вложенные SELECT для переранжирования = элитный поиск!!! • NDCG boost = ?
    • 19692003
    • 2007+
    • 3. Про JSON • • • • NoSQL это модно! Даешь optionally schemaless! © 2.1: частичная поддержка, { toplevel: “value” } 2.2: полная поддержка, массивы, подобъекты Умеренно эффективный внутренний формат • Блум-фильтр ключей, типизированные массивы • sql_attr_json, rt_attr_json • json_autoconv_numbers, json_autoconv_keynames
    • 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
    • 3. Про JSON: что (пока) нельзя? • 2.1 поддерживает только { toplevel: ”value” } • Нужно пользоваться 2.2 • Лимит в 4 GB JSON и строк на индекс • Нужно шардить • UPDATE не может добавлять, удалять ключи • UPDATE не может менять тип, длину значений • Нужно пользоваться REPLACE
    • 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 раз • Знаешь тип => помоги движку!
    • 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
    • 5. Про три спец-функции • • • • Номер 1, механизм табличных функций Можно полностью поменять result set Пока только одна и встроенная, REMOVE_REPEATS Планирую добавить UDF интерфейс • Или сразу уже пора скрипты?! • Голосуем, лес рук!!!!
    • 5. Про три спец-функции • • • • Номер 2, сделали GROUP <N> BY Сделали группировку по нескольким ключам Сделали поддержку HAVING GROUP <N> BY aaa, bbb, ccc WITHIN GROUP ORDER BY ddd ASC, eee DESC HAVING fff • И все это вроде как работает!!!
    • 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 | +------+------------+
    • 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 # миллисекунды • Стабильная терминация • + Внезапно, аккаунтинг ресурсов!
    • 6. Про инструментирование • Что такое инструментирование? • Это как клининг-менеджер, да?
    • 6. Про инструментирование • Профилирование, трассировка, счетчики, логи… • • • • • SET profiling=1 SHOW PROFILE SHOW PLAN SHOW INDEX myindex STATUS iostats, cpustats, predict_counters in SHOW META
    • 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)
    • 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 | ...
    • 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)))
    • 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)
    • 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)
    • 7. Про оптимизации • Вкрации ™ стало быстрее!!! • Местами В РАЗЫ • Скиплисты, GEODIST, мегасхемы, JSON, токенизация, индексация XML, биграммы, сниппеты…
    • 7. Про оптимизации: что включить • Скиплисты, [редкое частое], [the who] • В среднем 1.7x раза (*) на тестовой коллекции LJ1M • В пределе до 100x раз (*) на синтетических (?) тестах • Как включить? Либо просто ребилд, либо --buildskips • Биграммы, *“редкое любое”+, *“back to school”+ • => либо “back+to to+school” либо “back to+school” • Как включить? bigram_freq_words, bigram_index
    • 7. Про оптимизации: что автоматом • Быстрее токенизатор => индексация, сниппеты • Индексация до 1.25x раз, сниппеты до 1.6x (*) раз • Быстрее фильтрация => спецслучаи • Спецкод для WHERE arg=value • Спецкод для 2, 3 условий через AND • Быстрее обработка схем в SELECT, UPDATE • От 1.02x до 3.5x (!) раз на гигантских схемах
    • 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})
    • 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() ...и еще всякие “мелочи” 
    • “Итоги подведем” © Гамлет Чуть обсудили новости 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 ...
    • “Итоги подведем” © Гамлет • HA/LB, качество поиска, мега-оптимизации, JSON, ALTER, ATTACH, GEODIST, wildcards, OPTIMIZE, double INSERT buffer… многое стало лучше ;) • А многое еще станет!!! • Хотите еще подробнее? Кулуары, мастер-класс • Хотите еще короче? Консультации ;)
    • Вопросы! • shodan@sphinxsearch.com • skype:shodanium • http://slideshare.net/shodan/ • @shodanium #highload2013