هذه الحزمة مدعومة على Umbraco v9-v13 وv14
ملحقات البحث متاحة عبر NuGet.
للتثبيت باستخدام .NET CLI، قم بتشغيل الأمر التالي:
$ dotnet add package Our.Umbraco.Extensions.Search
للتثبيت من داخل Visual Studio، استخدم واجهة مستخدم NuGet Package Manager أو قم بتشغيل الأمر التالي:
PM> Install-Package Our.Umbraco.Extensions.Search
هناك العديد من طرق الامتداد المختصرة للاستعلام عن محتوى Umbraco في الفهرس - التحقق مما إذا كان العنصر منشورًا أو مرئيًا أو يحتوي على قالب.
يمكن إجراء الاستعلام عن عناصر المحتوى المنشورة فقط على النحو التالي:
query.And().IsPublished()
وبالمثل، يمكن إجراء الاستعلام عن كافة المحتويات التي لم يتم تعيين خاصية umbracoNaviHide
بها على النحو التالي:
query.And().IsVisible()
من الممكن الاستعلام عن المحتوى باستخدام مجموعة معرفات قالب محددة. إذا تم تمرير 0
أو لم يتم تمرير أي قيمة إلى الطريقة، فسيطابق الاستعلام المحتوى مع أي مجموعة معرفات قالب.
query.And().HasTemplate(int templateId)
وأخيرًا، من الممكن الاستعلام عن المحتوى الذي يحتوي على أي من الأسماء المستعارة لنوع المحتوى المحدد. يدعم Umbraco الاستعلام عن اسم مستعار واحد للمحتوى.
query.And().NodeTypeAlias(string[] aliases)
تتم فهرسة خصائص Umbraco التي تم تعيينها على "تختلف حسب الثقافة" باستخدام اسم مستعار محدد: {fieldName}_{culture}
. على سبيل المثال، إذا كان الحقل "pageTitle" يختلف حسب الثقافة ويحتوي على لغتين، الإنجليزية والإسبانية، فسيحتوي الفهرس على حقلين: pageTitle_en
و pageTitle_es
.
يمكن تمرير الثقافة إلى استعلامات Field
و NodeName
مثل هذا:
query.And().Field(string field, string culture)
query.And().NodeName(string nodeName, string culture)
كما أنه يعمل مع الاستعلامات المجمعة مثل GroupedAnd
و GroupedOr
و GroupedNot
، حيث يمكن تحديد حقول متعددة:
query.And().GroupedOr(string[] fields, string culture)
تحصل طرق الامتداد Page<T>
بكفاءة على عدد معين من العناصر ( perPage
) في موضع معين ( page
) من ISearchResults
الخاص بـ Examine. يمكن إضافة قيد نوع اختياري لإرجاع النتائج المقسمة إلى صفحات والتي تم إرسالها إلى 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);
يتم عرض العدد الإجمالي للصفحات والنتائج كمعلمة out
، ولكن يمكن تجاهلها إذا لم تكن هناك حاجة إليها كما يلي:
searchResults.Page<T>(query, int page, int perPage, out _, out _);
يمكن إرسال مجموعة النتائج بأكملها إلى قائمة من نوع معين مثل هذا:
var results = query.Execute().GetResults<T>();
يمكن الوصول إلى حقول محددة من نتيجة بحث فردية عبر طريقة الامتداد .Value<T>()
مثل هذا:
foreach (var result in query.Execute())
{
var value = result.Value<T>(string field);
}
تقدم ملحقات البحث العديد من أنواع الحقول الجديدة في Examine - json
و list
و UDI
و picker
- لضمان فهرسة بيانات Umbraco بشكل صحيح وإمكانية الاستعلام عنها.
يسمح الفحص بالتحكم في حقول الفهرس، وأنواع الحقول، والمزيد، عبر نمط الخيارات المسماة لـ .NET:
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("fieldName", "fieldType"));
}
}
}
يجب تسجيل فئة الخيارات في حاوية حقن التبعية لتطبيقها:
builder.Services.ConfigureOptions<ConfigureIndexOptions>();
تتم فهرسة حقل "المسار" الخاص بـ Umbraco تلقائيًا كقائمة وبالتالي يمكن الاستعلام عن عنصر المحتوى بالمسار -1,1050,1100
على النحو التالي:
query.Field("path", "1100");
تتم فهرسة حقول "createDate" و"updateDate" الخاصة بشركة Umbraco تلقائيًا كقيم date
، بينما تتم فهرستها بانتظام كقيم سلسلة.
يضيف نوع حقل picker
أسماء مستعارة سهلة البحث للعناصر المنتقاة في الفهرس.
يمكن الاستعلام عن منتقي يحتوي على عنصر محتوى محدد يسمى "صفحة نموذجية" على النحو التالي:
query.Field("somePicker", "example-page");
يقوم نوع الحقل json
بتقسيم خصائص كائن JSON إلى حقول فردية داخل الفهرس.
تخيل أن حقلاً يسمى "المواقع" يحتوي على قيمة JSON التالية:
[
{
"city": "London",
"position": {
"latitude": 51.5074,
"longitude": 0.1278
}
},
{
"city": "New York",
"position": {
"latitude": 40.7128,
"longitude": 74.0060
}
}
]
سيتم إنشاء كل خاصية كحقل في الفهرس، بما في ذلك أي خصائص متداخلة. في هذا المثال، سيتم تسميتها "locations_city" و"locations_position_latitude" و"locations_position_longitude".
من الممكن فهرسة مجموعة فرعية من خصائص كائن JSON عن طريق توفير مسار بتنسيق مسار JSON.
قم بتسجيل ValueTypeFactory
جديد في الفهرس الذي يقوم بتنفيذ نوع json
، وحدد المسار كمعلمة، قبل تعيينه إلى حقل:
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"));
}
}
}
هناك حالات متقدمة حيث قد يكون من الضروري فهرسة قيمة كأنواع حقول متعددة، مثل فهرسة أجزاء مختلفة من نفس كائن JSON في حقول مسماة بشكل منفصل أو فهرسة خصائص محددة داخل كائن JSON كنوع محدد.
يقوم MultipleValueTypeFactory
بتعيين سلسلة من أنواع الحقول للحقل وتطبيقها بالتسلسل:
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"));
}
}
}
في هذا المثال، سيتضمن نفس كائن JSON "المواقع" جميع المدن بينما سيتم إنشاء حقل "الموقع" الجديد تمامًا بما في ذلك جميع خطوط الطول والعرض.
لإثارة خطأ جديد، قم بإنشاء مشكلة في مستودع GitHub. لإصلاح خطأ ما أو إضافة ميزات جديدة، قم بتقسيم المستودع وأرسل طلب سحب يتضمن تغييراتك. لا تتردد في إضافة أفكار إلى قائمة مشكلات المستودع إذا كنت ترغب في مناقشة أي شيء متعلق بالمكتبة.
تتم صيانة هذا المشروع بواسطة Callum Whyte والمساهمين. إذا كانت لديك أي أسئلة حول المشروع، فيرجى التواصل معنا على Twitter، أو عن طريق إثارة مشكلة على GitHub.
يستخدم شعار الحزمة أيقونة Magnifying Glass من Noun Project بواسطة Rohith MS، المرخص بموجب CC BY 3.0 US.
حقوق الطبع والنشر © 2024 كالوم وايت، والمساهمين الآخرين
مرخص بموجب ترخيص MIT.