SlideShare a Scribd company logo
1 of 51
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

More Related Content

What's hot

Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2Technopark
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Ontico
 
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Roman Brovko
 
Лекция 4. Строки, байты, файлы и ввод/вывод.
 Лекция 4. Строки, байты, файлы и ввод/вывод. Лекция 4. Строки, байты, файлы и ввод/вывод.
Лекция 4. Строки, байты, файлы и ввод/вывод.Roman Brovko
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7Eugene Fidelin
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipesAlexey Ermakov
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Learning from Swift sources, Иван Сметанин
Learning from Swift sources, Иван СметанинLearning from Swift sources, Иван Сметанин
Learning from Swift sources, Иван СметанинMail.ru Group
 
CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)Dmitry Evteev
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3Technopark
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Yandex
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.Roman Brovko
 
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложенийZestranec
 
Новые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практикеНовые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практикеSveta Smirnova
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
 
Haskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageHaskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageAlexander Granin
 

What's hot (20)

Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
 
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.
 
Лекция 4. Строки, байты, файлы и ввод/вывод.
 Лекция 4. Строки, байты, файлы и ввод/вывод. Лекция 4. Строки, байты, файлы и ввод/вывод.
Лекция 4. Строки, байты, файлы и ввод/вывод.
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipes
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Learning from Swift sources, Иван Сметанин
Learning from Swift sources, Иван СметанинLearning from Swift sources, Иван Сметанин
Learning from Swift sources, Иван Сметанин
 
CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.
 
Authentication security
Authentication securityAuthentication security
Authentication security
 
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложений
 
Новые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практикеНовые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практике
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 
Haskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageHaskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell language
 

Similar to Sphinx 2013

MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.Sergey Petrunya
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaSveta Smirnova
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Ontico
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...phpdevby
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструментыRoman Dvornov
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Mikhail Shcherbakov
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Pythonru_Parallels
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на PythonCodeFest
 
Поиск? Sphinx!
Поиск? Sphinx!Поиск? Sphinx!
Поиск? Sphinx!Roman Zaiev
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищиCUSTIS
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Ontico
 
Иван Фролков
Иван ФролковИван Фролков
Иван ФролковCodeFest
 
Sphinx. настройка, эксплуатация
Sphinx. настройка, эксплуатацияSphinx. настройка, эксплуатация
Sphinx. настройка, эксплуатацияandreyborue
 
20131105 романенко
20131105 романенко20131105 романенко
20131105 романенкоYandex
 
Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Fwdays
 
Тестирование защищенности веб-приложений
Тестирование защищенности веб-приложенийТестирование защищенности веб-приложений
Тестирование защищенности веб-приложенийSQALab
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Pavel Egorov
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаMikhail Shcherbakov
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьТо, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьphp-user-group-minsk
 

Similar to Sphinx 2013 (20)

MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Поиск? Sphinx!
Поиск? Sphinx!Поиск? Sphinx!
Поиск? Sphinx!
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
 
Иван Фролков
Иван ФролковИван Фролков
Иван Фролков
 
Sphinx. настройка, эксплуатация
Sphinx. настройка, эксплуатацияSphinx. настройка, эксплуатация
Sphinx. настройка, эксплуатация
 
20131105 романенко
20131105 романенко20131105 романенко
20131105 романенко
 
Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"
 
Тестирование защищенности веб-приложений
Тестирование защищенности веб-приложенийТестирование защищенности веб-приложений
Тестирование защищенности веб-приложений
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьТо, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 

More from Andrew Aksyonoff

Как устроен поиск
Как устроен поискКак устроен поиск
Как устроен поискAndrew Aksyonoff
 
Крадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диодКрадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диодAndrew Aksyonoff
 
Про качественный поиск
Про качественный поискПро качественный поиск
Про качественный поискAndrew Aksyonoff
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компиляторAndrew Aksyonoff
 

More from Andrew Aksyonoff (6)

Wr2013 opensource
Wr2013 opensourceWr2013 opensource
Wr2013 opensource
 
Как устроен поиск
Как устроен поискКак устроен поиск
Как устроен поиск
 
Крадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диодКрадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диод
 
Про качественный поиск
Про качественный поискПро качественный поиск
Про качественный поиск
 
MySQL 101
MySQL 101MySQL 101
MySQL 101
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компилятор
 

