Поиск данных с помощью поиска Azure и Xamarin.Forms

Download Sample Скачайте пример

Поиск Azure — это облачная служба, которая предоставляет возможности индексирования и запроса для отправленных данных. Это удаляет требования к инфраструктуре и сложности алгоритма поиска, традиционно связанные с реализацией функций поиска в приложении. В этой статье показано, как использовать библиотеку поиска Microsoft Azure для интеграции поиска Azure в Xamarin.Forms приложение.

Обзор

Данные хранятся в службе "Поиск Azure" в виде индексов и документов. Индекс — это хранилище данных, которое можно искать в Azure служба и концептуально похоже на таблицу базы данных. Документ — это одна единица данных, доступных для поиска в индексе, и концептуально похожа на строку базы данных. При отправке документов и отправке поисковых запросов в поиск Azure запросы выполняются в определенный индекс в службе поиска.

Каждый запрос, сделанный в поиск Azure, должен содержать имя службы и ключ API. Существует два типа ключа API:

  • Администратор ключи предоставляют полные права всем операциям. Это включает управление службой, создание и удаление индексов и источников данных.
  • Ключи запросов предоставляют доступ только для чтения к индексам и документам и должны использоваться приложениями, которые выдают поисковые запросы.

Самый распространенный запрос в службе "Поиск Azure" — выполнение запроса. Существует два типа запроса, которые можно отправить:

Поисковые запросы и запросы фильтров можно использовать отдельно или вместе. При совместном использовании запрос фильтра сначала применяется ко всему индексу, а затем поисковый запрос выполняется в результатах запроса фильтра.

Поиск Azure также поддерживает получение предложений на основе входных данных поиска. Дополнительные сведения см. в разделе "Запросы предложений".

Примечание.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.

Настройка

Процесс интеграции службы "Поиск Azure" в Xamarin.Forms приложение выглядит следующим образом:

  1. Создайте служба Azure. Дополнительные сведения см. в статье "Создание azure служба с помощью портала Azure".
  2. Удалите Silverlight в качестве целевой платформы из Xamarin.Forms переносимой библиотеки классов решения (PCL). Это можно сделать, изменив профиль PCL на любой профиль, поддерживающий кроссплатформенную разработку, но не поддерживает Silverlight, например профиль 151 или профиль 92.
  3. Добавьте пакет 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.DeleteSearchServiceClient экземпляр:

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 объект и добавляется в MonkeysObservableCollection дисплей. На следующих снимках экрана показаны результаты поискового запроса, возвращенные из службы "Поиск Azure":

Search Results

Дополнительные сведения о поиске и фильтрации см. в статье "Запрос индекса поиска 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 объект и добавляется в MonkeysObservableCollection дисплей. На следующих снимках экрана показаны результаты предложения, возвращаемые из службы поиска Azure:

Suggestion Results

Обратите внимание, SuggestAsync что в примере приложения метод вызывается только после завершения ввода термина поиска. Однако его также можно использовать для поддержки автоматически завершенных поисковых запросов путем выполнения на каждом нажатии клавиш.

Итоги

В этой статье показано, как использовать библиотеку поиска Microsoft Azure для интеграции поиска Azure в Xamarin.Forms приложение. Поиск Azure — это облачная служба, которая предоставляет возможности индексирования и запроса для отправленных данных. Это удаляет требования к инфраструктуре и сложности алгоритма поиска, традиционно связанные с реализацией функций поиска в приложении.