
CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载在 Orchard Core 中搜索并不是某一个单一模块而是一套由索引基础设施Indexing、索引提供程序Lucene / Elasticsearch / Azure AI Search、**前端搜索模块Search与查询管理模块Queries**协同构成的完整技术栈。本篇指南以官方 Search 主题文档为骨架结合仓库源码与实际配置系统讲解如何定义要索引的信息、如何查询这些信息、如何为站点提供集成式搜索体验读完即可在真实站点上完成从启用功能、创建索引到上线搜索页的完整落地。1. Search 主题总览五大能力模块src/docs/topics/search/README.md是官方对搜索这一主题的入口文档它明确了两件事索引Indexing 词汇表中的定义先决定哪些数据需要被索引查询Query再决定如何查询这些索引从而提供集成的搜索体验integrated Search experience。围绕这一目标官方将内容组织为五个子主题本文即沿此骨架逐一展开子主题定位对应文档Indexing通用索引基础设施追加式任务日志索引的核心机制SQL Indexing基于数据库表的 SQL 索引与查询轻量级查询路径Lucene基于 Lucene.NET 的全文索引提供程序全文检索主力实现Queries查询的管理 UI 与 Web API统一的查询入口Full text search implementation7 步实战指南从零搭建站点全文搜索2. 索引基础设施OrchardCore.Indexing2.1 追加式任务日志与游标式接口索引模块对应文档 Indexing 参考是整个搜索体系的地基。它维护了一个只追加append-only的索引任务日志每条任务代表一次Update更新或Deletion删除按时间顺序形成变更记录并通过**游标式接口cursor-based interface**对外暴露。这样的设计使消费方可以按自己的节奏处理变更不会阻塞内容编辑实现自定义搜索管道、分析、审计或事件驱动工作流与外部系统同步、重建索引或响应特定数据事件。从源码结构看这套设计实现了索引基础设施与内容消费方之间的松散耦合内容项索引只是核心Indexing基础设施的一个消费方Content类别因此索引系统并不局限于内容项——用户记录、产品、外部 API 数据等任何文档都可以被索引。2.2 统一索引管理 UI 与内容项索引从 Orchard Core 3.0 开始索引模块在管理后台提供了统一界面Search Indexes支持创建与配置索引配置文件Index Profile重置Reset或重建Rebuild已有索引查看各提供程序专属选项配置要索引的数据类型例如内容类型。启用内容项索引后系统通过追加式任务日志跟踪内容项变更其他模块可用各自的游标位置消费该日志实现同步、分析、审计等自定义管道。2.3 索引自定义数据源若要索引非内容数据可实现以下三个接口源码位置src/OrchardCore.Modules/OrchardCore.Indexing及OrchardCore.Indexing.CoreIIndexManager控制索引任务如何被管理IIndexDocumentManager将实体转换为可索引文档IIndexNameProvider为索引配置文件提供名称。然后在Startup.cs中注册services.AddIndexingSourceCustomSourceIndexManager, CustomSourceDocumentIndexManager, CustomSourceIndexNameProvider( ProviderName, // 例如 Lucene、Elasticsearch、AzureAISearch CustomCategory, // 唯一的源类别名 o { o.DisplayName S[Custom Source in Provider]; o.Description S[Creates an index for a custom data source using the selected provider.]; });如需后台 UI 集成可继承DisplayDriverIndexProfile提供配置界面或实现IIndexProfileHandler响应索引的创建、更新、删除生命周期事件。2.4 索引相关的 Recipe 步骤索引配置文件可以在 Recipe 执行期间创建。官方推荐使用CreateOrUpdateIndexProfile步骤对应源码src/OrchardCore.Indexing.Core中的 Recipe 执行器{ steps:[ { name:CreateOrUpdateIndexProfile, indexes: [ { Id: The id, Name: UniqueName, IndexName: blogposts, ProviderName: ProviderName, Type: Content, Properties: { ContentIndexMetadata: { IndexLatest: false, IndexedContentTypes: [BlogPosts], Culture: any } } } ] } ] }注意要索引内容项请使用内置的Content类别以保证与内容索引 UI 和配置体验完全兼容。**重置Reset与重建Rebuild**是两种常见的生命周期操作二者都在后台异步执行、不阻塞其他操作ResetIndex从头重启索引过程以更新当前内容项保留已有条目只补充新增/更新的内容RebuildIndex删除并重建整个索引从零开始填充。{ steps:[ { name:ResetIndex, indexNames:[IndexName1,IndexName2] } ] }若要作用于所有索引改用IncludeAll: trueRebuildIndex步骤结构与ResetIndex完全一致仅步骤名不同。3. 前端搜索模块OrchardCore.Search3.1 模块职责边界OrchardCore.Search模块对应文档 Search 参考只提供面向用户的搜索 UI搜索页 搜索表单索引本身由Indexing基础设施配合提供程序Lucene、Elasticsearch 或 Azure AI Search创建与管理。因此使用前提是启用OrchardCore.Search及至少一个提供程序功能并创建一个索引配置文件。3.2 搜索路由与参数模块注册了搜索端点源码见 SearchController.cs/search/{index?}index可选要查询的索引配置文件名称省略时使用搜索设置中的默认索引terms搜索词通过查询字符串传递例如/search?termsorchard。边界行为未指定索引且未配置默认索引时页面显示警告提示No default search index has been configured.请求的索引不存在时返回404。结果按站点配置的页面大小分页并自动生成上一页 / 下一页链接。从 SearchController.cs 的源码可以确认分页实现查询时会多取一条PageSize 1用于判断是否还有更多结果并通过PagerSlim的Before/After参数计算游标命中后先由提供程序返回ContentItemIds再通过ContentItemIndex按Published或Latest取决于索引是否包含草稿回查数据库最后按搜索结果的原始顺序重新排序展示。3.3 站点搜索设置在后台Search Settings Site Search需要Manage Search Settings权限中可配置三项设置对应源码 SearchSettingsViewModel.cs设置项说明DefaultIndexProfileNameURL 中未指定索引时默认查询的索引配置文件PageTitle搜索结果页显示的标题Placeholder搜索输入框中的占位提示文本支持数据本地化这些设置可通过Search Settings 部署步骤SearchSettingsDeploymentStep源码位于 Deployment 目录随部署计划导出与导入。3.4 权限模型权限说明Manage Search Settings允许配置站点搜索设置Query Search Index允许查询搜索索引按索引配置文件单独授权两项权限默认授予Administrator角色。要让匿名用户或其他角色使用搜索页需为对应索引配置文件授予Query Search Index权限在角色编辑页的OrchardCore.Lucene Feature等分区中可见。3.5 搜索表单与主题定制模块内置SearchFormPart与Search Form部件可将搜索框放在任意位置如某个 Layer 区域或页面表单以GET提交到/search端点并携带Terms参数。搜索 UI 全部通过 Shape 渲染可在主题中覆盖模板Shape模板用途SearchSearch.cshtml整体搜索页Search-FormSearch-Form.cshtml搜索输入表单Search-ResultsSearch-Results.cshtml结果列表Search-ListSearch-List.cshtml结果项容器当底层提供程序返回高亮信息时结果页还会呈现高亮标记。4. 全文本搜索实施指南7 步实战src/docs/guides/implement-fulltext-search/README.md提供了一份面向真实站点的完整落地步骤。以下步骤以Lucene为例编写同样的目标用Elasticsearch也能实现此外TheBlogTheme内置的 Recipe 会自动完成全部配置无需手工操作。第 1 步启用 Lucene 或 Elasticsearch 功能Orchard Core 中Lucene与Elasticsearch各有若干功能项。要创建Lucene索引需启用Lucene功能要创建Elasticsearch索引需启用Elasticsearch功能。第 2 步创建索引点击Add Index打开创建表单主要选项如下Index Name索引名称用于标识索引。创建后会在/App_Data/Sites/{YourTenantName}/Lucene/{IndexName}生成目录存放 Lucene 索引过程产生的全部文件。Analyzer Name分析器名称面向高级用户用于微调文本在索引时的词干化stemming处理。例如搜索 Car 时也希望命中小写的 car可配置带小写过滤器的分析器。Orchard Core 默认仅提供standardanalyzer针对英文文化字符优化分析器可扩展——既可使用 Lucene.NET 自带的分析器也可自行实现并注册。Culture文化默认Any culture可限定索引只处理特定文化的内容项。Content Types内容类型选择本索引要解析的内容类型。Index latest version索引最新版本勾选后除已发布项外还会索引草稿适合自定义前端仪表板或后台模块内的搜索默认不勾选只索引已发布内容项。Store source data仅 Elasticsearch默认开启控制是否在 Elasticsearch 的_source字段中存储原始数据。注册自定义分析器的官方示例在自定义模块的Startup.cs中通过 DI 注册using Microsoft.Extensions.DependencyInjection; using OrchardCore.Lucene.Model; using OrchardCore.Lucene.Services; using OrchardCore.Modules; namespace OrchardCore.Lucene.FrenchAnalyzer { [Feature(OrchardCore.Lucene.FrenchAnalyzer)] public sealed class Startup : StartupBase { public override void ConfigureServices(IServiceCollection services) { services.ConfigureLuceneOptions(o o.Analyzers.Add(new LuceneAnalyzer(frenchanalyzer, new MyAnalyzers.FrenchAnalyzer(LuceneSettings.DefaultVersion)))); } } }这与仓库中的实现完全吻合Lucene 模块的 Startup.cs 正是通过services.ConfigureLuceneOptions(o o.Analyzers.Add(new LuceneAnalyzer(LuceneConstants.DefaultAnalyzer, new StandardAnalyzer(LuceneConstants.DefaultVersion))))注册默认的standardanalyzer。第 3 步配置搜索设置启用Lucene模块后站点会新增/search路由映射需要相应设置才能工作。创建索引后应第一时间到后台配置指定/search页面使用的索引以及该搜索页查询的索引字段——通常默认使用Content.ContentItem.FullText。第 4 步设置索引权限默认情况下每个索引都有权限保护未显式放开的索引任何人都无法查询。要让 Search 索引对站点Anonymous匿名用户开放需编辑该角色并在OrchardCore.Lucene Feature分区中为对应索引勾选查询权限——每个索引都会在此列出。第 5 步设置搜索提供程序从 Orchard Core 1.5 起可通过Search功能启用站点前端搜索启用后会新增后台菜单项用于选择前端搜索使用的索引提供程序Lucene或Elasticsearch。第 6 步测试搜索页以TheBlogTheme的 Recipe 为例其已自动完成全部配置搜索页可直接返回结果第 7 步细调全文本搜索每个内容类型定义中都有该内容项哪些部分应作为FullText被索引的配置区。默认索引显示文本display text与正文部件body part但可通过Use custom full-text选项自定义要索引的内容填写任意 Liquid 脚本。例如追加索引副标题字段{{ Model.Content.BlogPost.Subtitle.Text }}利用自定义 FullText 还可以把 Widget 或 Bag 的内容纳入全文索引例如 FlowPart 内的 Widget{% for contentItem in Model.Content.FlowPart.Widgets %} {{ contentItem | full_text }} {% endfor %}或简写为{{ Model.Content.FlowPart.Widgets | full_text }}可选搜索模板定制可在主题中覆盖以下模板文件/Views/Shared/Search.liquid或.cshtml整体布局/Views/Search-Form.liquid或.cshtml表单布局/Views/Search-Results.liquid或.cshtml结果布局例如把结果模板中的Summary换成SearchSummary并创建对应 Shape 模板{% if Model.ContentItems ! null and Model.ContentItems.size 0 %} ul classlist-group {% for item in Model.ContentItems %} li classlist-group-item {{ item | shape_build_display: SearchSummary | shape_render }} /li {% endfor %} /ul {% elsif Model.Terms ! null %} p classalert alert-warning{{There are no such results. | t }}/p {% endif %}5. 查询层OrchardCore.Queries与搜索 API5.1 Queries 模块查询模块对应文档 Queries 参考为查询数据提供管理 UI 与 API并支持自定义查询源Query Source创建继承自Query的类表示新查询所需的状态创建实现IQuerySource的类以暴露新查询类型例如services.AddScopedIQuerySource, LuceneQuerySource();通过继承DisplayDriverQuery, LuceneQuery提供查询编辑器查询类型列表界面使用 ShapeQuery_Link__[QuerySource]例如源为Lucene时对应模板Query-Lucene.Link.cshtml。Recipe 中可用queries步骤创建查询{ name: queries, Queries: [ { Name: AwesomeQuery, Source: Lucene, // 具体查询类型的属性 ... }] }5.2 Web APIQueries 模块暴露通用查询端点api/queries/{name}支持POST与GET参数示例说明namemyQuery要执行的查询名称parameters{ size: 3 }查询参数的 JSON 对象Lucene 模块另提供两个专用端点对应文档 Lucene 参考 的 Web APIs 章节api/lucene/content执行指定名称的查询并返回对应内容项api/lucene/documents执行指定名称的查询并返回 Lucene 文档仅返回已存储字段。两者均支持POST/GET参数一致参数示例说明indexNamesearch要查询的索引名称query{ query: { match_all: {} }, size: 10 }表示查询的 JSON 对象parameters{ size: 3 }查询参数 JSON 对象Lucene 查询使用Elasticsearch Query DSL语法编写若要通过 GraphQL 暴露查询需定义返回类型 schema——返回ContentItem如BlogPost时勾选Return Content Items并配置{ type: ContentItem/BlogPost }。5.3 Lucene 的 Recipe 与索引同步旧版lucene-index/LuceneIndexSettings步骤仍可创建索引但官方已标注弃用推荐改用CreateOrUpdateIndexProfile{ steps:[ { name:CreateOrUpdateIndexProfile, indexes: [ { Name: BlogPostsLucene, IndexName: blogposts, ProviderName: Lucene, Type: Content, Properties: { ContentIndexMetadata: { IndexLatest: false, IndexedContentTypes: [BlogPosts], Culture: any }, LuceneIndexMetadata: { AnalyzerName: standard, StoreSourceData: true } } } ] } ] }此外OrchardCore.Search.Lucene.Worker是一个旧版兼容功能它创建后台任务让本机文件系统索引与可能各自持有本地索引的其他实例保持同步。官方建议仅在同一租户运行于多实例farm且使用 Lucene 文件系统索引时启用若运行在 Azure App Services 或使用 Elasticsearch 则无需此功能。6. SQL 索引OrchardCore.SQLIndexing与字段级索引表如果不依赖外部全文搜索引擎还可以直接查询数据库索引表对应文档 SQL Indexing 参考。6.1 内容项索引表ContentItemIndex是查询内容项的核心表列名类型非空主键IdinttruetrueDocumentIdintfalsefalseContentItemIdnvarchar(26)falsefalsePublishedbitfalsefalseLatestbitfalsefalseModifiedUtcdatetimefalsefalsePublishedUtcdatetimefalsefalseCreatedUtcdatetimefalsefalseOwnernvarchar(255)falsefalseAuthornvarchar(255)falsefalseDisplayTextnvarchar(255)falsefalse多语言环境下另有LocalizedContentItemIndex在基础列之上追加LocalizationSetnvarchar与Culturenvarchar两列。6.2 内容字段索引表OrchardCore.ContentFields.Indexing.SQL模块为内容字段提供数据库索引。以BooleanFieldIndex为例它在公共列DocumentId、ContentItemId、ContentItemVersionId、ContentType、ContentPart、ContentField、Published、Latest之外附加字段值列Booleanbit。ContentPickerFieldIndex则提供SelectedContentItemIdnvarchar(26)列DateFieldIndex提供日期列。注意表中列出的类型为SQL Server 数据类型SQLite 的文本字段无长度限制。这些索引表可直接用 SQL 查询是轻量级、无外部搜索引擎依赖的检索路径。7. 串联全链路从内容项到搜索结果结合以上模块与源码一次搜索请求的完整链路可归纳为索引写入内容项保存时OrchardCore.Indexing的追加式任务日志记录Update/DeletionLucene / Elasticsearch 等提供程序按游标消费日志把内容项转换后的文档写入索引Lucene 落盘到App_Data/Sites/{Tenant}/Lucene/{IndexName}Elasticsearch 写入远端集群。搜索请求用户提交GET /search?terms...SearchController.cs 解析 URL 中的索引名或回退到默认索引校验Query Search Index权限再通过ISearchService按提供程序名从 DI 取键控服务如LuceneSearchService执行查询。结果组装提供程序返回按相关性排序的ContentItemIds与高亮信息控制器按Published/Latest回查ContentItemIndex按搜索顺序重排用PagerSlim生成分页链接最终渲染Search/Search-Results等 Shape 模板。8. 总结与选型建议路径适用场景核心文档Lucene本地文件索引单实例站点、开箱即用的全文检索、无外部依赖LuceneElasticsearch多实例、大规模内容、需要集群与高可用ElasticsearchAzure AI Search依托 Azure 云服务的托管搜索AzureAISearchSQL 索引查询轻量查询、字段级过滤、无需全文引擎SQL Indexing无论选择哪种提供程序思考路径都是一致的先用Indexing定义索引什么再用提供程序决定存到哪、怎么分词最后用Search模块与Queries模块决定怎么查、怎么展示。对于绝大多数内容站点直接参照第 4 节的七步指南或直接使用TheBlogTheme的 Recipe即可在最短时间内获得可用的全文本搜索体验。赞分享CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载相关推荐RestKit Core Data 全文搜索RKSearchIndexer 索引构建、RKSearchPredicate 查询与性能优化实战指南RestKit Core Data 全文搜索RKSearchIndexer 索引构建、RKSearchPredicate 查询与性能优化实战指南 RestKi移动开发网络gin-vue-admin搜索引擎全文搜索与模糊查询gin vue admin搜索引擎全文搜索与模糊查询 引言 在现代化的后台管理系统中高效的数据检索功能是提升用户体验的关键。gin vue admin作为一后端前端认证鉴权低代码任务调度Apache SeaTunnel Web UI打开浏览器5分钟看清数据同步作业在干什么 完整指南Apache SeaTunnel Web UI打开浏览器5分钟看清数据同步作业在干什么 完整指南 上次一个千万行的同步作业跑到一半卡住我翻了一下午日志才定数据集成ETL大数据批处理流处理变更数据捕获上一篇解锁智慧教育平台5分钟掌握电子课本PDF下载终极方案下一篇Go 语言基础变量、常量、内置类型与 array/slice/map 详解《Build Web Application with Golang》2.2 节创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考