Bagikan melalui


Cari Data dengan Azure Search dan Xamarin.Forms

Azure Search adalah layanan cloud yang menyediakan kemampuan pengindeksan dan kueri untuk data yang diunggah. Ini menghapus persyaratan infrastruktur dan kompleksitas algoritma pencarian yang secara tradisional terkait dengan penerapan fungsionalitas pencarian dalam aplikasi. Artikel ini menunjukkan cara menggunakan Pustaka Pencarian Microsoft Azure untuk mengintegrasikan Azure Search ke dalam aplikasi Xamarin.Forms .

Gambaran Umum

Data disimpan di Azure Search sebagai indeks dan dokumen. Indeks adalah penyimpanan data yang dapat dicari oleh Azure layanan Pencarian, dan secara konseptual mirip dengan tabel database. Dokumen adalah satu unit data yang dapat dicari dalam indeks, dan secara konseptual mirip dengan baris database. Saat mengunggah dokumen dan mengirimkan kueri pencarian ke Azure Search, permintaan dibuat ke indeks tertentu di layanan pencarian.

Setiap permintaan yang dibuat ke Azure Search harus menyertakan nama layanan, dan kunci API. Ada dua jenis kunci API:

  • Kunci admin memberikan hak penuh untuk semua operasi. Ini termasuk mengelola layanan, membuat dan menghapus indeks, dan sumber data.
  • Kunci kueri memberikan akses baca-saja ke indeks dan dokumen, dan harus digunakan oleh aplikasi yang mengeluarkan permintaan pencarian.

Permintaan paling umum ke Azure Search adalah menjalankan kueri. Ada dua jenis kueri yang dapat dikirimkan:

Kueri pencarian dan kueri filter dapat digunakan secara terpisah atau bersama-sama. Saat digunakan bersama-sama, kueri filter diterapkan terlebih dahulu ke seluruh indeks, lalu kueri pencarian dilakukan pada hasil kueri filter.

Azure Search juga mendukung pengambilan saran berdasarkan input pencarian. Untuk informasi selengkapnya, lihat Kueri Saran.

Catatan

Jika Anda tidak memiliki langganan Azure, buatlah akun gratis sebelum Anda memulai.

Siapkan

Proses untuk mengintegrasikan Azure Search ke dalam aplikasi Xamarin.Forms adalah sebagai berikut:

  1. Membuat layanan Pencarian Azure. Untuk informasi selengkapnya, lihat Membuat azure layanan Pencarian menggunakan Portal Microsoft Azure.
  2. Hapus Silverlight sebagai kerangka kerja target dari Xamarin.Forms solusi Pustaka Kelas Portabel (PCL). Ini dapat dicapai dengan mengubah profil PCL ke profil apa pun yang mendukung pengembangan lintas platform, tetapi tidak mendukung Silverlight, seperti profil 151 atau profil 92.
  3. Tambahkan paket NuGet Pustaka Pencarian Microsoft Azure ke proyek PCL dalam Xamarin.Forms solusi.

Setelah melakukan langkah-langkah ini, Microsoft Search Library API dapat digunakan untuk mengelola indeks pencarian dan sumber data, mengunggah dan mengelola dokumen, dan menjalankan kueri.

Membuat Indeks Pencarian Azure

Skema indeks harus ditentukan yang memetakan ke struktur data yang akan dicari. Ini dapat dicapai di Portal Microsoft Azure, atau secara terprogram menggunakan SearchServiceClient kelas . Kelas ini mengelola koneksi ke Azure Search, dan dapat digunakan untuk membuat indeks. Contoh kode berikut menunjukkan cara membuat instans kelas ini:

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

Overload SearchServiceClient konstruktor mengambil nama layanan pencarian dan SearchCredentials objek sebagai argumen, dengan SearchCredentials objek yang membungkus kunci admin untuk Azure layanan Pencarian. Kunci admin diperlukan untuk membuat indeks.

Catatan

Satu SearchServiceClient instans harus digunakan dalam aplikasi untuk menghindari pembukaan terlalu banyak koneksi ke Azure Search.

Indeks didefinisikan oleh objek, seperti yang Index ditunjukkan dalam contoh kode berikut:

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);
}

