пятница, 7 ноября 2014 г.

Как устроен поиск писем в яндексе

Как искать и находить нужные письма в Яндекс.Почте







Яндекс в своем блоге поведал аудитории о том, как устроен поиск по письмам в Яндекс.Почте. Оказывается, в индексе Яндекс.Почты хранится около 10 млрд. писем – это почти столько же, сколько страниц в индексе веб-поиска Яндекса. При этом поисковых запросов примерно в 1000 раз меньше, чем запросов к веб-поиску.

Отличительной особенностью поиска в Почте является то, что здесь очень важна полнота результатов: если веб-поиск не найдёт один-единственный сайт из трёх миллионов по запросу «пластиковые стулья», этого никто (кроме, разумеется, вебмастера этого сайта) не заметит. Гораздо критичнее, если потеряется письмо с важным адресом или паролем.


По этим причинам в поиске по Почте существует ряд архитектурных и технологических особенностей.


Архитектурные особенности: чтобы обеспечить полноту результатов, весь поисковый индекс для некоторого пользователя хранится на одном сервере и полностью дублируется на другом – если один сервер недоступен, то Яндекс ищет на дублирующем.


Технологические особенности: на каждом сервере располагается индекс по письмам пяти миллионов пользователей. Яндекс отмечает, что есть несколько вариантов построения индекса и рассказывает, как это реализовано.


1-й вариант решения: Индекс размером до 10 Гб

Максимальный размер каждого индекса 10 Гб. Следовательно, на каждом сервере получилось по 50-100 индексов, которые создаются в порядке поступления писем, а данные пользователя, таким образом, могут находиться в любом из индексов. Но письма часто содержат большое количество однотипной информации («привет», «пока», «@yandex.ru»), которая подходит под 46% всех запросов к поиску по Почте. Получалось, что ответ на такой запрос требовал поднять около 20% всех писем, хранящихся на сервере — это занимало десятки секунд.


2-й вариант решения: Префиксный индекс

Мы оставили максимальный размер индекса равным 10Гб, но перед каждым словом добавили ID пользователя. В результате каждый поиск сразу ограничивался количеством и размером писем в почтовом ящике текущего пользователя. Это снизило объем находимых данных и на порядок ускорило поиск. Но когда на диске – сотни индексов, то из-за большого числа дисковых операций поиск занимает несколько секунд. Наша же цель – десятые доли секунд.


3-й вариант решения: Шардирование по пользователям

Все индексы на сервере были разделены на 1000 сегментов (шардов). В каждом из них – от пяти до двадцати индексов размером до 1 Гб, и данные конкретного пользователя всегда находятся в определённом сегменте. В результате число дисковых операций было снижено до 20 раз по сравнению со вторым вариантом. Скорость поиска также увеличилась в разы. Так мы получили поиск за доли секунд.


Также отмечается, что для того чтобы все поступающие письма практически сразу появлялись в результатах поиска, был разработан специальный инкрементальный индекс в памяти. В него можно добавлять по одному документу, а после добавления документ сразу появляется в поиске.

источник: http://clubs.ya.ru

Совет в фотографмях с сети


Как устроен поиск писем в яндексе
Как устроен поиск писем в яндексе
Как устроен поиск писем в яндексе
Как устроен поиск писем в яндексе