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 许可证获得许可。