Aracılığıyla paylaş


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:

  1. Azure Arama hizmeti oluşturun. Daha fazla bilgi için bkz. Azure Portal'ı kullanarak Azure Arama hizmeti oluşturma.
  2. Çö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.
  3. Çö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 dizinde DataType.Stringtü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 ifadelerde OrderBy 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.CreateSearchServiceClient 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.DeleteSearchServiceClient 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 FilterSearchParameters ö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 MonkeysObservableCollection eklenir. Aşağıdaki ekran görüntüleri, Azure Search'ten döndürülen arama sorgusu sonuçlarını gösterir:

Arama Sonuçları

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 – olarak trueayarlandığı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 MonkeysObservableCollection eklenir. Aşağıdaki ekran görüntüleri, Azure Search'ten döndürülen öneri sonuçlarını gösterir:

Öneri Sonuçları

Ö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.