Azure Search를 사용하여 데이터 검색 및 Xamarin.Forms

Download Sample 샘플 다운로드

Azure Search는 업로드된 데이터에 대한 인덱싱 및 쿼리 기능을 제공하는 클라우드 서비스입니다. 이렇게 하면 애플리케이션에서 검색 기능 구현과 관련된 인프라 요구 사항 및 검색 알고리즘 복잡성이 제거됩니다. 이 문서에서는 Microsoft Azure Search 라이브러리를 사용하여 Azure Search를 애플리케이션에 통합하는 Xamarin.Forms 방법을 보여 줍니다.

개요

데이터는 Azure Search에 인덱스 및 문서로 저장됩니다. 인 스는 Azure Search 서비스에서 검색할 수 있는 데이터 저장소이며 개념적으로 데이터베이스 테이블과 유사합니다. 문서는 인덱스의 검색 가능한 데이터의 단일 단위이며 개념적으로 데이터베이스 행과 유사합니다. 문서를 업로드하고 Azure Search에 검색 쿼리를 제출할 때 검색 서비스의 특정 인덱스에 대한 요청이 이루어집니다.

Azure Search에 대한 각 요청에는 서비스 이름과 API 키가 포함되어야 합니다. API 키에는 두 가지 유형이 있습니다.

  • 관리 키는 모든 작업에 대한 모든 권한을 부여합니다. 여기에는 서비스 관리, 인덱스 만들기 및 삭제 및 데이터 원본이 포함됩니다.
  • 쿼리 키 는 인덱스 및 문서에 대한 읽기 전용 액세스 권한을 부여하며 검색 요청을 발급하는 애플리케이션에서 사용해야 합니다.

Azure Search에 대한 가장 일반적인 요청은 쿼리를 실행하는 것입니다. 제출할 수 있는 두 가지 유형의 쿼리가 있습니다.

  • 검색 쿼리는 인덱스 내의 모든 검색 가능한 필드에서 하나 이상의 항목을 검색합니다. 검색 쿼리는 간소화된 구문 또는 Lucene 쿼리 구문을 사용하여 빌드됩니다. 자세한 내용은 Azure Search의 단순 쿼리 구문 및 Azure Search의 Lucene 쿼리 구문을 참조하세요.
  • 필터 쿼리는 인덱스의 필터링 가능한 모든 필드에 대해 부울 식을 평가합니다. 필터 쿼리는 OData 필터 언어의 하위 집합을 사용하여 빌드됩니다. 자세한 내용은 Azure Search에 대한 OData 식 구문을 참조하세요.

검색 쿼리 및 필터 쿼리는 개별적으로 또는 함께 사용할 수 있습니다. 함께 사용하면 필터 쿼리가 먼저 전체 인덱스로 적용된 다음 필터 쿼리의 결과에 대해 검색 쿼리가 수행됩니다.

또한 Azure Search는 검색 입력에 따라 제안 검색을 지원합니다. 자세한 내용은 제안 쿼리를 참조 하세요.

참고 항목

Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

설정

Azure Search를 애플리케이션에 Xamarin.Forms 통합하는 프로세스는 다음과 같습니다.

  1. Azure Search 서비스를 만듭니다. 자세한 내용은 Azure Portal을 사용하여 Azure Search 서비스 만들기를 참조 하세요.
  2. 솔루션 PCL(이식 가능한 클래스 라이브러리)에서 Xamarin.Forms 대상 프레임워크로 Silverlight를 제거합니다. 이 작업은 PCL 프로필을 플랫폼 간 개발을 지원하지만 프로필 151 또는 프로필 92와 같이 Silverlight를 지원하지 않는 프로필로 변경하여 수행할 수 있습니다.
  3. 솔루션의 PCL 프로젝트에 Xamarin.Forms Microsoft Azure Search 라이브러리 NuGet 패키지를 추가합니다.

이러한 단계를 수행한 후 Microsoft Search 라이브러리 API를 사용하여 검색 인덱스 및 데이터 원본을 관리하고, 문서를 업로드 및 관리하고, 쿼리를 실행할 수 있습니다.

Azure Search 인덱스 만들기

검색할 데이터의 구조에 매핑되는 인덱스 스키마를 정의해야 합니다. 이 작업은 Azure Portal에서 수행하거나 프로그래밍 방식으로 클래스를 SearchServiceClient 사용하여 수행할 수 있습니다. 이 클래스는 Azure Search에 대한 연결을 관리하며 인덱스를 만드는 데 사용할 수 있습니다. 다음 코드 예제에서는 이 클래스의 인스턴스를 만드는 방법을 보여 줍니다.

var searchClient =
  new SearchServiceClient(Constants.SearchServiceName, new SearchCredentials(Constants.AdminApiKey));

SearchServiceClient 생성자 오버로드는 Azure Search 서비스의 관리 키를 래핑하는 개체를 SearchCredentials 사용하여 검색 서비스 이름과 SearchCredentials 개체를 인수로 사용합니다. 인덱스 만들기에는 관리 키가 필요합니다.

참고 항목

Azure Search에 너무 많은 연결을 열지 않도록 애플리케이션에서 단일 SearchServiceClient 인스턴스를 사용해야 합니다.

인덱스는 다음 코드 예제에 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 사용합니다.

자세한 내용은 .NET SDK를 사용하여 Azure Search 인덱스 만들기를 참조하세요.

Azure Search 인덱스 삭제

인스턴스에서 호출 Indexes.Delete 하여 인덱스가 삭제될 수 있습니다.SearchServiceClient

searchClient.Indexes.Delete(Constants.Index);

