Orchard Core提供了Lucene功能,允许您在网站上进行全文搜索。
大多数情况下,在运行博客或简单的代理网站时,您可能需要在页面内容中进行搜索。
在Orchard Core中,您可以使用Liquid配置,要在Content Type索引哪些文本或数据。
在进一步讨论之前,请注意TheBlogTheme包含一个配方,该配方将在没有任何必要知识的情况下默认为您配置所有这些内容。
让我们看看我们如何一步一步地为您提供此服务。
第一步:在Orchard Core中启用Lucene功能
正如你在这里看到的,我们在Orchard Core中有3个不同的Lucene特性。
您需要启用“Lucene”功能才能创建Lucene索引。
第二步:创建Lucene索引
在Search下Index-->Lucene Indices菜单下,点击按钮Add Index。
显示
让我们来看看Lucene索引上有哪些可用选项:
索引名称用于标识您的索引。
它将在/App_Data/Sites/{YourTenantName}/Lucene/{IndexName}中创建一个文件夹,该文件夹将包含Lucene在索引时创建的所有文件。
第二个选项是用于此索引的Analyzer名称。
对于高级用户来说,分析仪是一种更复杂的功能。
它允许您在索引文本时微调文本的词干。
例如,当您搜索“CAR”时,当人们键入小写的“car”时,您可能也希望得到结果。
在这种情况下,分析器可以使用小写筛选器进行编程,该筛选器将对所有小写文本进行索引。
有关分析器的更多详细信息,请参阅Lucene.NET文档。
默认情况下,Orchard Core中的Analyzer名称只提供针对“English”区域性字符进行优化的标准Analyzer。
分析器是可扩展的,因此您可以通过使用Lucene.NET中提供的分析器之一或通过实现您自己的分析器来添加您自己的分析器。
可参看https://github.com/apache/lucenenet/tree/master/src/Lucene.Net.Analysis.Common/Analysis
例如,您可以使用以下示例通过依赖注入注册自定义分析器,该示例来自自定义模块中的Startup.cs文件:
using Microsoft.Extensions.DependencyInjection; using OrchardCore.Lucene.Model; using OrchardCore.Lucene.Services; using OrchardCore.Modules; namespace OrchardCore.Lucene.FrenchAnalyzer { [Feature("OrchardCore.Lucene.FrenchAnalyzer")] public class Startup : StartupBase { public override void ConfigureServices(IServiceCollection services) { services.Configure<LuceneOptions>(o => o.Analyzers.Add(new LuceneAnalyzer("frenchanalyzer", new MyAnalyzers.FrenchAnalyzer(LuceneSettings.DefaultVersion)))); } } }
第三个选择是文化。
默认情况下,将选择任何区域性。
这里,选择是为了能够定义该索引应该仅索引特定区域性的内容项或它们中的任何一个。
内容类型:您可以选择应该由该索引解析的任何内容类型。
索引最新版本:此选项将允许您仅索引已发布的项目或索引草稿,如果您想要在自定义前端仪表板或甚至在管理后端自定义模块中搜索内容项目,这可能会很有用。
默认情况下,如果我们不选中此选项,它将只索引已发布的内容项。
具体如下:
第三步:配置搜索设置
通过启用Lucene模块,我们还向/search添加了一个新的路由映射,这将需要一些设置才能正常工作。
创建新的Lucene索引后要做的第一件事是在Orchard Core中配置搜索设置。
在这里,我们可以定义网站上的/search页面应该使用哪个索引,也可以定义这个搜索页面应该使用哪些索引字段。
通常,我们默认使用Content.ContentItem.FullText。
第四步:设置索引权限
默认情况下,每个索引都是受权限保护的,因此如果您没有设置哪些索引应该是公共的,则没有人可以查询它们。
要使您网站上的匿名用户可以使用“BlogIndex”Lucene索引,您需要编辑此用户角色并向其添加权限。
每个索引都将在OrchardCore.Lucene功能部分中列出。
给匿名用户授权
接下来我们测试搜索页是否成功
从文件夹可以看出已经建立了Lucene索引内容。
通过/search访问搜索页面。
点击链接,可以看到使用了别名路由
搜索不存在的字符
在本例中,我使用了BlogTheme配方来自动配置所有内容。因此,上面的屏幕截图是该主题的搜索页面结果示例。
微调全文索引
在这里,我们可以看到Blog Post内容类型定义。
现在,我们为每种内容类型设置了一个部分,用于定义此内容项的哪一部分应作为全文的一部分进行索引。
默认情况下,内容项将索引“display text”和“body part”,但我们还为您添加了一个选项,让您自定义要作为此全文索引字段的一部分进行索引的值。
通过单击“使用自定义全文”,我们允许您设置任何流动脚本来执行此操作。
如示例所述,如果您还想通过副标题字段查找此内容项,则可以添加{{Model.Content.BlogPost.Subtitle.Text}}。
您可以使用Liquid字段执行许多操作:索引标识符、固定文本或数值等。
可选:索引模板自定义
此外,您还可以通过覆盖这些文件,根据主题中的特定需要自定义这些模板:
/Views/Shared/Search.liquid or .cshtml
(general layout)/Views/Search-Form.liquid or .cshtml
(form layout)/Views/Search-Results.liquid or .cshtml
(results layout)
例如,您可以通过将“Summary”更改为“SearchSummary”并创建相应的形状模板来简单地自定义搜索结果模板以满足您的需要。
SearchResults.liquid:
{% if Model.ContentItems != null and Model.ContentItems.size > 0 %} <ul class="list-group"> {% for item in Model.ContentItems %} <li class="list-group-item"> {{ item | shape_build_display: "SearchSummary" | shape_render }} </li> {% endfor %} </ul> {% elsif Model.Terms != null %} <p class="alert alert-warning">{{"There are no such results." | t }}</p> {% endif %}