Поиск данных с помощью поиска Azure и Xamarin.Forms
Поиск Azure — это облачная служба, которая предоставляет возможности индексирования и запроса для отправленных данных. Это удаляет требования к инфраструктуре и сложности алгоритма поиска, традиционно связанные с реализацией функций поиска в приложении. В этой статье показано, как использовать библиотеку поиска Microsoft Azure для интеграции поиска Azure в Xamarin.Forms приложение.
Обзор
Данные хранятся в службе "Поиск Azure" в виде индексов и документов. Индекс — это хранилище данных, которое можно искать в Azure служба и концептуально похоже на таблицу базы данных. Документ — это одна единица данных, доступных для поиска в индексе, и концептуально похожа на строку базы данных. При отправке документов и отправке поисковых запросов в поиск Azure запросы выполняются в определенный индекс в службе поиска.
Каждый запрос, сделанный в поиск Azure, должен содержать имя службы и ключ API. Существует два типа ключа API:
- Ключи администратора предоставляют полные права для всех операций. Это включает управление службой, создание и удаление индексов и источников данных.
- Ключи запросов предоставляют доступ только для чтения к индексам и документам и должны использоваться приложениями, которые выдают поисковые запросы.
Самый распространенный запрос в службе "Поиск Azure" — выполнение запроса. Существует два типа запроса, которые можно отправить:
- Поисковый запрос ищет один или несколько элементов во всех полях, доступных для поиска , в индексе. Поисковые запросы создаются с помощью упрощенного синтаксиса или синтаксиса запросов Lucene. Дополнительные сведения см. в статье "Простой синтаксис запросов" в службе "Поиск Azure" и синтаксисе запросов Lucene в службе "Поиск Azure".
- Запрос фильтра вычисляет логическое выражение по всем фильтруемым полям в индексе. Запросы фильтров создаются с помощью подмножества языка фильтра OData. Дополнительные сведения см. в разделе "Синтаксис выражений OData" для поиска Azure.
Поисковые запросы и запросы фильтров можно использовать отдельно или вместе. При совместном использовании запрос фильтра сначала применяется ко всему индексу, а затем поисковый запрос выполняется в результатах запроса фильтра.
Поиск Azure также поддерживает получение предложений на основе входных данных поиска. Дополнительные сведения см. в разделе "Запросы предложений".
Примечание.
Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.
Настройка
Процесс интеграции службы "Поиск Azure" в Xamarin.Forms приложение выглядит следующим образом:
- Создайте служба Azure. Дополнительные сведения см. в статье "Создание azure служба с помощью портала Azure".
- Удалите Silverlight в качестве целевой платформы из Xamarin.Forms переносимой библиотеки классов решения (PCL). Это можно сделать, изменив профиль PCL на любой профиль, поддерживающий кроссплатформенную разработку, но не поддерживает Silverlight, например профиль 151 или профиль 92.
- Добавьте пакет NuGet библиотеки поиска Microsoft Azure в проект PCL в Xamarin.Forms решении.
После выполнения этих действий API библиотеки Поиск (Майкрософт) можно использовать для управления индексами поиска и источниками данных, отправкой документов и управлением и выполнением запросов.
Создание индекса поиска Azure
Схема индекса должна быть определена, которая сопоставляется со структурой данных для поиска. Это можно сделать на портале Azure или программным способом SearchServiceClient
с помощью класса. Этот класс управляет подключениями к службе "Поиск Azure" и может использоваться для создания индекса. В следующем примере кода показано, как создать экземпляр этого класса:
var searchClient =
new SearchServiceClient(Constants.SearchServiceName, new SearchCredentials(Constants.AdminApiKey));
Перегрузка SearchServiceClient
конструктора принимает имя службы поиска и SearchCredentials
объект в качестве аргументов, при SearchCredentials
этом объект упаковывает ключ администратора для Azure служба . Ключ администратора необходим для создания индекса.
Примечание.
Один SearchServiceClient
экземпляр следует использовать в приложении, чтобы избежать открытия слишком большого количества подключений к Службе поиска Azure.
Индекс определяется Index
объектом, как показано в следующем примере кода:
static void CreateSearchIndex()
{
var index = new Index()
{
Name = Constants.Index,
Fields = new[]
{
new Field("id", DataType.String) { IsKey = true, IsRetrievable = true },
new Field("name", DataType.String) { IsRetrievable = true, IsFilterable = true, IsSortable = true, IsSearchable = true },
new Field("location", DataType.String) { IsRetrievable = true, IsFilterable = true, IsSortable = true, IsSearchable = true },
new Field("details", DataType.String) { IsRetrievable = true, IsFilterable = true, IsSearchable = true },
new Field("imageUrl", DataType.String) { IsRetrievable = true }
},
Suggesters = new[]
{
new Suggester("nameSuggester", SuggesterSearchMode.AnalyzingInfixMatching, new[] { "name" })
}
};
searchClient.Indexes.Create(index);
}
Свойство Index.Name
должно иметь имя индекса, а Index.Fields
свойство должно быть задано массивом Field
объектов. Каждый Field
экземпляр задает имя, тип и любые свойства, которые указывают, как используется поле. Эти свойства включают в себя:
IsKey
— указывает, является ли поле ключом индекса. Только одно поле в индексе типа должно быть указано в качестве ключевогоDataType.String
поля.IsFacetable
— указывает, можно ли выполнять фасетную навигацию по этому полю. Значение по умолчанию —false
.IsFilterable
— указывает, можно ли использовать поле в запросах фильтра. Значение по умолчанию —false
.IsRetrievable
— указывает, можно ли получить поле в результатах поиска. Значение по умолчанию —true
.IsSearchable
— указывает, входит ли поле в полнотекстовый поиск. Значение по умолчанию —false
.IsSortable
— указывает, можно ли использовать поле вOrderBy
выражениях. Значение по умолчанию —false
.
Примечание.
Изменение индекса после его развертывания включает перестроение и перезагрузку данных.
Объект Index
может дополнительно указать Suggesters
свойство, которое определяет поля в индексе, которые будут использоваться для поддержки автоматически завершенных или поисковых запросов. Свойство Suggesters
должно быть задано в массив объектов, определяющих Suggester
поля, используемые для создания результатов предложения поиска.
После создания Index
объекта индекс создается путем вызова Indexes.Create
экземпляра SearchServiceClient
.
Примечание.
При создании индекса из приложения, которое должно быть сохранено в ответе, используйте Indexes.CreateAsync
метод.
Дополнительные сведения см. в статье "Создание индекса поиска Azure" с помощью пакета SDK для .NET.
Удаление индекса поиска Azure
Индекс можно удалить, вызвав Indexes.Delete
SearchServiceClient
экземпляр:
searchClient.Indexes.Delete(Constants.Index);
Отправка данных в индекс поиска Azure
После определения индекса данные можно передать в него с помощью одной из двух моделей:
- Модель извлечения— данные периодически приемиваются из Azure Cosmos DB, База данных SQL Azure, Хранилище BLOB-объектов Azure или SQL Server, размещенных на виртуальной машине Azure.
- Модель отправки — данные программным образом отправляются в индекс. Это модель, принятая в этой статье.
Для SearchIndexClient
импорта данных в индекс необходимо создать экземпляр. Это можно сделать, вызвав SearchServiceClient.Indexes.GetClient
метод, как показано в следующем примере кода:
static void UploadDataToSearchIndex()
{
var indexClient = searchClient.Indexes.GetClient(Constants.Index);
var monkeyList = MonkeyData.Monkeys.Select(m => new
{
id = Guid.NewGuid().ToString(),
name = m.Name,
location = m.Location,
details = m.Details,
imageUrl = m.ImageUrl
});
var batch = IndexBatch.New(monkeyList.Select(IndexAction.Upload));
try
{
indexClient.Documents.Index(batch);
}
catch (IndexBatchException ex)
{
// Sometimes when the Search service is under load, indexing will fail for some
// documents in the batch. Compensating actions like delaying and retrying should be taken.
// Here, the failed document keys are logged.
Console.WriteLine("Failed to index some documents: {0}",
string.Join(", ", ex.IndexingResults.Where(r => !r.Succeeded).Select(r => r.Key)));
}
}
Данные, импортируемые в индекс, упаковывается в виде IndexBatch
объекта, который инкапсулирует коллекцию IndexAction
объектов. Каждый IndexAction
экземпляр содержит документ и свойство, которое сообщает службе "Поиск Azure", какое действие необходимо выполнить в документе. В приведенном выше IndexAction.Upload
примере кода указывается действие, которое приводит к вставке документа в индекс, если он новый или заменен, если он уже существует. Затем IndexBatch
объект отправляется в индекс путем вызова Documents.Index
метода в объекте SearchIndexClient
. Дополнительные сведения о других действиях индексирования см. в разделе "Решить, какое действие индексирования следует использовать".
Примечание.
В один запрос индексирования можно включить только 1000 документов.
Обратите внимание, monkeyList
что в приведенном выше примере кода коллекция создается как анонимный объект из коллекции Monkey
объектов. Это создает данные для id
поля и разрешает сопоставление имен свойств регистра Monkey
Pascal с именами полей индекса поиска верблюда. Кроме того, это сопоставление можно выполнить, добавив [SerializePropertyNamesAsCamelCase]
атрибут в Monkey
класс.
Дополнительные сведения см. в статье "Отправка данных в поиск Azure" с помощью пакета SDK для .NET.
Запрос индекса поиска Azure
Для SearchIndexClient
запроса индекса необходимо создать экземпляр. Когда приложение выполняет запросы, рекомендуется следовать принципу наименьших привилегий и напрямую передавать SearchIndexClient
ключ запроса в качестве аргумента. Это гарантирует, что у пользователей есть доступ только для чтения к индексам и документам. Этот подход демонстрируется в следующем примере кода:
SearchIndexClient indexClient =
new SearchIndexClient(Constants.SearchServiceName, Constants.Index, new SearchCredentials(Constants.QueryApiKey));
Перегрузка SearchIndexClient
конструктора принимает имя службы поиска, имя индекса и SearchCredentials
объект в качестве аргументов с SearchCredentials
объектом, упаковав ключ запроса для служба Azure.
Поиск запросов
Индекс можно запросить, вызвав Documents.SearchAsync
метод в SearchIndexClient
экземпляре, как показано в следующем примере кода:
async Task AzureSearch(string text)
{
Monkeys.Clear();
var searchResults = await indexClient.Documents.SearchAsync<Monkey>(text);
foreach (SearchResult<Monkey> result in searchResults.Results)
{
Monkeys.Add(new Monkey
{
Name = result.Document.Name,
Location = result.Document.Location,
Details = result.Document.Details,
ImageUrl = result.Document.ImageUrl
});
}
}
Метод SearchAsync
принимает текстовый аргумент поиска и необязательный SearchParameters
объект, который можно использовать для дальнейшего уточнения запроса. Поисковый запрос указывается в качестве текстового аргумента поиска, а запрос фильтра можно указать, задав Filter
свойство аргумента SearchParameters
. В следующем примере кода показаны оба типа запросов:
var parameters = new SearchParameters
{
Filter = "location ne 'China' and location ne 'Vietnam'"
};
var searchResults = await indexClient.Documents.SearchAsync<Monkey>(text, parameters);
Этот запрос фильтра применяется ко всему индексу и удаляет документы из результатов, в которых location
поле не равно Китаю и не равно Вьетнаму. После фильтрации поисковый запрос выполняется в результатах запроса фильтра.
Примечание.
Чтобы отфильтровать без поиска, передайте *
в качестве текстового аргумента поиска.
Метод SearchAsync
возвращает DocumentSearchResult
объект, содержащий результаты запроса. Этот объект перечисляется, при этом каждый Document
объект создается как Monkey
объект и добавляется в Monkeys
ObservableCollection
дисплей. На следующих снимках экрана показаны результаты поискового запроса, возвращенные из службы "Поиск Azure":
Дополнительные сведения о поиске и фильтрации см. в статье "Запрос индекса поиска Azure" с помощью пакета SDK для .NET.
Запросы предложений
Поиск Azure позволяет запрашивать предложения на основе поискового запроса, вызывая Documents.SuggestAsync
метод в экземпляре SearchIndexClient
. Это демонстрируется в следующем примере кода:
async Task AzureSuggestions(string text)
{
Suggestions.Clear();
var parameters = new SuggestParameters()
{
UseFuzzyMatching = true,
HighlightPreTag = "[",
HighlightPostTag = "]",
MinimumCoverage = 100,
Top = 10
};
var suggestionResults =
await indexClient.Documents.SuggestAsync<Monkey>(text, "nameSuggester", parameters);
foreach (var result in suggestionResults.Results)
{
Suggestions.Add(new Monkey
{
Name = result.Text,
Location = result.Document.Location,
Details = result.Document.Details,
ImageUrl = result.Document.ImageUrl
});
}
}
Метод SuggestAsync
принимает текстовый аргумент поиска, имя искомый метод (который определен в индексе) и необязательный SuggestParameters
объект, который можно использовать для дальнейшего уточнения запроса. Экземпляр SuggestParameters
задает следующие свойства:
UseFuzzyMatching
— если задано значениеtrue
, поиск Azure найдет предложения, даже если в тексте поиска есть замещающий или отсутствующий символ.HighlightPreTag
— тег, готовый к предложениям.HighlightPostTag
— тег, добавляемый к хитам предложения.MinimumCoverage
— представляет процент индекса, который должен охватываться запросом предложения для сообщения об успешном выполнении запроса. Значение по умолчанию — 80.Top
— количество предложений для получения. Оно должно быть целым числом от 1 до 100 с значением по умолчанию 5.
Общий эффект заключается в том, что первые 10 результатов из индекса будут возвращены с выделением попаданий, и результаты будут включать документы, содержащие аналогичные орфографические термины поиска.
Метод SuggestAsync
возвращает DocumentSuggestResult
объект, содержащий результаты запроса. Этот объект перечисляется, при этом каждый Document
объект создается как Monkey
объект и добавляется в Monkeys
ObservableCollection
дисплей. На следующих снимках экрана показаны результаты предложения, возвращаемые из службы поиска Azure:
Обратите внимание, SuggestAsync
что в примере приложения метод вызывается только после завершения ввода термина поиска. Однако его также можно использовать для поддержки автоматически завершенных поисковых запросов путем выполнения на каждом нажатии клавиш.
Итоги
В этой статье показано, как использовать библиотеку поиска Microsoft Azure для интеграции поиска Azure в Xamarin.Forms приложение. Поиск Azure — это облачная служба, которая предоставляет возможности индексирования и запроса для отправленных данных. Это удаляет требования к инфраструктуре и сложности алгоритма поиска, традиционно связанные с реализацией функций поиска в приложении.