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

Андрей Аксёнов, Sphinx Technologies Inc

  • Upload
    ontico

  • View
    896

  • Download
    6

Embed Size (px)

DESCRIPTION

HighLoad++ 2013

Citation preview

Page 1: Андрей Аксёнов, Sphinx Technologies Inc

Sphinx 2013

Андрей Аксёнов

sphinxsearch.com

Page 2: Андрей Аксёнов, Sphinx Technologies Inc

Что такое Sphinx

• Сервер текстового поиска, http://sphinxsearch.com

• Нет, не как Google/Yandex/Bing

• Да, как Solr/Elastic/FAST/Verity/Autonomy/Yserver

• Открытые исходники, бесплатный, GPL

• 300M+ запросов/сутки, 50+ TB коллекции

• Кроме “просто поиска” умеет кучу всего

Page 3: Андрей Аксёнов, Sphinx Technologies Inc

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

• Sphinx 2.1 == начали в 2012, выкатили в 2013

• Sphinx 2.2 == начали в 2013, выкатим в 2013

• ~50 новых фич в 2.1

• ~40 новых фич в 2.2

• Но фича, это может быть много…

Page 4: Андрей Аксёнов, Sphinx Technologies Inc
Page 5: Андрей Аксёнов, Sphinx Technologies Inc

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

• Линейка 2.1.x • Встроенный адаптивный HA/LB • Качество поиска

• Сигналы ранжирования, RU морфология, wordbreaker

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

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

Page 6: Андрей Аксёнов, Sphinx Technologies Inc

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

• Линейка 2.2.x • Манипуляции индексами, ALTER, ATTACH • Качество поиска

• Сигналы + UDF v2, EN/DE/CN морфология, local_df

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

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

Page 7: Андрей Аксёнов, Sphinx Technologies Inc

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

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

• Читать про agent_mirror, ha_strategy, и т.д.

• Говорят, подробнее в следующем докладе

Page 8: Андрей Аксёнов, Sphinx Technologies Inc

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

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

Page 9: Андрей Аксёнов, Sphinx Technologies Inc
Page 10: Андрей Аксёнов, Sphinx Technologies Inc
Page 11: Андрей Аксёнов, Sphinx Technologies Inc
Page 12: Андрей Аксёнов, Sphinx Technologies Inc

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

• Качество поиска это НЕ ранжирование • Токенизация, морфология, обработка при индексации • Анализ и переписывание запросов при поиске

• Кворум, коррекция транслита/опечаток, расширения, и т.д.

• 1 поиск => 1…3+ запроса к серверу

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

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

Page 13: Андрей Аксёнов, Sphinx Technologies Inc

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 Technologies Inc

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

Page 15: Андрей Аксёнов, Sphinx Technologies Inc

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 Technologies Inc

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 Technologies Inc

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 Technologies Inc

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)

Page 19: Андрей Аксёнов, Sphinx Technologies Inc

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

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

• NDCG boost = ?

Page 20: Андрей Аксёнов, Sphinx Technologies Inc
Page 21: Андрей Аксёнов, Sphinx Technologies Inc

1969-2003

Page 22: Андрей Аксёнов, Sphinx Technologies Inc

2007+

Page 23: Андрей Аксёнов, Sphinx Technologies Inc

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 Technologies Inc

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 Technologies Inc

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

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

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

• UPDATE не может добавлять, удалять ключи

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

Page 26: Андрей Аксёнов, Sphinx Technologies Inc

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 Technologies Inc

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 Technologies Inc

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

• Номер 1, механизм табличных функций

• Можно полностью поменять result set

• Пока только одна и встроенная, REMOVE_REPEATS

• Планирую добавить UDF интерфейс • Или сразу уже пора скрипты?! • Голосуем, лес рук!!!!

Page 29: Андрей Аксёнов, Sphinx Technologies Inc

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

• Номер 2, сделали GROUP <N> BY

• Сделали группировку по нескольким ключам

• Сделали поддержку HAVING

• GROUP <N> BY aaa, bbb, ccc WITHIN GROUP ORDER BY ddd ASC, eee DESC HAVING fff

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

Page 30: Андрей Аксёнов, Sphinx Technologies Inc

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 Technologies Inc

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 Technologies Inc

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

• Что такое инструментирование?

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

Page 33: Андрей Аксёнов, Sphinx Technologies Inc
Page 34: Андрей Аксёнов, Sphinx Technologies Inc
Page 35: Андрей Аксёнов, Sphinx Technologies Inc

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

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

• SET profiling=1

• SHOW PROFILE

• SHOW PLAN

• SHOW INDEX myindex STATUS

• iostats, cpustats, predict_counters in SHOW META

Page 36: Андрей Аксёнов, Sphinx Technologies Inc

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 Technologies Inc

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 Technologies Inc

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 Technologies Inc

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 Technologies Inc

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 Technologies Inc
Page 42: Андрей Аксёнов, Sphinx Technologies Inc
Page 43: Андрей Аксёнов, Sphinx Technologies Inc

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

• Вкрации ™ стало быстрее!!!

• Местами В РАЗЫ

• Скиплисты, GEODIST, мегасхемы, JSON, токенизация, индексация XML, биграммы, сниппеты…

Page 44: Андрей Аксёнов, Sphinx Technologies Inc

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 Technologies Inc

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

• Быстрее токенизатор => индексация, сниппеты • Индексация до 1.25x раз, сниппеты до 1.6x (*) раз

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

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

Page 46: Андрей Аксёнов, Sphinx Technologies Inc

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 Technologies Inc

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 Technologies Inc

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

Чуть обсудили новости 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 Technologies Inc

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

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

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

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

• Хотите еще короче? Консультации ;)

Page 50: Андрей Аксёнов, Sphinx Technologies Inc
Page 51: Андрей Аксёнов, Sphinx Technologies Inc

Вопросы!

[email protected]

• skype:shodanium

• http://slideshare.net/shodan/

• @shodanium #highload2013