Поиск на своем сайте,
обзор open source решений
      Алексей Рагозин
Поиск на своём сайте
• Искать SQLем по своей базе
  o Вы наверное не слышали об альтернативах?
• Использовать поиск от                  /
  o Отличный вариант для небольших сайтов
• Установить у себя поисковый движок

                             elasticserach   сервер
Ингредиенты поиска




                                                                             КОНТЕНТ / ДОКУМЕНТЫ
                                                    поисковые
ПОИСКОВЫЙ UI




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

                           статистика
Поисковый документ
                           Термы
                           id:184647753295609857
                           author:pledbook tag:grails
                           tag:elasticserach text:look
                           text:use text:plugin
                           text:grails text:website
                           url:grails.org/plugin/...
Анализ документа:          date:2012.03.27
  токенизаиця , стеминг,
  морфология, стоп-слова
Поисковый индекс
Типичная RDBMS
•   Инвертированный индекс
•   Индекс по одному полю или по композитному атрибуту
•   Одно значение на атрибуту (full text – много значений)
•   Обычно только один из индексов используется в select`е
•   B-Tree – эффективная вставка/изменение
Поисковый индекс
Типичный поисковый движок
•   Инвертированный индекс
•   Все атрибуты в одном индексе
•   Произвольное количество значений атрибута на документ
•   Поиск происходит по всем атрибута запроса одним махом
•   Интегрированное ранжирование
•   Плотный бинарный формат индекса – read only
Поисковый запрос vs. SQL
SQL                         Поисковый запрос
• cложный запросы / joins   • “плоский” select
• детерминированный         • сложные комбинации
  запрос                      атрибутов
• возвращает данные         • нечёткие запросы
                            • ранжирование
                            • возвращает метаданные
Open Source
Lucene – библиотека / фреймворк - Java
• Solr – всё в одном, прицел на “enterprise”
• elasticsearch – простота
• IndexTank – crowd sourcing
Sphinx – скорость / простота - C++
Что нужно хотеть от поиска?
            в дополнение к качественным
            и релевантным результатам
• Фасетная навигация             • Подсказки
  (динамическая классификация)     (автодополнение)
• Кластеризация                  • Пространственный поиск
• Автокоррекция                     • в т.ч. с фасетами
                                 • “more like this”
Фасеты
      Динамический набор
          категорий



         Активный фильтры


Число найденных документов
    по запросу и фильтру
Кластеризация

Кластеры создаются
 на основе текста
    документов
Автокоррекция



n-gram индекс            Нечёткий поиск
• Отдельный индекс для   • Работает по основному
  коррекции                индексу
                         • Levinstein automata - Lucene
Подсказки



Похоже на автокоррекцию. Запрос “дописывается”
на основе словаря по индексу и дополняется
ключевыми словами на основе статистики.
Пространственный поиск



• Поддержка geodist – Lucene, Sphinx – зачёт
• Индекс по декартовой сетке - Solr
Что индексировать?
Файлы?
 Apache Tika – извлечение метаданных из файлов
  определения типа контента
  определение языка
  определение кодовой страницы
  Microsoft Office, Open Office, PDF, HTML, Unix mailbox, …
Достать тэги из mp3? - не вопрос
Что индексировать?
Индекс плоский, область поиска - не всегда
Каталог продуктов
• Джинсы Levis #559, индиго
• Джинсы Levis #559, индиго, размер 32x32
Что считать документом?
Когда индексировать?
    Поисковые индексы нужно перестраивать
Периодическая переиндексация всех документов
• Динамические атрибуты (пример наличие на складе)
Сегментированный индекс
• Позволяет изменять набор документов без перестройки
  всего индекса
• Требует регулярной “оптимизации” индекса
Индексные сегменты в Lucene
    Логарифмическое слияние сегментов
                      #3     #5     #6
                                           #7
                                    #5
              #2      #2     #4


                                    #6     #6
       #1     #1      #1     #1




Самые молодые сегменты можно не спешить писать на диск
Масштабирование
Производительность
• Упирается в CPU
• Сложные запросы могут быть очень CPU-ёмкими
Решение – несколько реплик индекса
  • read-only файлы облегчают задачу
Масштабирование
Объём индекса
• Индекс должен помещаться в память
• Решение – партицирование индекса
  • Каждая партиция выполняет скоринг независимо
  • Результаты нужно агрегировать
Резюме: Lucene
•   Фреймворк/библиотека
•   Java API (нет сетевого интерфейса)
•   Фундамент построения поисковой системы
•   Встраиваемый (в т.ч. in-memory индексы)
•   3.x – примитивная модель ранжирования
Резюме: Solr
•   Feature reach поиск из коробки
•   Эффективная поддержка фасетов
•   Кросс платформенные клиент (HTTP)
•   Интеграция со многими CMS
•   Управление распределённым индексом и репликацией
•   Фокус - “enterprise” приложения
•   ОБШИРНАЯ экосистема
Резюме: Sphinx
•   Простой и быстрый
•   Интеграция с MySQL
•   Интеграция со многими CMS
•   Базовый поисковый функционал
    • DIY - фасеты, подсказки и т.п.
• Распределённый поиск (партицирование)
Резюме: elasticsearch
•   Управление распределённым индексом
•   Простой HTTP/JSON API
•   Нет схемы
•   Иcпользует Lucene, поиск, фасеты, “more like this”, …
•   Фокус – простота и масштабируемость
Резюме: Index tank
Index tank появился как поисковый SaaS. После покупки
компании, код продукта был опубликован как open source.

• Фокус: социальный контент и crowd sourcing
• Ранжирование по динамическим атрибутам
  (голоса, рейтинг и т.п.)
• Управление поисковым “облаком”
Спасибо

           Алексей Рагозин
      alexey.ragozin@gmail.com

Поиск на своем сайте, обзор Open source решений (Алексей Рагозин)

  • 1.
    Поиск на своемсайте, обзор open source решений Алексей Рагозин
  • 2.
    Поиск на своёмсайте • Искать SQLем по своей базе o Вы наверное не слышали об альтернативах? • Использовать поиск от / o Отличный вариант для небольших сайтов • Установить у себя поисковый движок elasticserach сервер
  • 3.
    Ингредиенты поиска КОНТЕНТ / ДОКУМЕНТЫ поисковые ПОИСКОВЫЙ UI запрос документы парсер парсер Индексный спелчекер анализатор движок ... стемер результат поиска статистика
  • 4.
    Поисковый документ Термы id:184647753295609857 author:pledbook tag:grails tag:elasticserach text:look text:use text:plugin text:grails text:website url:grails.org/plugin/... Анализ документа: date:2012.03.27 токенизаиця , стеминг, морфология, стоп-слова
  • 5.
    Поисковый индекс Типичная RDBMS • Инвертированный индекс • Индекс по одному полю или по композитному атрибуту • Одно значение на атрибуту (full text – много значений) • Обычно только один из индексов используется в select`е • B-Tree – эффективная вставка/изменение
  • 6.
    Поисковый индекс Типичный поисковыйдвижок • Инвертированный индекс • Все атрибуты в одном индексе • Произвольное количество значений атрибута на документ • Поиск происходит по всем атрибута запроса одним махом • Интегрированное ранжирование • Плотный бинарный формат индекса – read only
  • 7.
    Поисковый запрос vs.SQL SQL Поисковый запрос • cложный запросы / joins • “плоский” select • детерминированный • сложные комбинации запрос атрибутов • возвращает данные • нечёткие запросы • ранжирование • возвращает метаданные
  • 8.
    Open Source Lucene –библиотека / фреймворк - Java • Solr – всё в одном, прицел на “enterprise” • elasticsearch – простота • IndexTank – crowd sourcing Sphinx – скорость / простота - C++
  • 9.
    Что нужно хотетьот поиска? в дополнение к качественным и релевантным результатам • Фасетная навигация • Подсказки (динамическая классификация) (автодополнение) • Кластеризация • Пространственный поиск • Автокоррекция • в т.ч. с фасетами • “more like this”
  • 10.
    Фасеты Динамический набор категорий Активный фильтры Число найденных документов по запросу и фильтру
  • 11.
    Кластеризация Кластеры создаются наоснове текста документов
  • 12.
    Автокоррекция n-gram индекс Нечёткий поиск • Отдельный индекс для • Работает по основному коррекции индексу • Levinstein automata - Lucene
  • 13.
    Подсказки Похоже на автокоррекцию.Запрос “дописывается” на основе словаря по индексу и дополняется ключевыми словами на основе статистики.
  • 14.
    Пространственный поиск • Поддержкаgeodist – Lucene, Sphinx – зачёт • Индекс по декартовой сетке - Solr
  • 15.
    Что индексировать? Файлы?  ApacheTika – извлечение метаданных из файлов определения типа контента определение языка определение кодовой страницы 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 Самые молодые сегменты можно не спешить писать на диск
  • 19.
    Масштабирование Производительность • Упирается вCPU • Сложные запросы могут быть очень CPU-ёмкими Решение – несколько реплик индекса • read-only файлы облегчают задачу
  • 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 Indextank появился как поисковый SaaS. После покупки компании, код продукта был опубликован как open source. • Фокус: социальный контент и crowd sourcing • Ранжирование по динамическим атрибутам (голоса, рейтинг и т.п.) • Управление поисковым “облаком”
  • 26.
    Спасибо Алексей Рагозин alexey.ragozin@gmail.com