IOP202 DevCon 2012 Apache Lucene in Windows Azure

Post on 04-Jul-2015

468 views 6 download

Transcript of IOP202 DevCon 2012 Apache Lucene in Windows Azure

// DevCon•12

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

в Windows Azure

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

@vadinov | ifface.com

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

AtContent.com, IFFace Inc.

#msdevcon

О сервисе

AtContent.com

AtContent - это

Платежная

система

внутри

Аналитика

и

статистика

Управление

разделением

дохода

Оплата

автору

напрямую

Новый

подход к

публикации

и

дистрибуции

Автоматиза

ция

разделения

дохода

Управление

контентом

из одного

места

Легальное

копирование

проще и

выгоднее

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

Архитектура

#msdevcon

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

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

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

#msdevcon

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

Apache Lucene

Apache Lucene - это

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

Написана на Java

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

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

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

Apache Lucene в AtContent

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

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

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

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

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

#msdevcon

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

http://ou.gs/AzureDirectory

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

Azure

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

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

Lucene.NET for 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();

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

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);

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

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

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

изменения

Lease Extensions

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

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

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

запись в блоб

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#msdevcon

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

CPlase Engine

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

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

для работы с Table

Storage, Blob Storage и

Queue

//было

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

Утилиты для Blob

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

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

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

блобы

//было

try

{

var BlobClient = Azure.GetBlobClient();

var BlobRef = BlobClient.GetBlobReference(BlobUrl);

BlobRef.UploadText(Content);

}

catch { }

//стало

CPlase.BlobUtils.SaveBlob(BlobUrl, Content);

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

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

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

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

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

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

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

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);

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

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

управление

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

очередях

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Добавление в очередь и вызов обработчика

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

Позволяют

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

операции Or и

Contains для Table

Storage

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

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

MD5, генерация

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

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

string MD5Bits = Security.GetHashMD5Binary(

InputString, PartitionBitCount);

string MD5PartitionBits =

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

Entity.PartitionKey = MD5PartitionBits;

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

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

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

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

ролями и

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

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

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));

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

http://ou.gs/AzureDirectory

https://cplaseengine.codeplex.com

http://ou.gs/CPlaseEngineAbout

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

ASP.NET for Mobile and Slate Devices

IOP201

Windows Azure and Open Source Solutions

AZR205MN

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

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

Пожалуйста

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

© 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.