36
// DevCon•12 Интеграция Apache Lucene в Windows Azure ВАДИМ НОВИЦКИЙ @vadinov | ifface.com Вице-президент по разработке в проекте AtContent.com, IFFace Inc.

IOP202 DevCon 2012 Apache Lucene in Windows Azure

Embed Size (px)

Citation preview

Page 1: IOP202 DevCon 2012 Apache Lucene in Windows Azure

// DevCon•12

Интеграция Apache Lucene

в Windows Azure

ВАДИМ НОВИЦКИЙ

@vadinov | ifface.com

Вице-президент по разработке в проекте

AtContent.com, IFFace Inc.

Page 2: IOP202 DevCon 2012 Apache Lucene in Windows Azure

#msdevcon

О сервисе

AtContent.com

Page 3: IOP202 DevCon 2012 Apache Lucene in Windows Azure

AtContent - это

Платежная

система

внутри

Аналитика

и

статистика

Управление

разделением

дохода

Оплата

автору

напрямую

Новый

подход к

публикации

и

дистрибуции

Автоматиза

ция

разделения

дохода

Управление

контентом

из одного

места

Легальное

копирование

проще и

выгоднее

нелегального

Page 4: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Архитектура

Page 5: IOP202 DevCon 2012 Apache Lucene in Windows Azure

#msdevcon

Как же все происходит внутри?

Демонстрация решения

Демонстрация

Page 6: IOP202 DevCon 2012 Apache Lucene in Windows Azure

#msdevcon

Полнотекстовый поиск в Windows Azure

Apache Lucene

Page 7: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Apache Lucene - это

Библиотека для полнотекстового поискаВысокопроизводительная

Написана на Java

С открытым исходным кодом

Кроссплатформенная

Портирована на многие языки программирования, включая C#

Page 8: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Apache Lucene в AtContent

Индексирование публикаций

Индексирование профилей

пользователей

Поиск по публикациям и профилям

пользователей

Page 9: IOP202 DevCon 2012 Apache Lucene in Windows Azure

#msdevcon

Доступна по ссылке:

http://ou.gs/AzureDirectory

Библиотека Lucene.NET for

Azure

Page 10: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Детали реализации

Хранение индексовApache Lucene — файлы

Lucene.NET for Azure — блобы

Структура данныхЭлемент индекса — документ

Элемент документа — поле

Page 11: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Добавление в индекс

SearchTicket Ticket = Item.GetSearchTicket();

DeleteDocument(Ticket.Id);

string Language = DefinitionLanguage(Ticket.Language);

Analyzer Analyzer = new SnowballAnalyzer(Language);

var Writer = new IndexWriter(Directory, Analyzer);

AddDocument(Writer, Ticket);

Writer.Optimize();

Writer.Commit();

Writer.Close();

Page 12: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Добавление документа

var Doc = new Document();

Doc.Add(new Field("Id", Id, Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.NO));

Doc.Add(new Field("Type", Type, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));

Doc.Add(new Field("IndexField", IndexField, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));

Writer.AddDocument(Doc);

Page 13: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Блокировка поискового индекса

Поисковый индекс

блокируется на время

изменения

Page 14: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Lease Extensions

Используется

расширение для

блобов, блокирующее

запись в блоб

Page 15: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Особенности исключений

Некоторые исключения

вываливаются из

библиотеки наружу

Page 16: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Производительность

Синтетический тест на 1 000 000 записейЗаполнение индекса — около 250 секунд

Поиск частоупотребимого слова — 8-25 мс. (50 потоков,

478 325 совпадений)

Поиск редкоупотребимого слова — ≈0-5 мс. (50 потоков,

283 совпадения)

Конкурентный поиск не увеличивает время обработки запроса

Размер индекса — 20-30% от исходного контента

Page 17: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Сделать свой Яндекс?

Не получится Отсутствие поддержки морфологии

Терабайты индексов нужно где-то хранить

Отличия между поисковым движком и поисковой системой

Page 18: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Альтернативы

Bing API5 000 запросов в сутки бесплатно

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

Не решает проблему поиска внутри сервиса

SphinxПотребует дополнительного MySQL-сервера

Более сложная интеграция

НЕ масштабируется

Page 19: IOP202 DevCon 2012 Apache Lucene in Windows Azure

#msdevcon

Библиотека улучшений для Windows Azure

CPlase Engine

