Эффективный полнотекстовый поиск по базам данных

Содержание

Слайд 2

Поиск по базам? Базы постоянно растут 1M записей “есть у всех”

Поиск по базам?

Базы постоянно растут
1M записей “есть у всех”
10-100M записей

не редкость
Существуют базы с 1B+ записей, в которых надо искать по тексту (ярчайший пример – Google)
Широко используются open-source СУБД
Мы будем говорить о MySQL
“Люди говорят”, в мирах других СУБД схожие проблемы
Встроенные решения с полнотекстовым поиском справляются недостаточно хорошо
Особенно, если кроме “просто” поиска нужны…
Слайд 3

Виды специальных задач “Просто” поиск – ключевая задача, но… В чистом

Виды специальных задач

“Просто” поиск – ключевая задача, но…
В чистом виде бывает

на удивление редко
Задача, скорее, для Web поисковиков
Часто нужна дополнительная сортировка
По отличному от релевантности ключу – например, по цене товара
Часто нужна дополнительная фильтрация
Например, по категории товара или по автору поста
Часто нужна группировка найденных записей
Например, по дате или по источнику данных
Что предлагают встроенные решения?
Слайд 4

Встроенный MySQL FTS Плюс – встроен, обновляется “сразу” Минус – Только

Встроенный MySQL FTS

Плюс – встроен, обновляется “сразу”
Минус – Только MyISAM
Минус –

плохо масштабируется
Минус – не учитывает позиции слов в индексе
Проблемы с релевантностью
Медленный поиск по фразам
Минус – только 1 FT индекс на запрос (поля…)
Минус – не работает с другими индексами
те. обработка WHERE, ORDER/GROUP BY, LIMIT будет производиться отдельно и “вручную”
Вывод – зачастую не годится
Слайд 5

Shootout внешних решений Тестировались известные (нам) open-source решения Коммерческие решения пусть

Shootout внешних решений

Тестировались известные (нам) open-source решения
Коммерческие решения пусть рекламируют сами

производители ☺
MySQL FTS
mnoGoSearch, http://mnogosearch.org/
Предназначен для Web-поиска, но адаптируется (htdb)
Lucene, http://lucene.apache.org/
Популярная Java-библиотека для поиска
Sphinx, http://sphinxsearch.com/
Изначально спроектирован для поиска по БД
Слайд 6

~3.5M записей, ~5 GB текста (из Wikipedia) mnoGoSearch сошел с дистанции

~3.5M записей, ~5 GB текста (из Wikipedia)
mnoGoSearch сошел с дистанции
подробнее в

презентации Петра Зайцева на EuroOscon‘2006

Результаты тестирования

Слайд 7

Имеющиеся решения mnoGoSearch Минус – проблемы со скоростью индексации и поиска

Имеющиеся решения

mnoGoSearch
Минус – проблемы со скоростью индексации и поиска
FATAL – 5

GB за 24 часа проиндексировать не успел
Lucene
Плюс – обновляющийся “на лету” индекс
Плюс – wildcard, fuzzy поиск
Минус – цена интеграции (это Java библиотека)
Минус – реализация фильтров (скорость поиска)
Минус – отсутствие группировки
Sphinx
Минус – “монолитные” индексы
Плюс – все остальное ☺
Слайд 8

Sphinx – обзор Внешнее решение для поиска по СУБД Две основные

Sphinx – обзор

Внешнее решение для поиска по СУБД
Две основные программы
Indexer, для

переиндексации FT индексов
Searchd, поисковой демон
Легкая интеграция
Встроенная поддержка MySQL, PostgreSQL
Наличие APIs для PHP, Python, Perl, Ruby, и т.д.
Наличие MySQL Storage Engine
Высокая скорость
Скорость индексации – 4-10 MB/sec
Скорость поиска – avg 20-30 ms/q @ 5 GB, 3.5M docs
Слайд 9

Sphinx – идеология Индексация локально доступных баз данных Изначальная поддержка структурированных

Sphinx – идеология

Индексация локально доступных баз данных
Изначальная поддержка структурированных “как в

SQL” документов
До 256 полнотекстовых полей
Любое количество атрибутов (integer/timestamp/etc)
“Быстрая переиндексация вместо медленного поиска”
Необновляемый формат индекса – изначально был выбран в расчете на максимально быстрый поиск
Оказалось – что переиндексация тоже очень быстрая
Для частичных обновлений – переиндексация “частичных” (delta) индексов раз в N минут
Слайд 10

Sphinx – поиск Качество Учитываются позиции слов, не только их частоты

Sphinx – поиск

Качество
Учитываются позиции слов, не только их частоты
Масштабируемость
До 50-100 GB

текста на 1 CPU
Возможен распределенный поиск
Распределенные индексы полностью прозрачны для клиентских приложений
Примеры
Boardreader.com – около 1Bil записей, более 1TB GB текста, в кластере 16 CPU (4*2 Dual Core Servers)
Mininova.org – мало (менее 1M) записей, но 2-3M запросов в сутки, поиск подстрок
Слайд 11

Sphinx – спецвозможности Сортировка По любой комбинации атрибутов, SQL синтаксис Фильтрация

Sphinx – спецвозможности

Сортировка
По любой комбинации атрибутов, SQL синтаксис
Фильтрация записей по условию
Учитывается

при поиске на максимально ранней стадии – для скорости
Атрибуты всегда либо загружены в память, либо раскопированы в нужном порядке в индексе – для скорости
Fun fact – иногда полный перебор всех записей и фильтрация при помощи Sphinx оказываются быстрее соответствующей выборки из MySQL – и используются вместо нее в production…
Слайд 12

Sphinx – спецвозможности Группировка Возможна по какому-либо атрибуту Выполняется в фиксированной

Sphinx – спецвозможности

Группировка
Возможна по какому-либо атрибуту
Выполняется в фиксированной памяти
Выполняется неточно (!)
Выполняется

быстро (по сравнению с MySQL итп)
Подсветка найденных слов
Спец-сервис, которому передаются тексты документов и запроса
MySQL Storage Engine
Для еще более сложной обработки на стороне MySQL, чем возможна на стороне Sphinx
Для упрощения интеграции