2. 2Индексируй неиндексируемое
Разминка
1. Скачать материалы по ссылке:
http://bit.ly/dotnetconf6-sphinx
2. Проверить наличие
установленной Visual Studio
2010+
3. Установить ReSharper 7.х
(настоятельно рекомендуется,
но не обязательно)
5. 5Индексируй неиндексируемое
В начале была проблема
Организовать быстрый и лексический
многокритериальный поиск среди данных,
хранящихся в СУБД (в общем случае –
любом произвольном хранилище)
6. 6Индексируй неиндексируемое
Но зачем, ведь есть…
Стандартные средства поиска
• Для реляционных СУБД
• SQL-запросы с WHERE-условиями, операторы LIKE, IN
и BETWEEN
• Полнотекстовые движки, встроенные в СУБД
– MySQL Fulltext
– PostgreSQL Textsearch
– MS SQL Fulltext Filter Daemon
• Для NoSQL СУБД
• Собственные механизмы поиска на основе языка
запросов и (как правило) встроенного
индексирующего движка
7. 7Индексируй неиндексируемое
Недостатки «родных» решений на
основе хранилища данных
1. Зависимость логики работы поиска от
контейнера хранения данных
2. Низкая функциональность с точки зрения
поддержки сложных условий в поисковом
запросе
3. Низкая скорость работы
4. Слабое лексическое обеспечение
8. 8Индексируй неиндексируемое
«Родные» решения
1. Просты и быстры в освоении
2. Идеальны для систем с низкими
требования ко времени отклика при
поиске
3. Хороши для систем с малым объемом
данных
4. Не усложняют инфраструктуру и не
увеличивают сложность поддержки
системы (см. п.2 и п.3)
19. 19Индексируй неиндексируемое
«Чистые» движки поиска
1. Библиотеки с программными биндингами
под различные языки (C++, Java, C#...)
2. Высокие возможности для
конфигурирования
3. Присутствуют интересные
функциональные особенности
4. Удобны для использования в desktop-
приложениях
21. 21Индексируй неиндексируемое
Достоинства
1. Привычная архитектура клиент-сервер
2. Удобство развертывания и интеграции
3. Простота взаимодействия
4. Возможность линейного количественного
повышения производительности
22. 22Индексируй неиндексируемое
Принцип работы сервера
полнотекстового поиска
Сеть
Движок поиска
Веб-сервер
Индекс документов
• HTTP (JSON, XML)
• Проприетарный протокол
• Мимикрия под SQL СУБД
(набор файлов)
23. 23Индексируй неиндексируемое
Apache Solr
• Движок поиска – Lucene
• Интерфейс к движку выполнен в виде
Java-сервлета, запускаемого в контейнере
Apache Tomcat
• Взаимодействие через XML/JSON/CSV-
протокол
• Встроенные средства графического
администрирования
• Огромная расширяемость
24. 24Индексируй неиндексируемое
Sphinx
• Собственный движок поиска
• Выполнен в виде консольного
приложения и умеет возможность
установки в виде Windows-сервиса или
демона
• Взаимодействие по собственному
протоколу или по протоколу
MySQL/PostgreSQL
26. 26Индексируй неиндексируемое
Индекс документов
• Структура данных, обеспечивающая
поиск по набору записей по заданным
критериям
• Единичная запись в индексе – документ
• Документ имеет уникальный
идентификатор
• Основная задача поиска в индексе –
получение набора идентификаторов
найденных документов
27. 27Индексируй неиндексируемое
Типы индексов
• Инвертированный
• Каждому слову из множества слов,
являющихся объединением множеств слов
каждого документа сопоставляется набор
документов, в которых оно встречается
• Прямой
• Каждому документу сопоставляется набор
слов, которые он содержит
28. 28Индексируй неиндексируемое
Типы индексов
• Инвертированный
• Каждому слову из множества слов,
являющихся объединением множеств слов
каждого документа сопоставляется набор
документов, в которых оно встречается
• Прямой
• Каждому документу сопоставляется набор
слов, которые он содержит
33. 33Индексируй неиндексируемое
Стемминг
• Процесс получения инфинитива слова по
его производной форме
• Утилита (библиотека) производящая
стемминг называется «стеммер»
• Индексируются начальные формы слов
• Возможна индексация точных форм слов
(без стемминга, крайне увеличивает
размер индекса)
34. 34Индексируй неиндексируемое
Типы индексов
• Префиксный
• Позволяет искать слова, начинающиеся на
заданное
• чело* -> человек
• Инфиксный
• Позволяет искать слова, оканчивающиеся на
заданное
• *век -> человек
38. 38Индексируй неиндексируемое
Атрибуты документа
• Предназначены для хранения данных и
поиска по ним
• Как правило, поддерживают числовые и
строковые типы данных
• Представляют собой любые данные,
ассоциированные с документов
39. 39Индексируй неиндексируемое
Multi-valued attributes
• Атрибуты, которые представляют собой
неупорядочные наборы однотипных
значений, ассоциированные с документов
• Крайне удобны для индексирования
реляционной структуры данных
41. 41Индексируй неиндексируемое
Построение индекса
• Процесс построения индекса –
индексация
• Индексация подразумевает полную
перестройку индекса «с нуля»
• Как правило индексация выполняется
отдельной утилитой, входящей в комплект
поставки поискового движка
42. 42Индексируй неиндексируемое
Построение индекса
1. Получение единичной записи о
документе из внешнего хранилища
2. Получение данных для его полей
3. Получение данных для его атрибутов
4. Запись документа в индекс
5. …
6. PROFIT
44. 44Индексируй неиндексируемое
Когда индексировать?
• Когда во внешнем хранилище были
изменены проиндексированные
документы
• Когда из внешнего хранилища были
удалены проиндексированные документы
• Когда во внешнее хранилище были
добавлены документы
45. 45Индексируй неиндексируемое
Дельта-индексирование
• Процесс индексирования, целью которого
является минимизация:
• Времени «реагирования» индекса на изменения
во внешнем хранилище
• Нагрузки на внешнее хранилище по получению
из него данных для последующей индексации
• Заключается в индексации только
добавленных/измененных документов и
исключении из индекса удаленных
документов
49. 49Индексируй неиндексируемое
Что включать в индекс?
• Структуру индекса определяет поисковый
запрос, для которого он предназначен
• Грубо говоря, в терминах веб-
приложения индекс должен содержать
набор и полей и атрибутов,
сопоставляемый поисковой форме
50. 50Индексируй неиндексируемое
Сравнение Sphinx и Apache Solr
Sphinx Apache Solr
Скорость индексации 4.5 Мб/с 2.75 Мб/с
Скорость поиска 7 мс / 75 мс 25 мс / 212 мс
Размер индекса 30% 20%
Интерфейс API, SQL Веб-сервис
Стеммеры 15 31
Стоп-слова, синонимы Да Да
Soundex Да Да
Подсветка Да Да
Скорость поиска: 3 слова, 5 потоков, 1000 результатов, среднее/максимальное
время на запрос
51. 51Индексируй неиндексируемое
Особенности Sphinx
1. Высокая скорость индексации
2. Высокая скорость поиска
3. Высокая масштабируемость
4. Распределенная возможность поиска
5. Поддержка нескольких полей полнотекстового поиска в
документе
6. Поддержка нескольких дополнительных атрибутов для
каждого документа
7. Поддержка стоп-слов
8. Поддержка однобайтовых кодировок и UTF-8
9. Поддержка морфологического поиска
10. Родная поддержка MySQL, PostgreSQL и
поддержка ODBC совместимых баз данных
52. 52Индексируй неиндексируемое
Числовые показатели
производительности
1. Скорость индексации
до 10-15 МБ/сек на ядро (средняя 4.5 МБ/сек по результатам теста с
вычиткой данных)
2. Скорость поиска
до 150—250 запросов в секунду на каждое ядро с 1 000 000
документов (3 слова, 5 потоков, 1000 документов в среднем ищет
за 7 мс по результатам теста)
3. Размер индекса
30% от данных (без поддержки инфиксного поиска)
4. Высокая масштабируемость
Крупнейший известный кластер индексирует до 3 000 000 000
документов и поддерживает более 50 миллионов запросов в день
53. 53Индексируй неиндексируемое
Конфигурирование Sphinx
• Основной конфигурационный файл –
sphinx.conf
• Параметры командной строки при
запуске sphinxd.exe
• Список словоформ замены –
wordforms.txt
• Является прямым указанием стеммеру
• Применяется на этапе индексации (sic!)
54. 54Индексируй неиндексируемое
Типы атрибутов Sphinx
• Целые числа (от 1 до 32 бит)
• UNIX timestamps
• Числа с плавающей точкой (32 бита)
• Строки
• MVA (списки произвольной длины,
содержащие целые числа длиной в 32
бита)