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

2,309 views
2,184 views

Published on

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

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,309
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

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

×