• Save
Индексируй неиндексирумое
Upcoming SlideShare
Loading in...5
×
 

Индексируй неиндексирумое

on

  • 1,300 views

По материалам конференции .NET разработчиков - www.dotnetconf.ru

По материалам конференции .NET разработчиков - www.dotnetconf.ru

Statistics

Views

Total Views
1,300
Views on SlideShare
1,136
Embed Views
164

Actions

Likes
1
Downloads
0
Comments
0

4 Embeds 164

http://dotnetconf.ru 129
http://www.dotnetconf.ru 25
https://twitter.com 6
http://localhost 4

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Индексируй неиндексирумое Индексируй неиндексирумое Presentation Transcript

  • Индексируй неиндексирумое Рахматиллаев Тимур ByndyuSoft twitter.com/eskat0n 6-я конференция .NET разработчиков 28 апреля 2013 www.dotnetconf.ru
  • 2Индексируй неиндексируемое Разминка 1. Скачать материалы по ссылке: http://bit.ly/dotnetconf6-sphinx 2. Проверить наличие установленной Visual Studio 2010+ 3. Установить ReSharper 7.х (настоятельно рекомендуется, но не обязательно)
  • 3Индексируй неиндексируемое Ожидания от мастер-класса
  • 4Индексируй неиндексируемое Немного философии
  • 5Индексируй неиндексируемое В начале была проблема Организовать быстрый и лексический многокритериальный поиск среди данных, хранящихся в СУБД (в общем случае – любом произвольном хранилище)
  • 6Индексируй неиндексируемое Но зачем, ведь есть… Стандартные средства поиска • Для реляционных СУБД • SQL-запросы с WHERE-условиями, операторы LIKE, IN и BETWEEN • Полнотекстовые движки, встроенные в СУБД – MySQL Fulltext – PostgreSQL Textsearch – MS SQL Fulltext Filter Daemon • Для NoSQL СУБД • Собственные механизмы поиска на основе языка запросов и (как правило) встроенного индексирующего движка
  • 7Индексируй неиндексируемое Недостатки «родных» решений на основе хранилища данных 1. Зависимость логики работы поиска от контейнера хранения данных 2. Низкая функциональность с точки зрения поддержки сложных условий в поисковом запросе 3. Низкая скорость работы 4. Слабое лексическое обеспечение
  • 8Индексируй неиндексируемое «Родные» решения 1. Просты и быстры в освоении 2. Идеальны для систем с низкими требования ко времени отклика при поиске 3. Хороши для систем с малым объемом данных 4. Не усложняют инфраструктуру и не увеличивают сложность поддержки системы (см. п.2 и п.3)
  • 9Индексируй неиндексируемое Все хорошо, пока у вас…
  • 10Индексируй неиндексируемое Используйте то, что проще
  • 11Индексируй неиндексируемое Но что, если… Иголка
  • 12Индексируй неиндексируемое <картинка_для_шутки_юмора>
  • 13Индексируй неиндексируемое Сложные формы поиска
  • 14Индексируй неиндексируемое Много данных
  • 15Индексируй неиндексируемое Требуется быстрый поиск
  • 16Индексируй неиндексируемое Механизмы полнотекстового поиска • Движки («чистые») • Xapian • CLucene • Интегрированные • MySQL Fulltext • PostgreSQL Textsearch • MS SQL Fulltext Filter Daemon • Сервера • Sphinx • Apache Solr (Lucene)
  • 17Индексируй неиндексируемое Механизмы полнотекстового поиска • Движки («чистые») • Xapian • CLucene • Интегрированные • MySQL Fulltext • PostgreSQL Textsearch • MS SQL Fulltext Filter Daemon • Сервера • Sphinx • Apache Solr (Lucene)
  • 18Индексируй неиндексируемое Механизмы полнотекстового поиска • Движки («чистые») • Xapian • CLucene • Интегрированные • MySQL Fulltext • PostgreSQL Textsearch • MS SQL Fulltext Filter Daemon • Сервера • Sphinx • Apache Solr (Lucene)
  • 19Индексируй неиндексируемое «Чистые» движки поиска 1. Библиотеки с программными биндингами под различные языки (C++, Java, C#...) 2. Высокие возможности для конфигурирования 3. Присутствуют интересные функциональные особенности 4. Удобны для использования в desktop- приложениях
  • 20Индексируй неиндексируемое Механизмы полнотекстового поиска • Движки («чистые») • Xapian • CLucene • Интегрированные • MySQL Fulltext • PostgreSQL Textsearch • MS SQL Fulltext Filter Daemon • Сервера • Sphinx • Apache Solr (Lucene)
  • 21Индексируй неиндексируемое Достоинства 1. Привычная архитектура клиент-сервер 2. Удобство развертывания и интеграции 3. Простота взаимодействия 4. Возможность линейного количественного повышения производительности
  • 22Индексируй неиндексируемое Принцип работы сервера полнотекстового поиска Сеть Движок поиска Веб-сервер Индекс документов • HTTP (JSON, XML) • Проприетарный протокол • Мимикрия под SQL СУБД (набор файлов)
  • 23Индексируй неиндексируемое Apache Solr • Движок поиска – Lucene • Интерфейс к движку выполнен в виде Java-сервлета, запускаемого в контейнере Apache Tomcat • Взаимодействие через XML/JSON/CSV- протокол • Встроенные средства графического администрирования • Огромная расширяемость
  • 24Индексируй неиндексируемое Sphinx • Собственный движок поиска • Выполнен в виде консольного приложения и умеет возможность установки в виде Windows-сервиса или демона • Взаимодействие по собственному протоколу или по протоколу MySQL/PostgreSQL
  • 25Индексируй неиндексируемое Принцип работы сервера полнотекстового поиска Сеть Движок поиска Веб-сервер Индекс документов
  • 26Индексируй неиндексируемое Индекс документов • Структура данных, обеспечивающая поиск по набору записей по заданным критериям • Единичная запись в индексе – документ • Документ имеет уникальный идентификатор • Основная задача поиска в индексе – получение набора идентификаторов найденных документов
  • 27Индексируй неиндексируемое Типы индексов • Инвертированный • Каждому слову из множества слов, являющихся объединением множеств слов каждого документа сопоставляется набор документов, в которых оно встречается • Прямой • Каждому документу сопоставляется набор слов, которые он содержит
  • 28Индексируй неиндексируемое Типы индексов • Инвертированный • Каждому слову из множества слов, являющихся объединением множеств слов каждого документа сопоставляется набор документов, в которых оно встречается • Прямой • Каждому документу сопоставляется набор слов, которые он содержит
  • 29Индексируй неиндексируемое Инвертированный индекс Слово1 Слово2 Слово3 Слово4 Документ1 Документ2 Документ3 Документ2 Документ3 Документ1 Документ1 Документ3
  • 30Индексируй неиндексируемое Инвертированный индекс Слово1 Слово2 Слово3 Слово4 Документ1 Документ2 Документ3 Документ2 Документ3 Документ1 Документ1 Документ3
  • 31Индексируй неиндексируемое Инвертированный индекс Слово1 Слово2 Слово3 Слово4 Документ1 Документ2 Документ3 Документ2 Документ3 Документ1 Документ1 Документ3
  • 32Индексируй неиндексируемое Инвертированный индекс Слово1 Слово2 Слово3 Слово4 Документ1 Документ2 Документ3 Документ2 Документ3 Документ1 Документ1 Документ3
  • 33Индексируй неиндексируемое Стемминг • Процесс получения инфинитива слова по его производной форме • Утилита (библиотека) производящая стемминг называется «стеммер» • Индексируются начальные формы слов • Возможна индексация точных форм слов (без стемминга, крайне увеличивает размер индекса)
  • 34Индексируй неиндексируемое Типы индексов • Префиксный • Позволяет искать слова, начинающиеся на заданное • чело* -> человек • Инфиксный • Позволяет искать слова, оканчивающиеся на заданное • *век -> человек
  • 35Индексируй неиндексируемое Типы индексов • Префиксный • Позволяет искать слова, начинающиеся на заданное • Инфиксный • Позволяет искать слова, оканчивающиеся на заданное
  • 36Индексируй неиндексируемое Логическая структура индекса Идентификатор документа Поля Атрибуты 1 Поля документа 1 Атрибуты документа 1 2 Поля документа 2 Атрибуты документа 2 3 Поля документа 3 Атрибуты документа 3 … … …
  • 37Индексируй неиндексируемое Поля в документе • Не хранят данных • Предназначены для организации поиска по текстовым/числовым данным
  • 38Индексируй неиндексируемое Атрибуты документа • Предназначены для хранения данных и поиска по ним • Как правило, поддерживают числовые и строковые типы данных • Представляют собой любые данные, ассоциированные с документов
  • 39Индексируй неиндексируемое Multi-valued attributes • Атрибуты, которые представляют собой неупорядочные наборы однотипных значений, ассоциированные с документов • Крайне удобны для индексирования реляционной структуры данных
  • 40Индексируй неиндексируемое Техническая структура индекса • B-деревья • B+-деревья • GIN (General INverted INdex)
  • 41Индексируй неиндексируемое Построение индекса • Процесс построения индекса – индексация • Индексация подразумевает полную перестройку индекса «с нуля» • Как правило индексация выполняется отдельной утилитой, входящей в комплект поставки поискового движка
  • 42Индексируй неиндексируемое Построение индекса 1. Получение единичной записи о документе из внешнего хранилища 2. Получение данных для его полей 3. Получение данных для его атрибутов 4. Запись документа в индекс 5. … 6. PROFIT
  • 43Индексируй неиндексируемое Когда индексировать?
  • 44Индексируй неиндексируемое Когда индексировать? • Когда во внешнем хранилище были изменены проиндексированные документы • Когда из внешнего хранилища были удалены проиндексированные документы • Когда во внешнее хранилище были добавлены документы
  • 45Индексируй неиндексируемое Дельта-индексирование • Процесс индексирования, целью которого является минимизация: • Времени «реагирования» индекса на изменения во внешнем хранилище • Нагрузки на внешнее хранилище по получению из него данных для последующей индексации • Заключается в индексации только добавленных/измененных документов и исключении из индекса удаленных документов
  • 46Индексируй неиндексируемое Дельта-индексирование • Дельта – набор добавленны/измененных/удаленных документов • Критерии формирования дельты • Timestamp’ы • Идентификаторы • Очереди сообщений • …
  • 47Индексируй неиндексируемое Индексы реального времени • Индекс, в который доступна запись документов в произвольный момент времени
  • 48Индексируй неиндексируемое Что включать в индекс?
  • 49Индексируй неиндексируемое Что включать в индекс? • Структуру индекса определяет поисковый запрос, для которого он предназначен • Грубо говоря, в терминах веб- приложения индекс должен содержать набор и полей и атрибутов, сопоставляемый поисковой форме
  • 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Индексируй неиндексируемое Особенности Sphinx 1. Высокая скорость индексации 2. Высокая скорость поиска 3. Высокая масштабируемость 4. Распределенная возможность поиска 5. Поддержка нескольких полей полнотекстового поиска в документе 6. Поддержка нескольких дополнительных атрибутов для каждого документа 7. Поддержка стоп-слов 8. Поддержка однобайтовых кодировок и UTF-8 9. Поддержка морфологического поиска 10. Родная поддержка MySQL, PostgreSQL и поддержка ODBC совместимых баз данных
  • 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Индексируй неиндексируемое Конфигурирование Sphinx • Основной конфигурационный файл – sphinx.conf • Параметры командной строки при запуске sphinxd.exe • Список словоформ замены – wordforms.txt • Является прямым указанием стеммеру • Применяется на этапе индексации (sic!)
  • 54Индексируй неиндексируемое Типы атрибутов Sphinx • Целые числа (от 1 до 32 бит) • UNIX timestamps • Числа с плавающей точкой (32 бита) • Строки • MVA (списки произвольной длины, содержащие целые числа длиной в 32 бита)
  • 55Индексируй неиндексируемое Операции над индексами • Ротация • Объединение • Объединение с использованием killlist
  • 56Индексируй неиндексируемое Мы начинаем КВН мастер-класс… «Хватит трепаться, покажите мне код» Линус Торвальдс
  • 57Индексируй неиндексируемое Дальнейшее изучение Introduction to Search with Sphinx http://sphinxsearch.com/docs/ Официальная документация: Andrew Aksyonoff
  • 58Индексируй неиндексируемое Спасибо за внимание Рахматиллаев Тимур ByndyuSoft mail@eskat0n.ru twitter.com/eskat0n