Azure Search를 사용하여 데이터 검색 및 Xamarin.Forms
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 Search를 애플리케이션에 Xamarin.Forms 통합하는 프로세스는 다음과 같습니다.
- Azure Search 서비스를 만듭니다. 자세한 내용은 Azure Portal을 사용하여 Azure Search 서비스 만들기를 참조 하세요.
- 솔루션 PCL(이식 가능한 클래스 라이브러리)에서 Xamarin.Forms 대상 프레임워크로 Silverlight를 제거합니다. 이 작업은 PCL 프로필을 플랫폼 간 개발을 지원하지만 프로필 151 또는 프로필 92와 같이 Silverlight를 지원하지 않는 프로필로 변경하여 수행할 수 있습니다.
- 솔루션의 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.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
개체를 사용합니다. 검색 쿼리는 검색 텍스트 인수로 지정되지만 필터 쿼리는 인수의 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 디스플레이에 Monkeys
ObservableCollection
추가됩니다. 다음 스크린샷은 Azure Search에서 반환된 검색 쿼리 결과를 보여 줍니다.
검색 및 필터링 에 대한 자세한 내용은 .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 디스플레이에 Monkeys
ObservableCollection
추가됩니다. 다음 스크린샷은 Azure Search에서 반환된 제안 결과를 보여 줍니다.
샘플 애플리케이션 SuggestAsync
에서 메서드는 사용자가 검색 용어 입력을 완료할 때만 호출됩니다. 그러나 각 키 프레스에서 실행하여 자동 완성 검색 쿼리를 지원하는 데 사용할 수도 있습니다.
요약
이 문서에서는 Microsoft Azure Search 라이브러리를 사용하여 Azure Search를 애플리케이션에 통합하는 Xamarin.Forms 방법을 설명했습니다. Azure Search는 업로드된 데이터에 대한 인덱싱 및 쿼리 기능을 제공하는 클라우드 서비스입니다. 이렇게 하면 애플리케이션에서 검색 기능 구현과 관련된 인프라 요구 사항 및 검색 알고리즘 복잡성이 제거됩니다.