Properti Index.Name harus diatur ke nama indeks, dan Index.Fields properti harus diatur ke array Field objek. Setiap Field instans menentukan nama, jenis, dan properti apa pun, yang menentukan bagaimana bidang digunakan. Properti ini meliputi:

  • IsKey – menunjukkan apakah bidang adalah kunci indeks. Hanya satu bidang dalam indeks, jenis DataType.String, yang harus ditetapkan sebagai bidang kunci.
  • IsFacetable – menunjukkan apakah dimungkinkan untuk melakukan navigasi tersaring pada bidang ini. Nilai defaultnya adalah false.
  • IsFilterable – menunjukkan apakah bidang dapat digunakan dalam kueri filter. Nilai defaultnya adalah false.
  • IsRetrievable – menunjukkan apakah bidang dapat diambil dalam hasil pencarian. Nilai defaultnya adalah true.
  • IsSearchable – menunjukkan apakah bidang disertakan dalam pencarian teks lengkap. Nilai defaultnya adalah false.
  • IsSortable – menunjukkan apakah bidang dapat digunakan dalam OrderBy ekspresi. Nilai defaultnya adalah false.

Catatan

Mengubah indeks setelah disebarkan melibatkan pembangunan ulang dan memuat ulang data.

Objek Index dapat secara opsional menentukan Suggesters properti, yang menentukan bidang dalam indeks yang akan digunakan untuk mendukung kueri saran penyelesaian otomatis atau pencarian. Properti Suggesters harus diatur ke array Suggester objek yang menentukan bidang yang digunakan untuk membangun hasil saran pencarian.

Setelah membuat Index objek, indeks dibuat dengan memanggil Indexes.Create instans SearchServiceClient .

Catatan

Saat membuat indeks dari aplikasi yang harus tetap responsif, gunakan metode .Indexes.CreateAsync

Untuk informasi selengkapnya, lihat Membuat indeks Azure Search menggunakan .NET SDK.

Menghapus Indeks Pencarian Azure

Indeks dapat dihapus dengan memanggil Indexes.Delete instans SearchServiceClient :

searchClient.Indexes.Delete(Constants.Index);

Mengunggah Data ke Indeks Pencarian Azure

Setelah menentukan indeks, data dapat diunggah ke dalamnya menggunakan salah satu dari dua model:

  • Model penarikan – data secara berkala diserap dari Azure Cosmos DB, Azure SQL Database, Azure Blob Storage, atau SQL Server yang dihosting di Azure Virtual Machine.
  • Model pendorongan – data dikirim secara terprogram ke indeks. Ini adalah model yang diadopsi dalam artikel ini.

Instans SearchIndexClient harus dibuat untuk mengimpor data ke dalam indeks. Ini dapat dicapai dengan memanggil metode , seperti yang SearchServiceClient.Indexes.GetClient ditunjukkan dalam contoh kode berikut:

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)));
  }
}

Data yang akan diimpor ke dalam indeks dimas sebagai IndexBatch objek, yang merangkum kumpulan IndexAction objek. Setiap IndexAction instans berisi dokumen, dan properti yang memberi tahu Azure Search tindakan mana yang harus dilakukan pada dokumen. Dalam contoh kode di atas, IndexAction.Upload tindakan ditentukan, yang menghasilkan dokumen yang dimasukkan ke dalam indeks jika baru, atau diganti jika sudah ada. Objek IndexBatch kemudian dikirim ke indeks dengan memanggil Documents.Index metode pada SearchIndexClient objek . Untuk informasi tentang tindakan pengindeksan lainnya, lihat Memutuskan tindakan pengindeksan mana yang akan digunakan.

Catatan

Hanya 1000 dokumen yang dapat disertakan dalam satu permintaan pengindeksan.

Perhatikan bahwa dalam contoh kode di atas, monkeyList koleksi dibuat sebagai objek anonim dari kumpulan Monkey objek. Ini membuat data untuk id bidang , dan menyelesaikan pemetaan nama properti kasus Monkey Pascal ke nama bidang indeks pencarian kasus camel. Atau, pemetaan ini juga dapat dicapai dengan menambahkan [SerializePropertyNamesAsCamelCase] atribut ke Monkey kelas .

Untuk informasi selengkapnya, lihat Mengunggah data ke Azure Search menggunakan .NET SDK.

Mengkueri Indeks Pencarian Azure

Instans SearchIndexClient harus dibuat untuk mengkueri indeks. Saat aplikasi menjalankan kueri, disarankan untuk mengikuti prinsip hak istimewa paling sedikit dan membuat SearchIndexClient secara langsung, meneruskan kunci kueri sebagai argumen. Ini memastikan bahwa pengguna memiliki akses baca-saja ke indeks dan dokumen. Pendekatan ini ditunjukkan dalam contoh kode berikut:

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

