Найти за одну секунду - 2
Антон Фирсов
Knoema
Что такое Нома?
 Knoema.com – это веб-сайт, где можно найти
открытые данные на любую тему для
любой страны мира из кучи разных
источников
 У нас собран самый большой репозиторий
статистических данных в мире и контента,
сделанного на их основе
2
Несколько метрик
 Количество наборов данных – 3500+
 Количество временных рядов – 250M+
 Размер базы – 130Gb+
 И все это растет десятками процентов в
месяц
3
Проблема
Навигация, рубрикатор, теги, темы – это все
замечательно, но ведь никто сейчас не
пользуется каталогами, а идут сразу на Google
и Yandex. Не так ли?
Нам нужен поиск!
4
Демо
5
Демо
6
Причины реализации собственного движка
 Специфические данные:
структурированные, мало текста и много
цифр.
 Необходимость собственного, сильно
специфического алгоритма ранжирования
– Алгоритм ранжирования в поиске – это одно из
наших ключевых ноу-хау
 Специальные возможности
 Работа на ограниченных ресурсах железа
 Эффективное использование ресурсов
7
Хранение данных
Mexico – Oranges – Production Quantity
Mexico – Oranges – Area Harvested
Mexico – Oranges – Yield
Mexico – Apples – Production Quantity
Mexico – Apples – Area Harvested
Mexico – Apples – Yield
Portugal – Oranges – Production Quantity
…
Egypt – Oranges – Production Quantity
…
8
Страна С/X культуры Показатель
Egypt Apples Yield
Mexico Bananas Area harvested
Portugal Oranges Production quantity
United States of America Olives
Potatoes
Категория Категория
Терм
Ряд
Демо
9
Ключевые требования
 СКОРОСТЬ, СКОРОСТЬ, СКОРОСТЬ
 Учет различных словоформ
 Исправление ошибок, возникающих при
наборе
 Эффективное использование ресурсов
10
Архитектура
11
Сервер
приложений
База данных
Данные
Запрос Ответ
Поисковый
сервер
Индекс
Снимок
состояния
Сервер
приложений
Этапы выполнения поискового запроса
 Разбивка на слова
 Коррекция ошибок
 Учет различных словоформ
 Учет синонимов
 Ранжирование результатов
12
Коррекция ошибок. Расстояние Левенштейна
Пример
13
В С С В С С
N O M A
K N O E M A
З З З З
Х Л Е Б
П И В О
Решение «в лоб»: перебрать все слова, имеющиеся в
БД, выбрать то, рассояние от которого до слова из
запроса минимально.
Ассимптотическая сложность: k * n * m
k – количество слов в словаре
n – средняя длинна слова в словаре
m – длинна слова из запроса
C С С У С С
П Е Р Ь M Ь
П Е Р M Ь
Коррекция ошибок. Оптимизация
14
П
Й
Я
К Р А Й
ОГ
ИЬ К
.
ОС
М
Р
Е
УМ
. : 1.0
ПЕРНЬ
Коррекция ошибок. Оптимизация
15
П
Й
Я
К Р А Й
ОГ
ИЬ К
.
ОС
М
Р
Е
УМ
П : 1.0
ПЕРНЬ
К : 0.8
ПЕРНЬ
Коррекция ошибок. Оптимизация
16
П
Й
Я
К Р А Й
ОГ
ИЬ К
.
ОС
М
Р
Е
УМ
ПЕ : 1.0
ПЕРНЬ
К : 0.8
ПЕРНЬ
Коррекция ошибок. Оптимизация
17
П
Й
Я
К Р А Й
ОГ
ИЬ К
.
ОС
М
Р
Е
УМ
ПЕР : 1.0
ПЕРНЬ
К : 0.8
ПЕРНЬ
Коррекция ошибок. Оптимизация
18
П
Й
Я
К Р А Й
ОГ
ИЬ К
.
ОС
М
Р
Е
УМ
ПЕРМ : 0.8
ПЕРНЬ
К : 0.8
ПЕРНЬ
Коррекция ошибок. Оптимизация
19
П
Й
Я
К Р А Й
ОГ
ИЬ К
.
ОС
М
Р
Е
УМ
ПЕРМ : 0.8
ПЕРНЬ
КР : 0.6
ПЕРНЬ
Коррекция ошибок. Оптимизация
20
П
Й
Я
К Р А Й
ОГ
ИЬ К
.
ОС
М
Р
Е
УМ
ПЕРМЬ : 0.8
ПЕРНЬ
КР : 0.6
ПЕРНЬ
Учет различных словоформ
 Использование готового стеммера
 Считать все слова с достаточно длинным
совпадающим префиксом словоформами
одного и того же слова
 Словоформы – как частный случай ошибок
в написании слов
 Аналогично п.3, но меньше снижать
релевантность, если основа слова и
окончание используются в других словах
21
Учет различных словоформ
 Пермский край
 Пермского края
 Пермскому краю
 Пермском крае
 .....
 Алтайский край
 Алтайского края
 Алтайскому краю
 Алтайском крае
 .....
 Валовой внутренний продукт
 Валового внутреннего продукта
 Валовому внутреннему продукту
 Валовом внутреннем продукте
22
Префикс Кол. Окончание Кол. Вес
П 8 ЕРМСКИЙ 1 8
ПЕ 4 РМСКИЙ 1 4
ПЕР 4 МСКИЙ 1 4
ПЕРМ 4 СКИЙ 2 8
ПЕРМС 4 КИЙ 2 8
ПЕРМСК 4 ИЙ 3 12
ПЕРМСКИ 1 Й 5 5
Получение результатов
23
Mexico
Egypt
States
United
Mexico
Egypt
United
States
United
States
of
America
USA
Слова Термы
Harvested
Area
Oranges
Area
harvested
Oranges
Mexico – Oranges – Area harvested
USA – Oranges – Area harvested
Результаты
United States of America
United States - GDP
Как эффективно использовать память в .net
Проблемы:
 Минимизировать потребляемую память
 Минимизировать время, затрачиваемое на
сборку мусора
Решение:
 Использовать массивы из структур вместо
коллекций из классов
 Объединять массивы с малым количеством
элементов в большие массивы
24
Как эффективно использовать память в .net
25
8 байт
syncblock
8 байт
Тип
8 байт
Размер
массива
8 байт
Ссылка на
элемент
массива
8 байт
Ссылка на
элемент
массива
8 байт
Ссылка на
элемент
массива
8 байт
Ссылка на
элемент
массива
8 байт
syncblock
8 байт
Тип
Данные
8 байт
syncblock
8 байт
Тип
элементов
8 байт
Размер
массива
Элемент данных Элемент данных
Массив из структур
Массив объектов класса
Результаты
 Реализован относительно быстрый поиск
(~1-2 сек.) на слабом оборудовании,
потребляющий 13Гб памяти и
позволяющий исправлять ошибки в
написании слов и учитывать различные
словоформы в разных языках.
 Архитектура поиска выстроена для
дальнейшего горизонтального
масштабирования
26
Спасибо за внимание!
Вопросики?
http://knoema.com
27

А. Фирсов "Найти за одну секунду - 2", DUMP-2014