Azure Search 인덱스로 데이터 업로드

인덱스 정의 후 다음 두 모델 중 하나를 사용하여 데이터를 업로드할 수 있습니다.

  • 끌어오기 모델 – 데이터는 Azure Cosmos DB, Azure SQL Database, Azure Blob Storage 또는 Azure Virtual Machine에서 호스트되는 SQL Server에서 주기적으로 수집됩니다.
  • 푸시 모델 – 데이터는 프로그래밍 방식으로 인덱스로 전송됩니다. 이 문서에서 채택된 모델입니다.

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 Search에 알려주는 문서와 속성이 포함됩니다. 위의 IndexAction.Upload 코드 예제에서 작업이 지정되어 문서가 새 문서인 경우 인덱스에 삽입되거나 이미 있는 경우 바뀝니다. IndexBatch 그런 다음 개체의 메서드를 호출하여 개체를 Documents.Index 인덱스로 보냅니다SearchIndexClient. 다른 인덱싱 작업에 대한 자세한 내용은 사용할 인덱싱 작업 결정(Decide)을 참조하세요.

참고 항목

단일 인덱싱 요청에는 1000개 문서만 포함할 수 있습니다.

위의 monkeyList 코드 예제에서 컬렉션은 개체 컬렉션 Monkey 에서 익명 개체로 만들어집니다. 이렇게 하면 필드에 대한 id 데이터가 생성되고 Pascal case Monkey 속성 이름이 카멜 케이스 검색 인덱스 필드 이름에 매핑되는 것을 확인합니다. 또는 클래스에 특성을 Monkey 추가하여 이 매핑을 [SerializePropertyNamesAsCamelCase] 수행할 수도 있습니다.

자세한 내용은 .NET SDK를 사용하여 Azure Search에 데이터 업로드를 참조 하세요.

Azure Search 인덱스 쿼리

SearchIndexClient 인덱스 쿼리를 위해 인스턴스를 만들어야 합니다. 애플리케이션이 쿼리를 실행할 때 최소 권한 원칙을 따르고 직접 만들어 SearchIndexClient 쿼리 키를 인수로 전달하는 것이 좋습니다. 이렇게 하면 사용자가 인덱스 및 문서에 읽기 전용으로 액세스할 수 있습니다. 다음 코드 예제는 이 방법을 보여 줍니다.

SearchIndexClient indexClient =
  new SearchIndexClient(Constants.SearchServiceName, Constants.Index, new SearchCredentials(Constants.QueryApiKey));

SearchIndexClient 생성자 오버로드는 검색 서비스 이름, 인덱스 이름 및 개체를 SearchCredentials 인수로 사용하고, 개체는 SearchCredentials Azure Search 서비스에 대한 쿼리 키를 래핑합니다.

쿼리 검색

다음 코드 예제와 같이 인스턴스에서 메서드를 Documents.SearchAsyncSearchIndexClient 호출하여 인덱스 쿼리를 수행할 수 있습니다.

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 개체를 사용합니다. 검색 쿼리는 검색 텍스트 인수로 지정되지만 필터 쿼리는 인수의 SearchParameters 속성을 설정 Filter 하여 지정할 수 있습니다. 다음 코드 예제에서는 두 쿼리 형식을 모두 보여 줍니다.

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 만들어지고 for 디스플레이에 MonkeysObservableCollection 추가됩니다. 다음 스크린샷은 Azure Search에서 반환된 검색 쿼리 결과를 보여 줍니다.

Search Results

검색 및 필터링 에 대한 자세한 내용은 .NET SDK를 사용하여 Azure Search 인덱스 쿼리를 참조하세요.

제안 쿼리

Azure Search를 사용하면 인스턴스에서 메서드를 호출 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 Search에서 제안을 찾을 수 있습니다.
  • HighlightPreTag – 제안 적수 앞에 추가된 태그입니다.
  • HighlightPostTag – 제안 적수에 추가되는 태그입니다.
  • MinimumCoverage – 쿼리가 성공으로 보고되려면 제안 쿼리에서 처리해야 하는 인덱스의 백분율을 나타냅니다. 기본값은 80입니다.
  • Top – 검색할 제안 수입니다. 기본값이 5인 1에서 100 사이의 정수여야 합니다.

전체적인 효과는 인덱스의 상위 10개 결과가 적중 항목 강조 표시와 함께 반환되며, 결과에는 유사한 철자가 지정된 검색어를 포함하는 문서가 포함됩니다.

메서드는 SuggestAsync 쿼리 결과를 포함하는 개체를 반환 DocumentSuggestResult 합니다. 이 개체는 열거되며 각 Document 개체가 개체로 Monkey 만들어지고 for 디스플레이에 MonkeysObservableCollection 추가됩니다. 다음 스크린샷은 Azure Search에서 반환된 제안 결과를 보여 줍니다.

Suggestion Results

샘플 애플리케이션 SuggestAsync 에서 메서드는 사용자가 검색 용어 입력을 완료할 때만 호출됩니다. 그러나 각 키 프레스에서 실행하여 자동 완성 검색 쿼리를 지원하는 데 사용할 수도 있습니다.

요약

이 문서에서는 Microsoft Azure Search 라이브러리를 사용하여 Azure Search를 애플리케이션에 통합하는 Xamarin.Forms 방법을 설명했습니다. Azure Search는 업로드된 데이터에 대한 인덱싱 및 쿼리 기능을 제공하는 클라우드 서비스입니다. 이렇게 하면 애플리케이션에서 검색 기능 구현과 관련된 인프라 요구 사항 및 검색 알고리즘 복잡성이 제거됩니다.