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

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

Transcript of Как, используя Lucene, построить высоконагруженную...

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

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

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

2

Одноклассники в цифрах• Что у нас есть:

– 100 млн пользователей;– 3.3 млн групп;– .....

• 4.1 млн пользователей онлайн;• В секунду:

– 250. тыс. страниц, 50мс, 70Гбит/с;– 6 тыс. сообщений и комментариев;– 1.5 тыс. поисковых запросов.

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

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

• Пользователь не всегда знает, как именно регистрировался искомый друг

• На сайте были огромные каталоги групп и сообществ

• Планировались новые сервисы, которым понадобится поиск

• Как правило, человек ищет то, что уже есть у кого-то из его друзей

3

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

4

Почему Lucene?

• Поиск по MS SQL базе был крайне медленным• На Java написано 99% нашего кода, поэтому

Sphinx даже не смотрели• Apachе Lucene/Solr поддерживаются большим

сообществом и хорошо себя зарекомендовали• Уже был опыт использования Solr• Быстрый поиск других поисковых

Java-проектов результатов не дал

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

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

5

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

Term DocId

blue 1,2

bright 1,2

butterfly 1

breeze 1

hangs 1

need 2

search 2

sky 2

Term DocId

best 1

forget 1

great 1

retire 1

sky 1

wind 1

DocId Values

1 333, Author A

2 777, Author C

DocId Values

1 555, Author C

Toke

nize

rs &

Filt

ers &

Inde

xWrit

er

Inde

x Re

ader

& S

earc

her &

Que

ry p

arse

r

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

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

6

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

серверов• Гибкое индексирование• Возможность сбора дополнительной

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

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

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

7

• Solr:– сервер использует только один процессор– репликация индексов на bash-скриптах– http - это дорого и медленно– сложно модифицировать

• Но Lucene нас устраивает, поэтому пишем свой сервер

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

Архитектура

8

Presentation

Search processing system

Even

t

Indexer + DB

Que

ry

Resu

lt

Resu

lt

Read

Read

Upd

ate/

Noti

fy

Index Replication

Que

ry

Resu

lts

Services

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

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

9

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

функциональности• Сбор статистики по пользователям• Высокая пропускная способность

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

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

10

Get session for Schema

Execute queries

Reduce results

Schedule queries

Load results

waitAll ()waitFor (queries complete)waitAtLeast (result items)

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

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

11

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

– Диск с FSDirectory и NIODirectory– RamDrive с FSDirectory и NIODirectory– Lucene RamDirectory – Собственный UnsafeDirectory

• Победил:– HeapDirectоry файлы как byte[] в хипе

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

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

12

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

– Lucene использует ThreadLocal кэши для некоторых объектов

– Jboss Remoting на каждое соединение содает поток, а их тысячи

• Первое решение:– Пул для выполнения запросов

• Второе решение:– Делая другую оптимизацию, убрали эти кэши

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

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

13

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

– При считывании хранимого поля создается много мусора и производятся ненужные операции

• Решение:– Считывать значение в нужный тип сразу из byte[]

• Результат:– На порядок быстрее стали операции с хранимыми

полями– Время GC упало в 2 раза

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

14

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

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

возростов • Друга можно искать, вводя известные данные:

«илья широков 30»«илья широков москва»«илья широков 25-30 россия»

TermCollector

UserIndex

TermDict.

Search System

Query Line

Fields Query

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

15

Поиск по возрасту• Стандартные решения:

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

терминов в запросе– Запрос к FieldCache– Фильтр результатов

• Наше решение:– Возраст хранится ввиде даты: yyyymmdd– Запрос по текстовым полям оборачивается в

фильтрующий запрос, который проверяет отбраные документы по хранимому полю

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

16

Поиск музыки

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

• Три точности совпадения:точное; все слова из запроса; некоторые слова из запроса

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

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

17

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

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

– в id зашит его тип (артист; альбом; композиция; файл)– тип как отдельное поле– рейтинг как параметр индексации– рейтинг как хранимое поле

• Текстовые поля:– по отдельности– необходимые комбинации– 2 представления текста: оригинал + фонетика

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

18

Поиск музыки

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

• Решение:– Запрос состоит из комбинаций: точность + поле данных– Для каждой комбинации есть интервал значений весов– Вес из подзапроса нормализуется в интервал

комбинации– Если документ отвечает запросу, сразу вычисляем его

тип и добавляем в соответствующий коллектор

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

19

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

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

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

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

Музыка

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

Видео

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

Спасибо!

Алексей Шевчукodnoklassniki.ru/aleksey.shevchukРазработчик поисковых системОдноклассники

[email protected]