1. Поиск на своем сайте,
обзор open source решений
Алексей Рагозин
2. Поиск на своём сайте
• Искать SQLем по своей базе
o Вы наверное не слышали об альтернативах?
• Использовать поиск от /
o Отличный вариант для небольших сайтов
• Установить у себя поисковый движок
elasticserach сервер
3. Ингредиенты поиска
КОНТЕНТ / ДОКУМЕНТЫ
поисковые
ПОИСКОВЫЙ UI
запрос документы
парсер парсер
Индексный
спелчекер анализатор
движок
... стемер
результат
поиска
статистика
5. Поисковый индекс
Типичная RDBMS
• Инвертированный индекс
• Индекс по одному полю или по композитному атрибуту
• Одно значение на атрибуту (full text – много значений)
• Обычно только один из индексов используется в select`е
• B-Tree – эффективная вставка/изменение
6. Поисковый индекс
Типичный поисковый движок
• Инвертированный индекс
• Все атрибуты в одном индексе
• Произвольное количество значений атрибута на документ
• Поиск происходит по всем атрибута запроса одним махом
• Интегрированное ранжирование
• Плотный бинарный формат индекса – read only
8. Open Source
Lucene – библиотека / фреймворк - Java
• Solr – всё в одном, прицел на “enterprise”
• elasticsearch – простота
• IndexTank – crowd sourcing
Sphinx – скорость / простота - C++
9. Что нужно хотеть от поиска?
в дополнение к качественным
и релевантным результатам
• Фасетная навигация • Подсказки
(динамическая классификация) (автодополнение)
• Кластеризация • Пространственный поиск
• Автокоррекция • в т.ч. с фасетами
• “more like this”
10. Фасеты
Динамический набор
категорий
Активный фильтры
Число найденных документов
по запросу и фильтру
15. Что индексировать?
Файлы?
Apache Tika – извлечение метаданных из файлов
определения типа контента
определение языка
определение кодовой страницы
Microsoft Office, Open Office, PDF, HTML, Unix mailbox, …
Достать тэги из mp3? - не вопрос
16. Что индексировать?
Индекс плоский, область поиска - не всегда
Каталог продуктов
• Джинсы Levis #559, индиго
• Джинсы Levis #559, индиго, размер 32x32
Что считать документом?
17. Когда индексировать?
Поисковые индексы нужно перестраивать
Периодическая переиндексация всех документов
• Динамические атрибуты (пример наличие на складе)
Сегментированный индекс
• Позволяет изменять набор документов без перестройки
всего индекса
• Требует регулярной “оптимизации” индекса
18. Индексные сегменты в Lucene
Логарифмическое слияние сегментов
#3 #5 #6
#7
#5
#2 #2 #4
#6 #6
#1 #1 #1 #1
Самые молодые сегменты можно не спешить писать на диск
20. Масштабирование
Объём индекса
• Индекс должен помещаться в память
• Решение – партицирование индекса
• Каждая партиция выполняет скоринг независимо
• Результаты нужно агрегировать
21. Резюме: Lucene
• Фреймворк/библиотека
• Java API (нет сетевого интерфейса)
• Фундамент построения поисковой системы
• Встраиваемый (в т.ч. in-memory индексы)
• 3.x – примитивная модель ранжирования
22. Резюме: Solr
• Feature reach поиск из коробки
• Эффективная поддержка фасетов
• Кросс платформенные клиент (HTTP)
• Интеграция со многими CMS
• Управление распределённым индексом и репликацией
• Фокус - “enterprise” приложения
• ОБШИРНАЯ экосистема
23. Резюме: Sphinx
• Простой и быстрый
• Интеграция с MySQL
• Интеграция со многими CMS
• Базовый поисковый функционал
• DIY - фасеты, подсказки и т.п.
• Распределённый поиск (партицирование)
24. Резюме: elasticsearch
• Управление распределённым индексом
• Управление кластером (дискавери, балансировка)
• Простой HTTP/JSON API
• Нет жесткой схемы
• Иcпользует Lucene – поиск, фасеты, “more like this”, …
• Фокус – простота и масштабируемость
25. Резюме: Index tank
Index tank появился как поисковый SaaS. После покупки
компании, код продукта был опубликован как open source.
• Фокус: социальный контент и crowd sourcing
• Ранжирование по динамическим атрибутам
(голоса, рейтинг и т.п.)
• Управление поисковым “облаком”
26. Поиск на естественном языке
Apache UIMA
• Термы обогащаются семантическими атрибутами на этапе
индексации
• Определение частей речи
• Machine learning для извлечения семантики
• Специальный поисковый парсер
• Английский язык
27. Спасибо
Алексей Рагозин
alexey.ragozin@gmail.com