Sphinx 2009 Андрей Аксенов

Download Report

Transcript Sphinx 2009 Андрей Аксенов

Sphinx 2009
Андрей Аксенов
EHLO sphinxsearch.com
• Да, это опять я
• Да, очередной доклад про Sphinx
EHLO sphinxsearch.com
• Все еще бесплатная, все еще открытая
поисковая система
• Систему делаем давно, доклады тоже
• Сегодня расскажу про достижения за 2009й
год (всякие технические)
РАЗ
как мы в целом?
svn log > log.txt
• r1 | (no author) | … (Wed, 19 nov 2003) | 1 line
– New repository initialized by cvs2svn.
• r1631 | shodan | … (Mon, 05 Jan 2009) | 3 lines
– unescape query contents
• r2011 | shodan | … (Thu, 01 Oct 2009) | 4 lines
– added FlushAttrs() command and API call, updated
PHP/Python/Java APIs
– added --logdebug option to searchd
http://sphinxsearch.com
• Выпустили 0.9.9-rc2
• Пока не осилили выпустить 0.9.9-release
– Хотел в сентябре, теперь хочу в октябре
• Делаем всякие новые фичи в 0.9.10-dev
• Делаем RT ветку (будет 1.x)
– Альфы тоже хочу в октябре, но…
• Наконец сделали публичный SVN репо
– Поэтому если не успею, то как бы ничего!!!
CHANGELOG-0.9.9-rc2-added
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
added IsConnectError(), Open(), Close() calls to Java API
(bug #240)
added read_buffer, read_unhinted directives
added checks for build options returned by mysql_config
(builds on Solaris now)
added fixed-RAM index merge (bug #169)
added logging chained queries count in case of
(optimized) multi-queries
added GEODIST() function
added --status switch to searchd
added MySpell (OpenOffice) affix file support (bug #281)
added ODBC support (both Windows and UnixODBC)
added support for @id in IN() (bug #292)
added support for aggregate functions in GROUP BY
(namely AVG, MAX, MIN, SUM)
added MySQL UDF that builds snippets using searchd
added write_buffer directive (defaults to 1M)
added xmlpipe_fixup_utf8 directive
added suggestions sample
added microsecond precision int64 timer (bug #282)
added listen_backlog directive
added max_xmlpipe2_field directive
added initial SphinxQL support to mysql41 handler,
SELECT .../SHOW WARNINGS/STATUS/META are handled
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
added support for different network protocols, and
mysql41 protocol
added fieldmask ranker, updated SphinxSE list of rankers
added mysql_ssl_xxx directives
added --cpustats (requires clock_gettime()) and --status
switches to searchd
added performance counters, Status() API call
added overshort_step and stopword_step directives
added strict order operator (aka operator before, eg. "one
<< two << three")
added indextool utility, moved --dumpheader there,
added --debugdocids, --dumphitlist options
added own RNG, reseeded on @random sort query (bug
#183)
added field-start and field-end modifiers support (syntax
is "^hello world$"; field-end requires reindex)
added MVA attribute support to IN() function
added AND, OR, and NOT support to expressions
improved logging of (optimized) multi-queries (now
logging chained query count)
improved handshake error handling, fixed protocol
version byte order (omg)
updated SphinxSE to protocol 1.22
allowed phrase_boundary_step=-1 (trick to emulate
keyword expansion)
removed SPH_MAX_QUERY_WORDS limit
CHANGELOG-*
•
•
•
•
Список фиксов 0.9.9-rc2 еще чуть длиннее
Списка изменений в 0.9.10 вообще пока нет
Поэтому расскажу не абсолютно все!
И не абсолютно подробно!
ДВА
что нового в 0.9.9
svn log branches/rel099
• MySQL protocol + SphinxQL
• Фича года полугодия (первого)
$ mysql -P 3307
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 0.9.9-dev (r1734)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> SELECT * FROM test1 WHERE MATCH('test')
-> ORDER BY group_id ASC OPTION ranker=bm25;
+------+--------+----------+------------+
| id
| weight | group_id | date_added |
+------+--------+----------+------------+
|
4 |
1442 |
2 | 1231721236 |
|
2 |
2421 |
123 | 1231721236 |
|
1 |
2421 |
456 | 1231721236 |
+------+--------+----------+------------+
3 rows in set (0.00 sec)
MySQL listener
• Теперь к searchd можно подцепиться MySQL
клиентом
– ЛЮБЫМ
– Например, программой mysql
– Например, mysql_connect() из PHP/Python/Perl
• Реализация протокола полностью своя
– Наличие mysqld сервера НЕ требуется
– Как и наличие любых mysql библиотек
SphinxQL
•
•
•
•
Подцепиться мало – еще надо запросы
SphinxQL – наш личный типа-диалект SQL
0.9.9 умеет SELECT и еще пару-тройку SHOW
Зато практически весь SELECT
– Любые арифметические выражения
– Некоторые WHERE, ORDER BY, GROUP BY
• Внимание, фокус про “некоторые”
– SELECT *, a OR b AS q WHERE q=1
svn log branches/rel099
• Агрегатные функции (AVG, MIN, MAX, SUM)
• Поддержка ODBC (MS SQL, Oracle, …)
• Внутренние счетчики
– См. ключик --cpustats
– См. SHOW STATUS
• Оператор жесткого порядка
– мама<<мыла<<раму
• Модификаторы ^начала и конца$ поля
svn log branches/rel099
• indexer --merge наконец исполняется в
фиксированной памяти (давно хотели)
• Добавили утилиту indextool
– Начиная с 0.9.9 – только вывод всякого
– Начиная с 0.9.10 – еще и жесткие проверки
корректности индексов (indextool --check)
svn log branches/rel099
• Добавили пример про suggestions
• Добавили read_buffer, write_buffer,
read_unhinted
• Добавили еще ~20 мелких фич, см. доки
– Из них 6 новых директив в конфиге
– xmlpipe_fixup_utf8 + listen_backlog +
max_xmlpipe2_field + mysql_ssl_xxx +
overshort_step + stopword_step
ТРИ
что нового в 0.9.10
svn log trunk
• Была еще вторая (полу-)половина года…
• 180+ коммитов без единого релиза!!!
– Ну, в смысле публичного
– Отсылаем клиентам по мере фиксов
– Отсылаем клиентам по мере изготовления фич
– Выложились на Googlecode
– Хотим больше и чаще, но
– Ресурсов не хватает :(
svn log trunk
• Добавили новые MPM
– Multi Processing Model
– Уже были fork, none (неявно в --console)
– Добавили prefork, threads
• Prefork уже используют в бою (по слухам)
• Threads еще не умеет ротации (будет)
• Оба приятно экономят system time
svn log trunk
• Добавили строковые атрибуты
– sql_attr_string, sql_field_string
– Хранятся строго в памяти, как MVA
– Пока только тупое хранение + возврат
– Пока без ORDER BY / GROUP BY (ау спонсорам)
– Пока без encoding/collations (см. без ORDER BY!)
– Уже можно совсем без базы, тем не менее
svn log trunk
• Добавили indextool --check
– Бывают ошибки в indexer
– Бывают ошибки администрирования
– Бывают сбои железа
– Теперь индекс можно поверить на внутреннюю
корректность
– Fun fact: оказывается, число вхождений слова
можно посчитать 3 (тремя) разными способами
(считаем и проверяем все)
svn log trunk
• Оптимизация для 1-словных запросов
– Замедлили в 0.9.9, почти вернули в 0.9.10
• Оптимизация работы с атрибутами
– Убрали копирования, стало быстрее
• Оптимизация MySQL протокола
– Поправили разное, теперь сильно меньше
оверхедов на клиенте (dummybench)
svn log trunk
• Оптимизация для общих подзапросов
– Для некоторых особенных паттернов
• Оптимизация загрузки (pending review)
– Убираем фазу indexing attributes
– Уже сделали, еще не залили
svn log trunk
• Добавили blend_chars
– Чтобы искать всякие AT&T и т.п. C++
– Чтобы НЕ указывая заранее список exceptions
– Чтобы быстрее (индексируются полные слова)
– Чтобы по кускам слов находилось тоже
– Говорят, удобно для @twittername #hashtags
• Добавили (partially) hitless индексы
– Иногда позиции не нужны!
svn log trunk
• Добавили sql_joined_field
– Если нету или нельзя GROUP_CONCAT
• Добавили query-based режим подсветки
сниппетов
– При поиске “Вася Петров” в кавычках сниппета
“Вася Иванов и Ваня Петров” не будет
svn log trunk
• Добавили expand_keywords, ранкер SPH04
• expand_keywords
– Заменяет hello на (hello|=hello|*hello*)
– Зачем на нашей стороне? Чтобы автоматически
+ правильные позиции слов в запросе
• SPH04
– Бустит полное совпадением поля (посильнее)
– Бустит совпадение в начале поля (послабее)
– В остальном наш обычный proximity+BM25
svn log trunk
• Добавили payloads
– Формально – индексация пользовательских
числовых значений вместо позиции слова
– Практически – фактор взвешивания,
привязанный к слову X в документе Y
– Т.е. можно делать разные для разных слов
– Т.е. можно дать документу “MS buys Yahoo”
буст 100 по слову MS и 32 по слову Yahoo
– В момент индексации
svn log trunk
• И еще несколько фич
– searchd progressbar (read 4.0 of 128.0 MB…)
– searchd --logdebug
– indextool --htmlstrip
– max_batch_queries
– dist_threads (in progress)
– FlushAttrs()
– кажется, это даже полный список фич (пока)
ЧЕТЫРЕ
когда уже 1.0
svn info
• Версии 1.0 не будет никогда.
svn info
• Версии 1.0 не будет никогда.
• Будет сразу 1.10 или 1.11
• Я бы, конечно, предпочел сразу 7i
svn log branches/rt
•
•
•
•
Паралелльно с trunk делали branches/rt
Уже практически альфа (pending review)
Ориентировочно ноябрь-декабрь
Чего ждать и чего не ждать от альфы?
svn log branches/rt
•
•
•
•
•
•
RT индекс живет в фиксированной памяти
Когда память кончается, дампим на диск
Автоматом мержим в памяти
Автоматом управляем кусками
Автоматом управляем kill-lists
Фактически, main+delta, но все автоматом!
svn log branches/rt
• Скорость вставки
– INSERT на 1 запись на 1 KB + COMMIT = ~1-2 ms
– “От начала до конца” в ~1.5-2 раза медленнее
– Понятно, чем реже COMMIT, тем быстрее
– COMMIT еще НЕ durable (уже atomic/isolated)
– Fun fact: VERY isolated
svn log branches/rt
• Скорость поиска
– Для куска в памяти – близко к “обычному”
– Для куска на диске – это и есть (!) “обычный”
– Теоретически на больших индексах будет
измеримо медленнее (фрагментация)
svn log branches/rt
• Интерфейс
– Пока (?) строго через MySQL protocol
– Есть INSERT
– Есть SELECT
– Есть DELETE … WHERE id=X
– Будет UPDATE attr WHERE id=X
– НЕ будет UPDATE field WHERE id=X
– Когда-нибудь сделаем WHERE whatever
ВСЕ!
вопросы?