Page 20: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Фабрика контекстов

Создание контекстов

для работы с Table

Storage, Blob Storage и

Queue

Page 21: IOP202 DevCon 2012 Apache Lucene in Windows Azure

//было

var StorageAccount = RoleEnvironment.IsEmulated ?CloudStorageAccount.FromConfigurationSetting(

"EmulatedConnectionString") :

CloudStorageAccount.FromConfigurationSetting(

"ConnectionString");

var Context = new TableServiceContext(

StorageAccount.TableEndpoint.ToString(),

StorageAccount.Credentials);

//стало

var Context = CPlase.Azure.GetContext();

Фабрика контекстовСоздание контекста для Table Storage

Page 22: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Утилиты для Blob

Работа с хранилищем,

чтение папок, удаление

папок, сериализация в

блобы

Page 23: IOP202 DevCon 2012 Apache Lucene in Windows Azure

//было

try

{

var BlobClient = Azure.GetBlobClient();

var BlobRef = BlobClient.GetBlobReference(BlobUrl);

BlobRef.UploadText(Content);

}

catch { }

//стало

CPlase.BlobUtils.SaveBlob(BlobUrl, Content);

Утилиты для BlobСохранение данных в блоб

Page 24: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Работа с кешем на экземпляре

Создание кеша,

управление кешем,

синхронизация кеша

между инстанциями

Page 25: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Сохранение на экземляре//было

var Storage = RoleEnvironment.GetLocalResource(LocalResourceName);

var FinalPath = GetPath(Storage, Path);

try

{

string DirectoryPath = System.IO.Path.GetDirectoryName(FinalPath);

if (!Directory.Exists(DirectoryPath))

Directory.CreateDirectory(DirectoryPath);

File.WriteAllText(FinalPath, Content);

}

catch () {}

//стало

CPlase.InstanceStorage.Save(LocalResourceName, Path, Content);

Page 26: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Утилиты для работы с Queue

Создание очередей,

управление

сообщениями в

очередях

Page 27: IOP202 DevCon 2012 Apache Lucene in Windows Azure

public static bool AddToQueue<QueueHandlerType>(

CloudQueue Queue, string Task) {

try {

var Message = new CloudQueueMessage(Task);

Queue.AddMessage(Message);

Internal.RoleCommunicatior.

WorkerRoleCommand(typeof(QueueHandlerType));

return true;

}

catch { return false; } }

Работа с QueueДобавление в очередь и вызов обработчика

Page 28: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Расширения для LINQ

Позволяют

осуществлять

операции Or и

Contains для Table

Storage

Page 29: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Утилиты безопасности

Работа с шифрованием

MD5, генерация

последовательностей,

системы счисления

Page 30: IOP202 DevCon 2012 Apache Lucene in Windows Azure

string MD5Bits = Security.GetHashMD5Binary(

InputString, PartitionBitCount);

string MD5PartitionBits =

Convert.ToString(Convert.ToInt32(MD5Bits, 2), 16);

Entity.PartitionKey = MD5PartitionBits;

Генерация ключа разделаИспользование утилит безопасности

Page 31: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Фреймворк для сообщений

Организация обмена

сообщениями между

ролями и

экземплярами

Page 32: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Примеры сообщений

var Command = new CPlase.Internal.Commands.

ClearCacheCommand(RESOURCE_NAME, LocalUrl);

CPlase.Internal.RoleCommunicatior.WebRoleCommand(Command);

CPlase.Internal.RoleCommunicatior.

WorkerRoleEchoCommand(Command);

CPlase.Internal.RoleCommunicatior.

WorkerRoleCommand(typeof(QueueHandlerType));

Page 33: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Полезные материалы

http://ou.gs/AzureDirectory

https://cplaseengine.codeplex.com

http://ou.gs/CPlaseEngineAbout

Page 34: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Связанные сессииWEB202

ASP.NET for Mobile and Slate Devices

IOP201

Windows Azure and Open Source Solutions

AZR205MN

Запускаем корпоративные сервисы в облака - практика для

разработчика

Page 35: IOP202 DevCon 2012 Apache Lucene in Windows Azure

Пожалуйста

Оцените доклад и мастерство докладчика.Форма для оценки находится в вашем инфопакете.

Page 36: IOP202 DevCon 2012 Apache Lucene in Windows Azure

© 2012 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.

The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the

part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.