Umbraco v9-v13 和 v14 支援此軟體包
搜尋擴充功能可透過 NuGet 取得。
若要使用 .NET CLI 安裝,請執行下列命令:
$ dotnet add package Our.Umbraco.Extensions.Search
若要從 Visual Studio 中安裝,請使用 NuGet 套件管理器 UI 或執行下列命令:
PM> Install-Package Our.Umbraco.Extensions.Search
有多種快捷擴充方法可用於查詢索引中的 Umbraco 內容 - 檢查項目是否已發佈、是否可見或是否具有範本。
僅查詢已發佈的內容項目可以這樣完成:
query.And().IsPublished()
同樣,查詢所有未設定umbracoNaviHide
屬性的內容可以這樣完成:
query.And().IsVisible()
可以查詢具有特定範本 ID 集的內容。如果0
或沒有值傳遞給該方法,查詢將與任何範本 ID 集匹配內容。
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>
擴充方法有效地從 Examine 的ISearchResults
取得特定位置( page
)處給定數量的項目( perPage
) 。可以新增可選的類型約束,以便將分頁結果也回到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);
}
Search Extensions 在 Examine 中引入了幾種新的欄位類型 - json
、 list
、 UDI
和picker
- 以確保 Umbraco 資料正確索引和可查詢。
Examination 允許透過 .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");
Umbraco 的「createDate」和「updateDate」欄位會自動索引為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 物件屬性的子集。
在實作json
類型的索引中註冊一個新的ValueTypeFactory
,並將路徑定義為參數,然後將其指派給欄位:
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 上提出問題。
包標誌使用來自 Rohith MS 的 Noun Project 的放大鏡圖標,並獲得 CC BY 3.0 US 許可。
版權所有 © 2024 Callum Whyte 和其他貢獻者
根據 MIT 許可證獲得許可。