Azure Search ile Veri Arama ve Xamarin.Forms
Azure Search, karşıya yüklenen veriler için dizin oluşturma ve sorgulama özellikleri sağlayan bir bulut hizmetidir. Bu, bir uygulamada arama işlevselliğini uygulamayla ilişkili altyapı gereksinimlerini ve arama algoritması karmaşıklıklarını ortadan kaldırır. Bu makalede, Azure Search'ün bir Xamarin.Forms uygulamayla tümleştirilmesi için Microsoft Azure Search Kitaplığı'nın nasıl kullanılacağı gösterilmektedir.
Genel bakış
Veriler Azure Search'te dizinler ve belgeler olarak depolanır. Dizin, Azure Arama hizmeti tarafından aranabilen ve kavramsal olarak veritabanı tablosuna benzeyen bir veri deposudur. Belge, dizindeki aranabilir verilerin tek bir birimidir ve kavramsal olarak veritabanı satırına benzer. Belgeleri karşıya yüklerken ve Azure Search'e arama sorguları gönderirken, arama hizmetindeki belirli bir dizine istekler yapılır.
Azure Search'e yapılan her istekte hizmetin adı ve bir API anahtarı bulunmalıdır. İki tür API anahtarı vardır:
- Yönetici anahtarları tüm işlemler için tam haklar verir. Bu, hizmeti yönetmeyi, dizinleri ve veri kaynaklarını oluşturmayı ve silmeyi içerir.
- Sorgu anahtarları dizinlere ve belgelere salt okunur erişim verir ve arama istekleri veren uygulamalar tarafından kullanılmalıdır.
Azure Search'e en yaygın istek bir sorgu yürütmektir. Gönderilebilen iki sorgu türü vardır:
- Arama sorgusu, bir dizindeki tüm aranabilir alanlarda bir veya daha fazla öğeyi arar. Arama sorguları basitleştirilmiş söz dizimi veya Lucene sorgu söz dizimi kullanılarak oluşturulur. Daha fazla bilgi için bkz. Azure Search'te basit sorgu söz dizimi ve Azure Search'te Lucene sorgu söz dizimi.
- Filtre sorgusu, bir dizindeki tüm filtrelenebilir alanlar üzerinde boole ifadesini değerlendirir. Filtre sorguları, OData filtre dilinin bir alt kümesi kullanılarak oluşturulur. Daha fazla bilgi için bkz . Azure Search için OData İfade söz dizimi.
Arama sorguları ve filtre sorguları ayrı ayrı veya birlikte kullanılabilir. Birlikte kullanıldığında, filtre sorgusu önce dizinin tamamına uygulanır ve ardından arama sorgusu filtre sorgusunun sonuçları üzerinde gerçekleştirilir.
Azure Search, arama girişlerine göre önerilerin alınmasını da destekler. Daha fazla bilgi için bkz . Öneri Sorguları.
Not
Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Ayarlama
Azure Search'i bir Xamarin.Forms uygulamayla tümleştirme işlemi aşağıdaki gibidir:
- Azure Arama hizmeti oluşturun. Daha fazla bilgi için bkz. Azure Portal'ı kullanarak Azure Arama hizmeti oluşturma.
- Çözüm Taşınabilir Sınıf Kitaplığı'ndan (PCL) hedef çerçeve olarak Silverlight'ı Xamarin.Forms kaldırın. Bu, PCL profilini platformlar arası geliştirmeyi destekleyen ancak 151. profil veya profil 92 gibi Silverlight'ı desteklemeyen herhangi bir profille değiştirerek gerçekleştirilebilir.
- Çözümdeki PCL projesine Xamarin.Forms Microsoft Azure Search Library NuGet paketini ekleyin.
Bu adımlar gerçekleştirildikten sonra, arama dizinlerini ve veri kaynaklarını yönetmek, belgeleri karşıya yüklemek ve yönetmek ve sorguları yürütmek için Microsoft Arama Kitaplığı API'sini kullanabilirsiniz.
Azure Search Dizini oluşturma
Aranacak verilerin yapısına eşlenen bir dizin şeması tanımlanmalıdır. Bu, Azure Portal'da veya program aracılığıyla sınıfı kullanılarak SearchServiceClient
gerçekleştirilebilir. Bu sınıf, Azure Search bağlantılarını yönetir ve dizin oluşturmak için kullanılabilir. Aşağıdaki kod örneği, bu sınıfın bir örneğinin nasıl oluşturulacağını gösterir:
var searchClient =
new SearchServiceClient(Constants.SearchServiceName, new SearchCredentials(Constants.AdminApiKey));
SearchServiceClient
Oluşturucu aşırı yüklemesi, bir arama hizmeti adını ve nesneyi SearchCredentials
bağımsız değişken SearchCredentials
olarak alır ve nesne Azure Arama hizmeti için yönetici anahtarını sarmalar. Dizin oluşturmak için yönetici anahtarı gereklidir.
Not
Azure Search'e çok fazla bağlantı açmamak için uygulamada tek SearchServiceClient
bir örnek kullanılmalıdır.
Aşağıdaki kod örneğinde Index
gösterildiği gibi bir dizin nesnesi tarafından tanımlanır:
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
özelliği dizinin Index.Fields
adına, özelliği ise bir nesne dizisine Field
ayarlanmalıdır. Her Field
örnek, alanın nasıl kullanıldığını belirten bir ad, tür ve herhangi bir özellik belirtir. Bu özellikler şunlardır:
IsKey
– alanın dizinin anahtarı olup olmadığını gösterir. Anahtar alanı olarak dizindeDataType.String
türünde yalnızca bir alan atanmalıdır.IsFacetable
– bu alanda çok yönlü gezinti yapılıp yapılamayacağını gösterir. Varsayılan değer şudur:false
.IsFilterable
– alanın filtre sorgularında kullanılıp kullanılamayacağını gösterir. Varsayılan değer şudur:false
.IsRetrievable
– alanın arama sonuçlarında alınıp alınamayacağını gösterir. Varsayılan değer şudur:true
.IsSearchable
– alanın tam metin aramalarına dahil olup olmadığını gösterir. Varsayılan değer şudur:false
.IsSortable
– alanın ifadelerdeOrderBy
kullanılıp kullanılamayacağını gösterir. Varsayılan değer şudur:false
.
Not
Dağıtıldıktan sonra dizini değiştirmek, verilerin yeniden derlenip yeniden yüklenmesini içerir.
Bir Index
nesne isteğe bağlı olarak, otomatik tamamlama veya arama önerisi sorgularını desteklemek için kullanılacak dizindeki alanları tanımlayan bir Suggesters
özellik belirtebilir. özelliği, Suggesters
arama önerisi sonuçlarını oluşturmak için kullanılan alanları tanımlayan bir nesne dizisine Suggester
ayarlanmalıdır.
Nesnesi oluşturulduktan Index
sonra dizin, örnekte çağrılarak Indexes.Create
SearchServiceClient
oluşturulur.
Not
Yanıt vermesi gereken bir uygulamadan dizin oluştururken yöntemini kullanın Indexes.CreateAsync
.
Daha fazla bilgi için bkz . .NET SDK'sını kullanarak Azure Search dizini oluşturma.
Azure Search Dizinini Silme
Örnekte çağrılarak Indexes.Delete
SearchServiceClient
dizin silinebilir:
searchClient.Indexes.Delete(Constants.Index);
Verileri Azure Search Dizinine Yükleme
Dizin tanımlandıktan sonra veriler iki modelden biri kullanılarak bu dizine yüklenebilir:
- Çekme modeli: Veriler azure sanal makinesinde barındırılan Azure Cosmos DB, Azure SQL Veritabanı, Azure Blob Depolama veya SQL Server'dan düzenli aralıklarla alınıyor.
- Gönderme modeli – veriler program aracılığıyla dizine gönderilir. Bu, bu makalede benimsenen modeldir.
SearchIndexClient
Dizine veri aktarmak için bir örnek oluşturulmalıdır. Bu, aşağıdaki kod örneğinde gösterildiği gibi yöntemini çağırarak SearchServiceClient.Indexes.GetClient
gerçekleştirilebilir:
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)));
}
}
Dizine içeri aktarılacak veriler bir IndexBatch
nesne olarak paketlenmiştir ve bu da bir nesne koleksiyonunu IndexAction
kapsüller. Her IndexAction
örnek bir belge ve Azure Search'e belgede hangi eylemin gerçekleştirildiğini bildiren bir özellik içerir. Yukarıdaki kod örneğinde eylem IndexAction.Upload
belirtilir ve bu da belgenin yeniyse dizine eklenmesine veya zaten varsa değiştirilmesine neden olur. Nesne IndexBatch
daha sonra nesnesinde yöntemini çağırarak Documents.Index
dizine SearchIndexClient
gönderilir. Diğer dizin oluşturma eylemleri hakkında bilgi için bkz . Hangi dizin oluşturma eyleminin kullanılacağına karar verme.
Not
Tek bir dizin oluşturma isteğine yalnızca 1000 belge eklenebilir.
Yukarıdaki kod örneğinde, koleksiyonun monkeyList
bir nesne koleksiyonundan anonim bir nesne olarak oluşturulduğunu Monkey
unutmayın. Bu, alan için id
veri oluşturur ve Pascal büyük/küçük harf özellik adlarının deve olayı Monkey
arama dizini alan adlarına eşlenmesi sorununu çözer. Alternatif olarak, bu eşleme özniteliği sınıfa [SerializePropertyNamesAsCamelCase]
Monkey
eklenerek de gerçekleştirilebilir.
Daha fazla bilgi için bkz . .NET SDK'sını kullanarak Azure Search'e veri yükleme.
Azure Search Dizinini Sorgulama
Bir SearchIndexClient
dizini sorgulamak için bir örnek oluşturulmalıdır. Bir uygulama sorguları yürütürken, en düşük ayrıcalık ilkesine uymanız ve sorgu anahtarını bağımsız değişken olarak geçirerek doğrudan bir SearchIndexClient
oluşturmanız önerilir. Bu, kullanıcıların dizinlere ve belgelere salt okunur erişimi olmasını sağlar. Bu yaklaşım aşağıdaki kod örneğinde gösterilmiştir:
SearchIndexClient indexClient =
new SearchIndexClient(Constants.SearchServiceName, Constants.Index, new SearchCredentials(Constants.QueryApiKey));
SearchIndexClient
Oluşturucu aşırı yüklemesi bir arama hizmeti adını, dizin adını ve nesneyi SearchCredentials
bağımsız değişken SearchCredentials
olarak alır ve nesne Azure Arama hizmeti için sorgu anahtarını kaydırır.
Arama Sorguları
Dizin, aşağıdaki kod örneğinde gösterildiği gibi örnekte yöntemini SearchIndexClient
çağırarak Documents.SearchAsync
sorgulanabilir:
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
yöntemi bir arama metni bağımsız değişkeni ve sorguyu daha da daraltmak için kullanılabilecek isteğe bağlı SearchParameters
bir nesne alır. Arama sorgusu arama metni bağımsız değişkeni olarak belirtilirken, bağımsız değişkenin Filter
SearchParameters
özelliği ayarlanarak bir filtre sorgusu belirtilebilir. Aşağıdaki kod örneği her iki sorgu türünü de gösterir:
var parameters = new SearchParameters
{
Filter = "location ne 'China' and location ne 'Vietnam'"
};
var searchResults = await indexClient.Documents.SearchAsync<Monkey>(text, parameters);
Bu filtre sorgusu dizinin tamamına uygulanır ve alanın Çin'e eşit olmadığı ve Vietnam'a eşit olmadığı sonuçlardan location
belgeleri kaldırır. Filtrelemeden sonra, arama sorgusu filtre sorgusunun sonuçları üzerinde gerçekleştirilir.
Not
Arama yapmadan filtrelemek için, arama metni bağımsız değişkeni olarak geçirin *
.
yöntemi, SearchAsync
sorgu sonuçlarını içeren bir DocumentSearchResult
nesne döndürür. Bu nesne numaralandırılır ve her Document
nesne bir Monkey
nesne olarak oluşturulur ve görüntülenmek üzere öğesine Monkeys
ObservableCollection
eklenir. Aşağıdaki ekran görüntüleri, Azure Search'ten döndürülen arama sorgusu sonuçlarını gösterir:
Arama ve filtreleme hakkında daha fazla bilgi için bkz . .NET SDK'sını kullanarak Azure Search dizininizi sorgulama.
Öneri Sorguları
Azure Search, örnekte yöntemini çağırarak bir arama sorgusuna göre önerilerin Documents.SuggestAsync
istenmesini SearchIndexClient
sağlar. Bu, aşağıdaki kod örneğinde gösterilmiştir:
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
yöntemi bir arama metni bağımsız değişkeni, kullanılacak önerinin adı (dizinde tanımlanmıştır) ve sorguyu daha da daraltmak için kullanılabilecek isteğe bağlı SuggestParameters
bir nesne alır. Örnek SuggestParameters
aşağıdaki özellikleri ayarlar:
UseFuzzyMatching
– olaraktrue
ayarlandığında, arama metninde yerine başka bir karakter veya eksik karakter olsa bile Azure Search öneriler bulur.HighlightPreTag
– öneri isabetlerine önceden eklenen etiket.HighlightPostTag
– öneri isabetlerine eklenen etiket.MinimumCoverage
– başarılı olarak bildirilmesi için bir öneri sorgusu tarafından kapsanması gereken dizinin yüzdesini temsil eder. Varsayılan değer 80'dir.Top
– alınacak öneri sayısı. Varsayılan değeri 5 olan 1 ile 100 arasında bir tamsayı olmalıdır.
Bunun genel etkisi, dizindeki ilk 10 sonucun isabet vurgulamayla döndürüleceği ve sonuçların benzer şekilde yazılmış arama terimleri içeren belgeleri içermesidir.
yöntemi, SuggestAsync
sorgu sonuçlarını içeren bir DocumentSuggestResult
nesne döndürür. Bu nesne numaralandırılır ve her Document
nesne bir Monkey
nesne olarak oluşturulur ve görüntülenmek üzere öğesine Monkeys
ObservableCollection
eklenir. Aşağıdaki ekran görüntüleri, Azure Search'ten döndürülen öneri sonuçlarını gösterir:
Örnek uygulamada yönteminin SuggestAsync
yalnızca kullanıcı bir arama terimi girişini tamamladığında çağrıldığını unutmayın. Ancak, her tuş tuşuna basarak otomatik tamamlama arama sorgularını desteklemek için de kullanılabilir.
Özet
Bu makalede, Azure Search'ün bir Xamarin.Forms uygulamayla tümleştirilmesi için Microsoft Azure Search Kitaplığı'nın nasıl kullanılacağı gösterilmiştir. Azure Search, karşıya yüklenen veriler için dizin oluşturma ve sorgulama özellikleri sağlayan bir bulut hizmetidir. Bu, bir uygulamada arama işlevselliğini uygulamayla ilişkili altyapı gereksinimlerini ve arama algoritması karmaşıklıklarını ortadan kaldırır.