Overload SearchIndexClient konstruktor mengambil nama layanan pencarian, nama indeks, dan SearchCredentials objek sebagai argumen, dengan SearchCredentials objek yang membungkus kunci kueri untuk Azure layanan Pencarian.

Kueri Pencarian

Indeks dapat dikueri dengan memanggil Documents.SearchAsync metode pada SearchIndexClient instans, seperti yang ditunjukkan dalam contoh kode berikut:

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
    });
  }
}

Metode ini SearchAsync mengambil argumen teks pencarian, dan objek opsional SearchParameters yang dapat digunakan untuk menyempurnakan kueri lebih lanjut. Kueri pencarian ditentukan sebagai argumen teks pencarian, sementara kueri filter dapat ditentukan dengan mengatur Filter properti SearchParameters argumen. Contoh kode berikut menunjukkan kedua jenis kueri:

var parameters = new SearchParameters
{
  Filter = "location ne 'China' and location ne 'Vietnam'"
};
var searchResults = await indexClient.Documents.SearchAsync<Monkey>(text, parameters);

Kueri filter ini diterapkan ke seluruh indeks dan menghapus dokumen dari hasil di mana location bidang tidak sama dengan Tiongkok dan tidak sama dengan Vietnam. Setelah pemfilteran, kueri pencarian dilakukan pada hasil kueri filter.

Catatan

Untuk memfilter tanpa mencari, teruskan * sebagai argumen teks pencarian.

Metode mengembalikan SearchAsyncDocumentSearchResult objek yang berisi hasil kueri. Objek ini dijumlahkan, dengan setiap Document objek dibuat sebagai Monkey objek dan ditambahkan ke MonkeysObservableCollection untuk tampilan. Cuplikan layar berikut menunjukkan hasil kueri pencarian yang dikembalikan dari Azure Search:

Hasil Pencarian

Untuk informasi selengkapnya tentang pencarian dan pemfilteran, lihat Mengkueri indeks Azure Search Anda menggunakan .NET SDK.

Kueri Saran

Azure Search memungkinkan saran diminta berdasarkan kueri pencarian, dengan memanggil Documents.SuggestAsync metode pada SearchIndexClient instans. Ini ditunjukkan dalam contoh kode berikut:

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
    });
  }
}

Metode ini SuggestAsync mengambil argumen teks pencarian, nama pemberi saran untuk digunakan (yang ditentukan dalam indeks), dan objek opsional SuggestParameters yang dapat digunakan untuk lebih menyempurnakan kueri. SuggestParameters Instans menetapkan properti berikut:

  • UseFuzzyMatching – saat diatur ke true, Azure Search akan menemukan saran bahkan jika ada karakter yang diganti atau hilang dalam teks pencarian.
  • HighlightPreTag – tag yang sebelumnya ditujukan ke hit saran.
  • HighlightPostTag – tag yang ditambahkan ke hit saran.
  • MinimumCoverage – mewakili persentase indeks yang harus dicakup oleh kueri saran agar kueri dilaporkan berhasil. Defaultnya adalah 80.
  • Top – jumlah saran yang akan diambil. Ini harus berupa bilangan bulat antara 1 dan 100, dengan nilai default 5.

Efek keseluruhan adalah bahwa 10 hasil teratas dari indeks akan dikembalikan dengan penyorotan temuan, dan hasilnya akan mencakup dokumen yang menyertakan istilah pencarian ejaan yang sama.

Metode mengembalikan SuggestAsyncDocumentSuggestResult objek yang berisi hasil kueri. Objek ini dijumlahkan, dengan setiap Document objek dibuat sebagai Monkey objek dan ditambahkan ke MonkeysObservableCollection untuk tampilan. Cuplikan layar berikut menunjukkan hasil saran yang dikembalikan dari Azure Search:

Hasil Saran

Perhatikan bahwa dalam aplikasi sampel, SuggestAsync metode hanya dipanggil ketika pengguna selesai memasukkan istilah pencarian. Namun, ini juga dapat digunakan untuk mendukung kueri pencarian lengkapi otomatis dengan mengeksekusi pada setiap keypress.

Ringkasan

Artikel ini menunjukkan cara menggunakan Pustaka Pencarian Microsoft Azure untuk mengintegrasikan Azure Search ke dalam aplikasi Xamarin.Forms . Azure Search adalah layanan cloud yang menyediakan kemampuan pengindeksan dan kueri untuk data yang diunggah. Ini menghapus persyaratan infrastruktur dan kompleksitas algoritma pencarian yang secara tradisional terkait dengan penerapan fungsionalitas pencarian dalam aplikasi.