Как, используя Lucene, построить высоконагруженную систему поиска разнородных данных

Содержание

Слайд 2

Одноклассники в цифрах Что у нас есть: 100 млн пользователей; 3.3

Одноклассники в цифрах

Что у нас есть:
100 млн пользователей;
3.3 млн групп;
.....
4.1 млн

пользователей онлайн;
В секунду:
250. тыс. страниц, 50мс, 70Гбит/с;
6 тыс. сообщений и комментариев;
1.5 тыс. поисковых запросов.
Слайд 3

Зачем нам понадобились свои поисковые системы? Пользователь не всегда знает, как

Зачем нам понадобились свои поисковые системы?

Пользователь не всегда знает, как именно

регистрировался искомый друг
На сайте были огромные каталоги групп и сообществ
Планировались новые сервисы, которым понадобится поиск
Как правило, человек ищет то, что уже есть у кого-то из его друзей
Слайд 4

Почему Lucene? Поиск по MS SQL базе был крайне медленным На

Почему Lucene?

Поиск по MS SQL базе был крайне медленным
На Java написано

99% нашего кода, поэтому Sphinx даже не смотрели
Apachе Lucene/Solr поддерживаются большим сообществом и хорошо себя зарекомендовали
Уже был опыт использования Solr
Быстрый поиск других поисковых Java-проектов результатов не дал
Слайд 5

Как устроен Lucene? The bright blue butterfly hangs on the breeze

Как устроен Lucene?

The bright blue butterfly hangs on the breeze

It’s

best to forget the great sky and to retire from every wind

Under blue sky, in bright sunlight, one need not search around

Tokenizers & Filters & IndexWriter

Index Reader & Searcher & Query parser

Слайд 6

Требования к системе индексов Отказоустойчивость и масштабируемость Высокая производительность поисковых серверов

Требования к системе индексов

Отказоустойчивость и масштабируемость
Высокая производительность поисковых серверов
Гибкое индексирование
Возможность сбора

дополнительной информации перед индексацией
Возможность анализа готового индекса
Слайд 7

Что нас не устроило в Solr Solr: сервер использует только один

Что нас не устроило в Solr

Solr:
сервер использует только один процессор
репликация индексов

на bash-скриптах
http - это дорого и медленно
сложно модифицировать
Но Lucene нас устраивает, поэтому пишем свой сервер
Слайд 8

Архитектура Presentation Search processing system Event Indexer + DB Query Result

Архитектура

Presentation

Search processing system

Event

Indexer + DB

Query

Result

Result

Read

Read

Update/Notify

Index

Replication

Query

Results

Services

Слайд 9

Требования к поисковой системе Отказоустойчивость Использование социального графа Эффективность Простое изменение

Требования к поисковой системе

Отказоустойчивость
Использование социального графа
Эффективность
Простое изменение и расширение функциональности
Сбор статистики

по пользователям
Высокая пропускная способность
Слайд 10

Как работает поисковая система Get session for Schema Execute queries Reduce

Как работает поисковая система

Get session for Schema

Execute queries

Reduce results

Schedule queries

Load results

waitAll

()
waitFor (queries complete)
waitAtLeast (result items)
Слайд 11

Проблемы: работа с индексом Lucene активно читает файлы во время поиска

Проблемы: работа с индексом

Lucene активно читает файлы во время поиска
Пробовали:
Диск с

FSDirectory и NIODirectory
RamDrive с FSDirectory и NIODirectory
Lucene RamDirectory
Собственный UnsafeDirectory
Победил:
HeapDirectоry файлы как byte[] в хипе
Слайд 12

Проблемы: ThreadLocal кэши Долгий GC из-за уймы мелких объектов в хипе

Проблемы: ThreadLocal кэши

Долгий GC из-за уймы мелких объектов в хипе
Причины:
Lucene использует

ThreadLocal кэши для некоторых объектов
Jboss Remoting на каждое соединение содает поток, а их тысячи
Первое решение:
Пул для выполнения запросов
Второе решение:
Делая другую оптимизацию, убрали эти кэши
Слайд 13

Проблемы: медленные хранимые поля Медленная работа с хранимыми полями Причина: При

Проблемы: медленные хранимые поля

Медленная работа с хранимыми полями
Причина:
При считывании хранимого поля

создается много мусора и производятся ненужные операции
Решение:
Считывать значение в нужный тип сразу из byte[]
Результат:
На порядок быстрее стали операции с хранимыми полями
Время GC упало в 2 раза
Слайд 14

Распознавание полей Поиск пользователей идет по следующим полям: имя и фамилия,

Распознавание полей

Поиск пользователей идет по следующим полям:
имя и фамилия, город, страна,

интервал возростов
Друга можно искать, вводя известные данные: «илья широков 30» «илья широков москва» «илья широков 25-30 россия»

Term
Collector

User
Index

Term
Dict.

Search System

Query Line

Fields Query

Слайд 15

Поиск по возрасту Стандартные решения: Добавление всех подходящих терминов Префиксные термины

Поиск по возрасту

Стандартные решения:
Добавление всех подходящих терминов
Префиксные термины для снижения количества

терминов в запросе
Запрос к FieldCache
Фильтр результатов
Наше решение:
Возраст хранится ввиде даты: yyyymmdd
Запрос по текстовым полям оборачивается в фильтрующий запрос, который проверяет отбраные документы по хранимому полю
Слайд 16

Поиск музыки В базе есть: артисты; альбомы; композиции не сортированые музыкальные

Поиск музыки

В базе есть:
артисты; альбомы; композиции
не сортированые музыкальные композиции
Три точности совпадения:
точное;

все слова из запроса; некоторые слова из запроса
Поиск всегда идет по всем видам документов
От точности совпадения зависит поведение UI
На место в выдаче влияет рейтинг документа
С индекса собираются всевозможные топы
Слайд 17

Индексация музыки Все храним в одном индексе У каждого документа: в

Индексация музыки

Все храним в одном индексе
У каждого документа:
в id зашит его

тип (артист; альбом; композиция; файл)
тип как отдельное поле
рейтинг как параметр индексации
рейтинг как хранимое поле
Текстовые поля:
по отдельности
необходимые комбинации
2 представления текста: оригинал + фонетика
Слайд 18

Поиск музыки Пробовали: Отдельный запросы для каждого типа Повторные запросы с

Поиск музыки

Пробовали:
Отдельный запросы для каждого типа
Повторные запросы с меньшей точностью
Настройка оценщика

веса для результата
Решение:
Запрос состоит из комбинаций: точность + поле данных
Для каждой комбинации есть интервал значений весов
Вес из подзапроса нормализуется в интервал комбинации
Если документ отвечает запросу, сразу вычисляем его тип и добавляем в соответствующий коллектор
Слайд 19

Поисковые сервера 8 серверов 7 000 МБ 20 мс 1100 з/c

Поисковые сервера

8 серверов
7 000 МБ
20 мс
1100 з/c

2 сервера
600 МБ
3 мс
2200 з/c

6

серверов
400 МБ
7 мс
30 з/c

4 сервера
2700 МБ
50 мс
200 з/c

5 серверов
10 000 МБ
90 мс
1500 з/c

Поисковая
система

Пользователи

Музыка

Группы
Сообщества

Видео