Так как в интернетах тема сравнения движков полнотекстового поиска не раскрыта — есть либо разрозненные комменты на хабре, либо бессмысленные сравнения от «специальных сравнительных сайтов», решил всё-таки сам сравнить MySQL FULLTEXT vs Xapian vs Sphinx vs Lucene/Solr vs PostgreSQL Textsearch. Заодно попробовал CLucene, а в процессе ещё и запатчил несколько багов и нашёл несколько болячек в разных движках.

Сравнение проводилось с точки зрения средненькой базы — тестировал на данных Багзиллы, содержащей в районе 80000 багов, текстов было ~330 мб. Со всеми движками работал из Perl’а, то есть, заодно тестировал интерфейсные библиотеки. ОС Debian Linux Unstable (Wheezy/Sid), процессор Core 2 Duo 3 ГГц.

Итак, встречайте:

Содержание

MySQL fulltext (5.5)

Sphinx (2.0.1-beta)

Xapian (1.2.6)

Xapian имеет 3 backend’а (реализации самого индекса) — в порядке новизны Flint, Chert и Brass. Это как в Debian’е oldstable, stable и testing :) в 1.2.x бэкенд по умолчанию — Chert. До Flint’а ещё был Quartz.

Размер индекса После xapian-compact Индексация без flush() Если дёргать flush()
Flint 2.5x 1.85x 1.1 МБ/с, 1.1 ГБ записи 310 КБ/с, 18.6 ГБ записи
Chert 2.2x 1.68x 1.2 МБ/с, 1.0 ГБ записи 431 КБ/с, 14 ГБ записи
Brass 2.2x 1.68x 1.36 МБ/с, 1.0 ГБ записи 412 КБ/с, 13.5 ГБ записи

PostgreSQL Textsearch (9.1)

Lucene, Solr (3.3)

CLucene 2.3.3.4, Lucene++ 3.0.3.4

Для тех, кто в танке

Сравнительная таблица

MySQL PostgreSQL Xapian Sphinx Solr CLucene
Скорость индексации 314 КБ/с 522 КБ/с 1.36 МБ/с 4.5 МБ/с 2.75 МБ/с 3.8 МБ/с
Скорость поиска 175 мс / 3.46 сек 28 мс / 2.1 сек 14 мс / 135 мс 7 мс / 75 мс 25 мс / 212 мс 10 мс / 212 мс
Размер индекса 150 % 150 % 200 % 30 % 20 % 20 %
Реализация СУБД СУБД Библиотека Сервер Сервер Библиотека
Интерфейс SQL SQL API API, SQL Веб-сервис API
Биндинги 9 6 + 8 3.5
Операторы поиска &*" &* &*"N-~ &*"N-<Z &*"N-~ &*"N-~
Стеммеры Нет 15 15 15 31 15 + CJK
Стоп-слова, синонимы Нет Да Да Да Да Да
Soundex Нет Нет Нет Да Да Нет
Подсветка Нет Да Нет Да Да Да

Ранжирование результатов и сортировка по разным полям есть везде.

Дополнительно:

MySQL Query Expansion.
PostgreSQL Тезаурус, ISpell.
Xapian Коррекция опечаток, фасеты, «недовведённые» запросы.
Sphinx Синонимы со спецсимволами, «полуразделители» (blend_chars). Зоны (абзацы/предложения/теги). Инфиксы, MVA, слияние индексов (не обновляемых). Тюнинг производительности.
Solr Почти всё, что душа пожелает (но зон нет!). Высокая расширяемость.
CLucene Фильтрация документов, фасеты, анализаторы, explain. Высокая расширяемость.

Заключение

Самый простой и самый быстрый движок — Sphinx. Минус в том, что обновляемые индексы там пока не очень юзабельны — их можно использовать, только если никогда ничего не удалять из индекса. Если это пофиксят, проблема выбора отпадёт совсем, Sphinx всех сделает.

Тоже быстрый, очень фичастый, эффективный и расширяемый, но не самый простой в использовании движок — Lucene. Главная проблема с интерфейсами — либо Java, либо C++ порты и проблемы с биндингами. То есть, если вы пишете не под Java, C++, Python или Perl, надо использовать Solr. Solr памяти уже немножко кушает, индексирует и ищет чуть помедленнее, может быть неудобен как отдельный Java-сервер в сервлет-контейнере, но зато имеет огромную кучу разных возможностей.

Xapian… Ищет шустро, индексирует не очень, и сам индекс получается великоват. Его плюс — куча интерфейсов под разные языки (C++, Java, Perl, Python, PHP, Tcl, C#, Ruby, Lua). Если появится режим для отключения индексации точных форм — размер индекса раза в 2 сразу уменьшится.

Если вы уже используете PostgreSQL и готовы мириться с не очень высокой скоростью индексации и полным отсутствием хитрых операторов поиска, то вполне можно использовать Textsearch, потому что ищет он быстрее MySQL и вполне сравнимо с остальными. Но нужно помнить о том, что индекс обязательно создавать на реальной колонке типа tsvector, а не на выражении to_tsvector().

MySQL FULLTEXT тоже можно использовать в простых случаях, когда база небольшая. Но ни в коем случае не делать MATCH(несколько полей) и ни в коем случае не использовать префиксный поиск.


Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».

Репликация: База Знаний «Заказных Информ Систем» → «Сравнение движков полнотекстового поиска»