ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Orchard Core SQL Indexing 实战指南:内容项与内容字段的数据库索引表详解及查询用法

Orchard Core SQL Indexing 实战指南:内容项与内容字段的数据库索引表详解及查询用法 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 的SQL Indexing能力展开系统梳理内容项索引ContentItemIndex、LocalizedContentItemIndex与内容字段索引TextFieldIndex、NumericFieldIndex、BooleanFieldIndex等的数据库表结构与列定义并给出从 C# 类、Razor 模板、Liquid 模板到 GraphQL 的完整查询示例。读者学完后将能够在 Orchard Core 应用中直接基于 SQL 索引表高效检索内容项与动态内容字段并理解这些索引表在源码中的生成机制。SQL 索引在 Orchard Core 中的作用Orchard Core 基于 YesSql 将文档Document与索引Index分离存储内容项本身以 JSON 文档形式保存而便于查询的扁平化字段则被投影到独立的 SQL 索引表中。SQL Indexing 指的就是这套可被 SQL 直接查询的索引体系它让开发者摆脱对文档内部结构的解析直接通过标准 SQL 语句或 YesSql 的ISession.QueryAPI 检索数据。在仓库中索引的生成由IndexProvider完成例如 ContentItemIndexProvider 继承IndexProviderContentItem通过Map方法将内容项属性投影为索引行并对超长字段如ContentType、Owner、Author、DisplayText按MaxContentTypeSize 255等常量截断这正是下文表格中nvarchar(255)列宽的直接来源。内容项索引表Content Item Indexing内容项索引由OrchardCore.ContentManagement模块提供包含两张核心表ContentItemIndex与LocalizedContentItemIndex。ContentItemIndexContentItemIndex是内容项最基础的索引表其列定义如下对应源码 ContentItemIndex.cs名称类型非空主键IdinttruetrueDocumentIdintfalsefalseContentItemIdnvarchar(26)falsefalsePublishedbitfalsefalseLatestbitfalsefalseModifiedUtcdatetimefalsefalsePublishedUtcdatetimefalsefalseCreatedUtcdatetimefalsefalseOwnernvarchar(255)falsefalseAuthornvarchar(255)falsefalseDisplayTextnvarchar(255)falsefalse各列语义说明Id索引行自增主键。DocumentId指向 YesSql 文档表的文档 ID通过它可将索引行关联回完整的内容项 JSON 文档。ContentItemId内容项 ID26 字符的短 ID。注意此表未包含ContentItemVersionId版本 ID如需按版本查询可参考字段索引表。Published/Latest是否已发布 / 是否为最新版本二者均为布尔位。在 Orchard Core 中同一内容项可能存在多个版本Latest true标记最新草稿版本Published true标记当前已发布版本。ModifiedUtc、PublishedUtc、CreatedUtc修改、发布、创建时间均以 UTC 存储。Owner/Author内容项所有者与作者的用户标识长度上限 255 字符。DisplayText内容项的显示文本通常用于列表与搜索长度上限 255 字符。从源码 ContentItemIndexProvider 可以看到该索引由内容项直接映射生成并在写入前对超长文本进行截断处理因此查询时应以 255 字符内的前缀匹配为主。LocalizedContentItemIndex当启用内容本地化OrchardCore.ContentLocalization时会额外维护LocalizedContentItemIndex其定义见 LocalizedContentItemIndex.cs名称类型非空主键IdinttruetrueDocumentIdintfalsefalseContentItemIdnvarchar(26)falsefalsePublishedbitfalsefalseLatestbitfalsefalseLocalizationSetnvarcharfalsefalseCulturenvarcharfalsefalse相比ContentItemIndex该表额外提供两个关键列LocalizationSet本地化集合标识。同一内容的多语言版本共享同一个LocalizationSet值用于把各语言版本归组。Culture文化/语言标识如en、zh-CN。实际使用中最常见的查询模式是取某个本地化集合中指定文化且已发布的最新版本即同时过滤LocalizationSet、Culture、Published与Latest四个条件。内容字段索引表Content Fields IndexingOrchardCore.ContentFields.Indexing.SQL模块为内容字段提供数据库级索引将字段值从内容 JSON 中抽出并投影为独立的索引表。注意下表中的类型均为 SQL Server 数据类型SQLite 对文本字段没有长度限制因此在 SQLite 环境下nvarchar(255)等长度约束不会强制生效。字段索引表共享一组相同的元数据列之后仅列出各自的业务值列。公共列包括名称类型非空主键IdinttruetrueDocumentIdintfalsefalseContentItemIdnvarchar(26)falsefalseContentItemVersionIdnvarchar(26)falsefalseContentTypenvarchar(255)falsefalseContentPartnvarchar(255)falsefalseContentFieldnvarchar(255)falsefalsePublishedbitfalsefalseLatestbitfalsefalse其中ContentType、ContentPart、ContentField三列分别记录字段所属的内容类型、内容部件与字段名称是定位哪个字段的核心条件Published/Latest用于过滤版本状态ContentItemVersionId相比内容项索引多出了版本级定位能力。BooleanFieldIndex布尔字段名称类型BooleanbitContentPickerFieldIndex内容选择器字段名称类型SelectedContentItemIdnvarchar(26)SelectedContentItemId存储被选中内容项的 ID可用于反向查找引用了某内容项的所有内容。DateFieldIndex日期字段名称类型DatedatetimeDateTimeFieldIndex日期时间字段名称类型DateTimedatetimeHtmlFieldIndexHTML 字段名称类型Htmlnvarchar(max)HTML 内容长度不可控因此使用nvarchar(max)存储全文。LinkFieldIndex链接字段名称类型Urlnvarchar(766)BigUrlnvarchar(max)Textnvarchar(766)BigTextnvarchar(max)链接字段同时提供普通列与Big前缀列短文本落入Url/Text766 字符内超长内容落入BigUrl/BigText查询时按实际数据量选择列。MultiTextFieldIndex多文本字段名称类型Valuenvarchar(766)BigValuenvarchar(max)NumericFieldIndex数字字段名称类型Numericdecimal(19,5)decimal(19,5)提供最高 14 位整数与 5 位小数的精度适合金额、数量等场景的范围查询。TextFieldIndex文本字段名称类型Textnvarchar(766)BigTextnvarchar(max)TextFieldIndex是最常用的一张字段索引表下文所有查询示例均以它为例。TimeFieldIndex时间字段名称类型TimedatetimeUserPickerFieldIndex用户选择器字段名称类型SelectedUserIdstring存储被选中的用户 ID用于按用户检索其关联的内容。使用方式从代码查询索引表使用前请先查看各索引表确认可查询的列。以下示例均针对TextFieldIndex。从 C# 类中查询在任意类中注入ISession通过 YesSql 泛型查询将索引行关联回ContentItemusing OrchardCore.ContentManagement; using OrchardCore.ContentFields.Indexing; public class MyClass() { private readonly ISession _session; public MyClass(ISession session) { _session session; } public async TaskIEnumerableContentItem GetTextFieldIndexRecords(string contentType, string contentField) { return await _session.QueryContentItem, TextFieldIndex(x x.ContentType contentType x.ContentField contentField).ListAsync(); } }要点QueryContentItem, TextFieldIndex(...)是 YesSql 的文档 索引联合查询语法第一个泛型参数是返回的文档类型第二个是用于过滤的索引类型。表达式x x.ContentType contentType x.ContentField contentField会翻译为 SQL 的WHERE条件因此可以继续叠加Published、Latest等过滤条件。从 Razor 模板中查询在.cshtml视图或 Liquid 驱动的 Razor 页面中通过inject ISession Session注入会话后同样可以查询using OrchardCore.ContentManagement using OrchardCore.ContentFields.Indexing inject ISession Session { var contentItems await Session.QueryContentItem, TextFieldIndex(x x.ContentType Acme x.ContentField Test).ListAsync(); }从 Liquid 模板中查询Liquid 无法直接访问ISession需要先在 Orchard Core 后台创建一个SQL Query来检索记录。以查询所有国家为例创建名为AllCountries的 SQL QuerySQL 如下并且不要勾选Return Documents 选项SELECT * FROM TextFieldIndex WHERE ContentType Acme AND ContentField Country然后在 Liquid 模板中通过Queries全局对象调用该查询{% assign allCountries Queries.AllCountries | query %} {% for country in allCountries %} {{ country.Text }} {% endfor %}注意查询返回的是索引行而非完整文档因为未勾选 Return Documents所以country.Text直接读取索引表的Text列。若需要完整内容项应改为勾选 Return Documents 并返回ContentItemId。时区注意事项所有datetime列如ModifiedUtc、CreatedUtc、各字段的日期时间值均以 UTC 存储展示给用户前需要结合当前请求的 Culture / 时区进行转换。GraphQL 用法启用OrchardCore.ContentFields.Indexing.SQL模块后GraphQL 查询即可基于动态内容字段构建过滤器。以下示例演示查询产品内容类型中名为Amount的数字字段位于PricePart内容部件上大于 10 的记录。常规用法部件未折叠product(where: {price: {amount_gt: 10}}) { contentItemId displayText price { amount } }部件已折叠collapsed当PricePart在 GraphQL 中被折叠collapsed时字段直接挂在内容类型顶层product(where: {amount_gt: 10}) { contentItemId displayText amount }部件折叠且启用字段名防冲突prevent field name collision折叠后若不同部件存在同名子字段可启用防止字段名冲突选项此时字段以部件名 字段名的驼峰形式暴露product(where: {priceAmount_gt: 10}) { contentItemId displayText priceAmount }GraphQL 过滤器的核心价值在于无需为每个字段手写 SQL即可让前端通过统一的 GraphQL 语法对动态内容字段做范围/等值过滤底层由 SQL 索引表支撑。实战建议与注意事项善用Published/Latest双条件Orchard Core 内容存在草稿与已发布版本绝大多数面向站点的查询都应同时过滤Published true Latest true避免重复与未发布数据。文本列长度差异SQL Server 下nvarchar(255)列只保存截断后的前缀精确匹配超长文本应查询Big*列如BigText、BigUrl、BigValueSQLite 无长度限制两种列行为一致。decimal(19,5)的精度边界NumericFieldIndex的范围查询注意小数位为 5比较时建议使用同精度的字面量。UTC 时间转换所有日期时间列均为 UTC比较与展示时统一处理时区。性能SQL 索引表的列定义即查询键高频查询条件ContentType、ContentField、Published、Latest等建议在数据库层确认索引覆盖情况Orchard Core 会依据索引定义自动建表具体索引策略可查阅 Migrations.cs。小结SQL Indexing 是 Orchard Core 内容查询体系的地基ContentItemIndex与LocalizedContentItemIndex解决内容项与多语言版本的通用检索OrchardCore.ContentFields.Indexing.SQL模块的系列字段索引表BooleanFieldIndex、NumericFieldIndex、TextFieldIndex等则让动态内容字段获得 SQL 级查询能力。无论你选择 C#、Razor、Liquid 还是 GraphQL只要掌握了各索引表的列语义与版本/时区规则就能写出高效、准确的内容检索代码。更进一步还可以阅读 ContentIndexingService 了解索引写入的完整流水线或参考 ContentItemFilters 理解 GraphQL 过滤器与索引的映射关系。赞分享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 数据迁移Data Migrations实战指南用 DataMigration 管理内容类型、数据库索引与 RecipeOrchard Core 数据迁移Data Migrations实战指南用 DataMigration 管理内容类型、数据库索引与 Recipe 导读 本CMS后端Web框架Orchard Core GraphQL 实战指南查询类型注册、过滤机制与关联内容查询Orchard Core GraphQL 实战指南查询类型注册、过滤机制与关联内容查询 导读本文以 Orchard Core 官方文档 src/docs/CMS后端Web框架Orchard Core Razor 帮助方法Orchard完全指南在视图中调用内容、媒体、查询与本地化能力Orchard Core Razor 帮助方法Orchard完全指南在视图中调用内容、媒体、查询与本地化能力 导读 Orchard Core 为 RazCMS后端Web框架上一篇3步解锁QQ音乐加密格式跨平台播放的终极解决方案下一篇408 OneNote笔记备份与恢复教程从自检到找回写给考研新手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表