Sphinx 2013

  • 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.
  • 5. Галопом по вершкам • Линейка 2.1.x • Встроенный адаптивный HA/LB • Качество поиска • Сигналы ранжирования, RU морфология, wordbreaker • Начальная поддержка JSON • Инструментирование (профайлинг на стероидах) • Оптимизации! • Бета в марте, релиз в октябре
  • 6. Галопом по вершкам • Линейка 2.2.x • Манипуляции индексами, ALTER, ATTACH • Качество поиска • Сигналы + UDF v2, EN/DE/CN морфология, local_df • Полная поддержка JSON • Cпецфункции, GROUP <N> BY, табличные функции • Оптимизации! • Бета в октябре, релиз... принимаю ставки!
  • 7. 1. Про встроенный HA/LB • Виды кластеров? • • • • 1 шард, N реплик => HAProxy M шардов, 1 реплика => HAProxy (+бэкапы!) M шардов, N реплик => HAProxy  M шардов, N реплик, выбросы/гетерогено => HA/LB • Читать про agent_mirror, ha_strategy, и т.д. • Говорят, подробнее в следующем докладе
  • 8. 2. Про качество поиска • Качество поиска это НЕ ранжирование!
  • 9.
  • 10.
  • 11.
  • 12. 2. Про качество поиска • Качество поиска это НЕ ранжирование • Токенизация, морфология, обработка при индексации • Анализ и переписывание запросов при поиске • Кворум, коррекция транслита/опечаток, расширения, и т.д. • 1 поиск => 1…3+ запроса к серверу • Ассессорские оценки качества • Формула ранжирования • Shameless plug: звоните, проконсультируем!!!
  • 13. 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.” • “Поручик, это у вас что?!”
  • 14. 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
  • 15. 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()
  • 16. 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 |
  • 17. 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 |
  • 18. 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)
  • 19. 2. Про качество поиска: ранжирование • PACKEDFACTORS() => много циииферок! + данные ассессорских оценок (еще циииферки!) => машинное обучение => модель в UDF, sphinx_get_XXX_factors() => вложенные SELECT для переранжирования = элитный поиск!!! • NDCG boost = ?
  • 20.
  • 22. 2007+
  • 23. 3. Про JSON • • • • NoSQL это модно! Даешь optionally schemaless! © 2.1: частичная поддержка, { toplevel: “value” } 2.2: полная поддержка, массивы, подобъекты Умеренно эффективный внутренний формат • Блум-фильтр ключей, типизированные массивы • sql_attr_json, rt_attr_json • json_autoconv_numbers, json_autoconv_keynames
  • 24. 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
  • 25. 3. Про JSON: что (пока) нельзя? • 2.1 поддерживает только { toplevel: ”value” } • Нужно пользоваться 2.2 • Лимит в 4 GB JSON и строк на индекс • Нужно шардить • UPDATE не может добавлять, удалять ключи • UPDATE не может менять тип, длину значений • Нужно пользоваться REPLACE
  • 26. 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 раз • Знаешь тип => помоги движку!
  • 27. 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
  • 28. 5. Про три спец-функции • • • • Номер 1, механизм табличных функций Можно полностью поменять result set Пока только одна и встроенная, REMOVE_REPEATS Планирую добавить UDF интерфейс • Или сразу уже пора скрипты?! • Голосуем, лес рук!!!!
  • 29. 5. Про три спец-функции • • • • Номер 2, сделали GROUP <N> BY Сделали группировку по нескольким ключам Сделали поддержку HAVING GROUP <N> BY aaa, bbb, ccc WITHIN GROUP ORDER BY ddd ASC, eee DESC HAVING fff • И все это вроде как работает!!!
  • 30. 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 | +------+------------+
  • 31. 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 # миллисекунды • Стабильная терминация • + Внезапно, аккаунтинг ресурсов!
  • 32. 6. Про инструментирование • Что такое инструментирование? • Это как клининг-менеджер, да?
  • 33.
  • 34.
  • 35. 6. Про инструментирование • Профилирование, трассировка, счетчики, логи… • • • • • SET profiling=1 SHOW PROFILE SHOW PLAN SHOW INDEX myindex STATUS iostats, cpustats, predict_counters in SHOW META
  • 36. 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)
  • 37. 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 | ...
  • 38. 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)))
  • 39. 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)
  • 40. 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)
  • 41.
  • 42.
  • 43. 7. Про оптимизации • Вкрации ™ стало быстрее!!! • Местами В РАЗЫ • Скиплисты, GEODIST, мегасхемы, JSON, токенизация, индексация XML, биграммы, сниппеты…
  • 44. 7. Про оптимизации: что включить • Скиплисты, [редкое частое], [the who] • В среднем 1.7x раза (*) на тестовой коллекции LJ1M • В пределе до 100x раз (*) на синтетических (?) тестах • Как включить? Либо просто ребилд, либо --buildskips • Биграммы, *“редкое любое”+, *“back to school”+ • => либо “back+to to+school” либо “back to+school” • Как включить? bigram_freq_words, bigram_index
  • 45. 7. Про оптимизации: что автоматом • Быстрее токенизатор => индексация, сниппеты • Индексация до 1.25x раз, сниппеты до 1.6x (*) раз • Быстрее фильтрация => спецслучаи • Спецкод для WHERE arg=value • Спецкод для 2, 3 условий через AND • Быстрее обработка схем в SELECT, UPDATE • От 1.02x до 3.5x (!) раз на гигантских схемах
  • 46. 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})
  • 47. 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() ...и еще всякие “мелочи” 
  • 48. “Итоги подведем” © Гамлет Чуть обсудили новости 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 ...
  • 49. “Итоги подведем” © Гамлет • HA/LB, качество поиска, мега-оптимизации, JSON, ALTER, ATTACH, GEODIST, wildcards, OPTIMIZE, double INSERT buffer… многое стало лучше ;) • А многое еще станет!!! • Хотите еще подробнее? Кулуары, мастер-класс • Хотите еще короче? Консультации ;)
  • 50.
  • 51. Вопросы! • shodan@sphinxsearch.com • skype:shodanium • http://slideshare.net/shodan/ • @shodanium #highload2013