แพ็คเกจนี้รองรับบน Umbraco v9-v13 และ v14
ส่วนขยายการค้นหามีให้ใช้งานผ่าน NuGet
หากต้องการติดตั้งด้วย .NET CLI ให้รันคำสั่งต่อไปนี้:
$ dotnet add package Our.Umbraco.Extensions.Search
หากต้องการติดตั้งจากภายใน Visual Studio ให้ใช้ NuGet Package Manager UI หรือรันคำสั่งต่อไปนี้:
PM> Install-Package Our.Umbraco.Extensions.Search
มีวิธีการขยายแบบสั้นหลายวิธีสำหรับการสืบค้นเนื้อหา Umbraco ในดัชนี โดยตรวจสอบว่ารายการนั้นเผยแพร่ มองเห็นได้ หรือมีเทมเพลตหรือไม่
การเคียวรีเฉพาะรายการเนื้อหาที่เผยแพร่สามารถทำได้ดังนี้:
query.And().IsPublished()
ในทำนองเดียวกัน การสืบค้นเนื้อหาทั้งหมดที่ ไม่ได้ ตั้งค่าคุณสมบัติ umbracoNaviHide
สามารถทำได้ดังนี้:
query.And().IsVisible()
เป็นไปได้ที่จะสืบค้นเนื้อหาด้วยชุด ID เทมเพลตเฉพาะ ถ้าค่า 0
หรือไม่ถูกส่งไปที่เมธอด การสืบค้นจะจับคู่เนื้อหากับชุด ID templatee ใดๆ
query.And().HasTemplate(int templateId)
สุดท้ายนี้ เป็นไปได้ที่จะสืบค้นเนื้อหาที่มีนามแฝงประเภทเนื้อหาที่ระบุ อย่างใดอย่าง หนึ่ง ทันทีที่แกะกล่อง Umbraco รองรับการสืบค้นสำหรับนามแฝงเนื้อหาเดียว
query.And().NodeTypeAlias(string[] aliases)
คุณสมบัติ Umbraco ที่ตั้งค่าเป็น "แตกต่างกันไปตามวัฒนธรรม" จะได้รับการจัดทำดัชนีด้วยนามแฝงเฉพาะ: {fieldName}_{culture}
ตัวอย่างเช่น หากช่อง "pageTitle" แตกต่างกันไปตามวัฒนธรรมและมี 2 ภาษา ได้แก่ อังกฤษและสเปน ดัชนีจะมี 2 ช่อง ได้แก่ 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 ได้รับการจัดทำดัชนีและสามารถสืบค้นได้อย่างถูกต้อง
ตรวจสอบช่วยให้สามารถควบคุมฟิลด์ของดัชนี ประเภทฟิลด์ และอื่นๆ ผ่านรูปแบบ Named Options ของ .NET:
public class ConfigureIndexOptions : IConfigureNamedOptions<LuceneDirectoryIndexOptions>
{
public void Configure(string name, LuceneDirectoryIndexOptions options)
{
if (name == "ExternalIndex")
{
options.FieldDefinitions.AddOrUpdate(new FieldDefinition("fieldName", "fieldType"));
}
}
}
คลาสตัวเลือกจะต้องลงทะเบียนในคอนเทนเนอร์ Dependency Injection เพื่อนำไปใช้:
builder.Services.ConfigureOptions<ConfigureIndexOptions>();
ช่อง "เส้นทาง" ของ Umbraco ได้รับการจัดทำดัชนีเป็นรายการโดยอัตโนมัติ ดังนั้นรายการเนื้อหาที่มีเส้นทาง -1,1050,1100
จึงสามารถสอบถามได้ดังนี้:
query.Field("path", "1100");
ช่อง "createDate" และ "updateDate" ของ Umbraco จะได้รับการจัดทำดัชนีเป็นค่า date
โดยอัตโนมัติ ในขณะที่ช่องเหล่านั้นจะได้รับการจัดทำดัชนีเป็นประจำเป็นค่าสตริง
ประเภทฟิลด์ picker
จะเพิ่มนามแฝงที่ง่ายต่อการค้นหาสำหรับรายการที่เลือกลงในดัชนี
ตัวเลือกที่มีรายการเนื้อหาที่เลือกเรียกว่า "หน้าตัวอย่าง" สามารถสอบถามได้ดังนี้:
query.Field("somePicker", "example-page");
ประเภทฟิลด์ json
แบ่งคุณสมบัติของออบเจ็กต์ JSON ออกเป็นแต่ละฟิลด์ภายในดัชนี
ลองนึกภาพฟิลด์ชื่อ "locations" มีค่า 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
โลโก้บรรจุภัณฑ์ใช้ไอคอนแว่นขยายจาก Noun Project โดย Rohith MS ซึ่งได้รับอนุญาตภายใต้ CC BY 3.0 US
ลิขสิทธิ์ © 2024 Callum Whyte และผู้มีส่วนร่วมอื่นๆ
ได้รับอนุญาตภายใต้ใบอนุญาต MIT