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 mencari satu atau beberapa item di semua bidang yang dapat dicari dalam indeks. Kueri pencarian dibuat menggunakan sintaks yang disederhanakan, atau sintaks kueri Lucene. Untuk informasi selengkapnya, lihat Sintaks kueri sederhana di Azure Search, dan Sintaks kueri Lucene di Azure Search.
- Kueri filter mengevaluasi ekspresi boolean di semua bidang yang dapat difilter dalam indeks. Kueri filter dibuat menggunakan subset bahasa filter OData. Untuk informasi selengkapnya, lihat Sintaks Ekspresi OData untuk Azure Search.
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:
- Membuat layanan Pencarian Azure. Untuk informasi selengkapnya, lihat Membuat azure layanan Pencarian menggunakan Portal Microsoft Azure.
- 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.
- 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, jenisDataType.String
, yang harus ditetapkan sebagai bidang kunci.IsFacetable
– menunjukkan apakah dimungkinkan untuk melakukan navigasi tersaring pada bidang ini. Nilai defaultnya adalahfalse
.IsFilterable
– menunjukkan apakah bidang dapat digunakan dalam kueri filter. Nilai defaultnya adalahfalse
.IsRetrievable
– menunjukkan apakah bidang dapat diambil dalam hasil pencarian. Nilai defaultnya adalahtrue
.IsSearchable
– menunjukkan apakah bidang disertakan dalam pencarian teks lengkap. Nilai defaultnya adalahfalse
.IsSortable
– menunjukkan apakah bidang dapat digunakan dalamOrderBy
ekspresi. Nilai defaultnya adalahfalse
.
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 SearchAsync
DocumentSearchResult
objek yang berisi hasil kueri. Objek ini dijumlahkan, dengan setiap Document
objek dibuat sebagai Monkey
objek dan ditambahkan ke Monkeys
ObservableCollection
untuk tampilan. Cuplikan layar berikut menunjukkan hasil kueri pencarian yang dikembalikan dari Azure Search:
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 ketrue
, 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 SuggestAsync
DocumentSuggestResult
objek yang berisi hasil kueri. Objek ini dijumlahkan, dengan setiap Document
objek dibuat sebagai Monkey
objek dan ditambahkan ke Monkeys
ObservableCollection
untuk tampilan. Cuplikan layar berikut menunjukkan hasil saran yang dikembalikan dari Azure Search:
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.