Paket ini didukung pada Umbraco v9-v13 dan v14
Ekstensi Pencarian tersedia melalui NuGet.
Untuk menginstal dengan .NET CLI, jalankan perintah berikut:
$ dotnet add package Our.Umbraco.Extensions.Search
Untuk menginstal dari dalam Visual Studio, gunakan UI NuGet Package Manager atau jalankan perintah berikut:
PM> Install-Package Our.Umbraco.Extensions.Search
Ada beberapa metode ekstensi singkat untuk menanyakan konten Umbraco dalam indeks – memeriksa apakah item diterbitkan, terlihat, atau memiliki templat.
Mengkueri hanya item konten yang diterbitkan dapat dilakukan seperti ini:
query.And().IsPublished()
Demikian pula, menanyakan semua konten yang properti umbracoNaviHide
tidak disetel dapat dilakukan seperti ini:
query.And().IsVisible()
Dimungkinkan untuk menanyakan konten dengan kumpulan ID templat tertentu. Jika 0
atau tidak ada nilai yang diteruskan ke metode, kueri akan mencocokkan konten dengan kumpulan ID template mana pun .
query.And().HasTemplate(int templateId)
Terakhir, dimungkinkan untuk melakukan kueri konten yang memiliki salah satu alias tipe konten tertentu. Umbraco mendukung kueri untuk alias konten tunggal.
query.And().NodeTypeAlias(string[] aliases)
Properti Umbraco yang telah disetel ke "bervariasi menurut budaya" diindeks dengan alias tertentu: {fieldName}_{culture}
. Misalnya, jika kolom "pageTitle" bervariasi menurut budaya dan memiliki 2 bahasa, Inggris dan Spanyol, indeks akan berisi 2 kolom: pageTitle_en
dan pageTitle_es
.
Budaya dapat diteruskan ke kueri Field
dan NodeName
seperti ini:
query.And().Field(string field, string culture)
query.And().NodeName(string nodeName, string culture)
Ia bahkan bekerja dengan kueri yang dikelompokkan seperti GroupedAnd
, GroupedOr
, dan GroupedNot
, di mana beberapa bidang dapat ditentukan:
query.And().GroupedOr(string[] fields, string culture)
Metode ekstensi Page<T>
secara efisien mendapatkan sejumlah item tertentu ( perPage
) pada posisi tertentu ( page
) dari ISearchResults
Examine . Batasan tipe opsional dapat ditambahkan untuk juga mengembalikan hasil halaman yang dimasukkan ke IPublishedContent
.
var query = searcher.CreatePublishedQuery();
var searchResults = query.Execute();
var results = searchResults.Page<T>(query, int page, int perPage, out int totalPages, out int totalResults);
Jumlah total halaman dan hasil diekspos sebagai parameter out
, namun dapat diabaikan jika tidak diperlukan seperti:
searchResults.Page<T>(query, int page, int perPage, out _, out _);
Seluruh kumpulan hasil dapat dimasukkan ke daftar jenis tertentu seperti ini:
var results = query.Execute().GetResults<T>();
Bidang tertentu dari hasil penelusuran individual dapat diakses melalui metode ekstensi .Value<T>()
seperti ini:
foreach (var result in query.Execute())
{
var value = result.Value<T>(string field);
}
Ekstensi Pencarian memperkenalkan beberapa jenis bidang baru ke dalam Examine – json
, list
, UDI
dan picker
– untuk memastikan data Umbraco diindeks dan dapat dikueri dengan benar.
Periksa memungkinkan pengontrolan bidang indeks, jenis bidang, dan lainnya, melalui pola Opsi Bernama .NET:
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("fieldName", "fieldType"));
}
}
}
Kelas opsi harus didaftarkan dalam wadah Injeksi Ketergantungan untuk menerapkan:
builder.Services.ConfigureOptions<ConfigureIndexOptions>();
Bidang "jalur" Umbraco secara otomatis diindeks sebagai daftar sehingga item konten dengan jalur -1,1050,1100
dapat ditanyakan seperti ini:
query.Field("path", "1100");
Bidang "createDate" dan "updateDate" Umbraco secara otomatis diindeks sebagai nilai date
, sedangkan bidang tersebut akan diindeks secara teratur sebagai nilai string.
Jenis bidang picker
menambahkan alias ramah pencarian untuk item yang dipilih ke dalam indeks.
Pemilih dengan item konten terpilih yang disebut "Halaman Contoh" dapat ditanyakan seperti ini:
query.Field("somePicker", "example-page");
Jenis bidang json
membagi properti objek JSON menjadi bidang individual dalam indeks.
Bayangkan sebuah bidang bernama "lokasi" memiliki nilai JSON berikut:
[
{
"city": "London",
"position": {
"latitude": 51.5074,
"longitude": 0.1278
}
},
{
"city": "New York",
"position": {
"latitude": 40.7128,
"longitude": 74.0060
}
}
]
Setiap properti akan dibuat sebagai bidang dalam indeks, termasuk properti bertingkat apa pun. Dalam contoh ini, ini akan disebut "locations_city", "locations_position_latitude" dan "locations_position_longitude".
Dimungkinkan untuk mengindeks subset properti objek JSON dengan menyediakan jalur dalam format Jalur JSON.
Daftarkan ValueTypeFactory
baru dalam indeks yang menerapkan tipe json
, dan tentukan jalur sebagai parameter, sebelum menetapkannya ke bidang:
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.IndexValueTypesFactory = new Dictionary<string, IFieldValueTypeFactory>(options.IndexValueTypesFactory)
{
["position"] = new DelegateFieldValueTypeFactory(fieldName =>
{
return new JsonValueType(fieldName, "$[*].position");
};
};
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("locations", "position"));
}
}
}
Ada kasus lanjutan yang mungkin memerlukan pengindeksan nilai sebagai beberapa jenis bidang, seperti mengindeks bagian berbeda dari objek JSON yang sama ke dalam bidang yang diberi nama secara terpisah atau mengindeks properti tertentu dalam objek JSON sebagai jenis yang ditentukan.
MultipleValueTypeFactory
menetapkan rangkaian tipe bidang ke suatu bidang dan menerapkannya secara berurutan:
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.IndexValueTypesFactory = new Dictionary<string, IFieldValueTypeFactory>(options.IndexValueTypesFactory)
{
["locationData"] = new DelegateFieldValueTypeFactory(fieldName =>
{
return new MultipleValueTypeFactory(
fieldName,
new IIndexFieldValueType[]
{
new JsonValueType(x, "$[*].city"),
new JsonValueType("position", "$[*].position")
}
);
};
};
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("locations", "locationData"));
}
}
}
Dalam contoh ini, objek JSON "lokasi" yang sama akan mencakup semua kota sementara bidang "posisi" yang sepenuhnya baru akan dibuat yang mencakup semua garis lintang dan garis bujur.
Untuk memunculkan bug baru, buat masalah di repositori GitHub. Untuk memperbaiki bug atau menambahkan fitur baru, fork repositori dan kirimkan permintaan penarikan dengan perubahan Anda. Jangan ragu untuk menambahkan ide ke daftar masalah repositori jika Anda ingin mendiskusikan apa pun yang berhubungan dengan perpustakaan.
Proyek ini dikelola oleh Callum Whyte dan kontributor. Jika Anda memiliki pertanyaan tentang proyek ini, silakan hubungi kami di Twitter, atau dengan menyampaikan masalah di GitHub.
Logo paket menggunakan ikon Kaca Pembesar dari Noun Project oleh Rohith MS, berlisensi CC BY 3.0 US.
Hak Cipta © 2024 Callum Whyte, dan kontributor lainnya
Berlisensi di bawah Lisensi MIT.