Keystone 6 实战:用 Prisma Full-Text Search 为 PostgreSQL 打造全文搜索 GraphQL 查询

发布时间:2026/9/24 16:01:32

Keystone 6 实战:用 Prisma Full-Text Search 为 PostgreSQL 打造全文搜索 GraphQL 查询 后端【免费下载链接】keystoneThe superpowered headless CMS for Node.js — built with GraphQL and React项目地址https://gitcode.com/gh_mirrors/key/keystone点击查看免费下载导读本文基于 Keystone 官方示例项目 extend-full-text-search 展开讲解如何在 Keystone 6 中利用 Prisma 的 PostgreSQL 全文搜索能力fullTextSearchPostgrespreview feature实现真正意义上的全文检索。文章将带你走通两条关键技术路径通过db.extendPrismaSchema把 preview feature 注入 Keystone 自动生成的schema.prisma以及通过graphql.extendGraphqlSchema暴露一个可复用的自定义searchPosts查询。读完本文你可以在自己的 Keystone 项目中直接落地一个支持 AND / OR / NOT / 短语邻近匹配的全文搜索 API。⚠️前置条件全文搜索Full-Text Search仅适用于 PostgreSQL 数据库SQLite 不支持这一点在示例 README 中已有明确说明。示例概览与运行方式本示例定义了两个核心列表schema.tsPost包含title必填、content文本字段以及指向Author的多对一关系Author包含name、唯一索引的email以及指向Post的一对多反向关系。列表均配置了access: allowAll方便直接体验无需认证。在仓库根目录安装依赖后按以下步骤启动# 1. 设置数据库连接串示例默认值 postgresql://localhost/keystone-example export DATABASE_URLpostgresql://localhost/keystone-example # 2. 进入示例目录并启动开发服务 cd examples/extend-full-text-search pnpm dev启动后可访问Admin UIhttp://localhost:3000用于创建测试数据GraphQL Playgroundhttp://localhost:3000/api/graphql用于直接运行查询与变更。示例的package.json还提供了pnpm startkeystone start与pnpm buildkeystone build等脚本package.json。数据库连接串同时出现在 Keystone 配置keystone.ts和 Prisma 配置prisma.config.ts中二者保持一致。第一步通过extendPrismaSchema开启 preview featurePrisma 的fullTextSearchPostgres属于 preview feature必须在 Prisma generator 块中显式声明。由于 Keystone 会自动生成并管理schema.prisma文件生成逻辑见 prisma-schema-printer.ts我们不能直接手改该文件——任何手动修改都会被下一次生成覆盖。正确的做法是利用 Keystone 配置中的db.extendPrismaSchema钩子在生成流程的末尾对整份 schema 字符串做一次注入。在 keystone.ts 中配置如下db: { provider: postgresql, prismaClientOptions: () ({ adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL || postgresql://localhost/keystone-example, }), }), extendPrismaSchema: schema { return schema.replace( /(generator [^}])}/g, [$1, previewFeatures [fullTextSearchPostgres], }].join(\n) ) }, },这里的关键点extendPrismaSchema: (schema: string) string接收 Keystone 生成完毕的完整 Prisma schema 字符串返回修改后的新字符串签名定义见 config/index.ts正则/(generator [^}])}/g匹配generator client { ... }块在块结束的}前插入previewFeatures行从 prisma-schema-printer.ts 的实现可以看出extendPrismaSchema是对最终完整 schema的最后一道加工因此无论 Keystone 内部如何生成注入结果都必然生效。注入后的 generator 块形如与仓库中已生成的 schema.prisma 完全一致generator client { provider prisma-client output ./generated/prisma previewFeatures [fullTextSearchPostgres] }补充说明extendPrismaSchema是 Keystone 提供的通用扩展点除注入 preview feature 外也可用于添加索引、修改map映射等场景。它在列表级和字段级同样可用参见 lists.ts 中ListConfig.db.extendPrismaSchema与 prisma-schema-printer.ts 中的调用点。第二步用extendGraphqlSchema暴露自定义searchPosts查询开启了 preview feature 之后Prisma Client 便支持在where条件中使用search操作符。但该操作符属于 Prisma 底层能力尚未通过 Keystone 的context.db查询层暴露。因此示例采用两层配合的经典做法用原始 Prisma Clientcontext.prisma执行全文搜索只取命中的id用这些id回查context.db.Post拿到 Keystone 类型化的完整对象保证返回结果带关系、钩子等 Keystone 语义。自定义查询在 schema.ts 中通过extendGraphqlSchema注册export const extendGraphqlSchema g.extend(base { return { query: { searchPosts: g.field({ type: g.list(g.nonNull(base.object(Post))), args: { query: g.arg({ type: g.nonNull(g.String) }), }, async resolve(source, { query }, context) { // 1. 用原始 Prisma client 执行全文搜索命中 title 或 content const matches await context.prisma.post.findMany({ where: { OR: [{ title: { search: query } }, { content: { search: query } }], }, select: { id: true }, }) // 2. 用命中的 id 回查 Keystone 类型化的 Post 对象 const ids matches.map(p p.id) return context.db.Post.findMany({ where: { id: { in: ids } }, }) }, }), }, } })几个值得注意的实现细节返回类型g.list(g.nonNull(base.object(Post)))表示Post 对象的非空列表base.object(Post)复用了 Keystone 自动生成的Post类型因此查询结果可以直接内嵌author关系参数query声明为非空 String生成的 schema 中即为searchPosts(query: String!): [Post!]可在已生成的 schema.graphql 中验证搜索范围是title与content两个字段的 OR 组合读者可按需扩展更多文本字段context.prisma是 Keystone 上下文暴露的原始 Prisma Client 实例context.db.Post.findMany则是 Keystone 类型化的查询层二者互补使用正是本例的精髓。PostgreSQL tsquery 语法速查searchPosts的query参数接受 PostgreSQL 的 tsquery 语法即基于、|、!等运算符的布尔表达式。下表为原文完整收录运算符含义示例AND与cat dog— 必须同时包含两个词\|OR或cat \| dog— 包含任一即可!NOT非!cat— 必须不包含该词-短语 / 邻近匹配fox - dog— dog 紧跟 fox 之后同样的运算符说明也以注释形式完整保留在源码 schema.ts 中便于维护时查阅。注意 GraphQL 字符串中写|无需转义表格中的\|仅为 Markdown 表格转义写法。在 GraphQL Playground 中验证效果先在 Admin UI 创建若干包含不同关键词的 Post例如内容涉及 Keystone、GraphQL、CMS 等词的博文然后打开/api/graphql执行query { searchPosts(query: keystone graphql) { id title content author { name } } }该查询要求命中结果同时包含keystone与graphql两个词若把换成|则变为包含任一配合!可实现排除词-可实现短语精确匹配。返回结果中可直接取到关联的author.name说明 Keystone 类型化对象完整保留了关系查询能力。底层原理小结preview feature 注入db.extendPrismaSchema是 Keystone 对自动生成 Prisma schema 的最终加工钩子注入后fullTextSearchPostgres才会出现在 generator 块中Prisma Client 才能识别search操作符双层查询策略context.prisma原始 Prisma负责底层全文检索context.dbKeystone 类型化层负责把结果还原为带完整语义的 Keystone 对象弥补了context.db尚未暴露search操作符的空白适用边界全文搜索依赖 PostgreSQL 的 tsvector/tsquery 能力SQLite 下该方案不可用search的可用性与 Prisma 版本及 preview feature 支持有关生产环境使用前请核对所用 Prisma 版本。本示例完整源码位于 examples/extend-full-text-search其中 keystone.ts、schema.ts 与生成的 schema.prisma、schema.graphql 相互印证可直接作为模板改造复用。赞分享后端【免费下载链接】keystoneThe superpowered headless CMS for Node.js — built with GraphQL and React项目地址https://gitcode.com/gh_mirrors/key/keystone点击查看免费下载相关推荐Lance 全文检索Full-Text Search实战指南从倒排索引构建到 BM25 高级查询Lance 全文检索Full Text Search实战指南从倒排索引构建到 BM25 高级查询 Lance 通过倒排索引Inverted Index数据库向量数据库数据湖全文检索Nuxt 中 node_modules 目录详解依赖存储、.gitignore 规范与框架如何读取依赖Nuxt 中 node_modules 目录详解依赖存储、.gitignore 规范与框架如何读取依赖 本文以 Nuxt 官方目录结构文档中的 node_mo后端Keystone 6 测试指南使用 keystone-6/core/testing 与 Vitest 验证 GraphQL API 行为Keystone 6 测试指南使用 keystone 6/core/testing 与 Vitest 验证 GraphQL API 行为 本指南以 Keys后端上一篇中医AI助手的革命仲景大模型如何让普通人也能享受专业中医咨询下一篇如何快速实现游戏窗口分辨率自定义SRWE终极窗口调整工具指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/24 18:11:44

基于Python的3D-CT肺结节检测:从数据预处理到模型训练全解析

简介:面向计算机、通信、人工智能、自动化及相关专业的高校学生、教师与从业者,这份基于Python的3D-CT影像肺结节检测算法工程包,完整覆盖DICOM数据预处理、检测网络、分类网络与训练测试模块,适合作为毕业设计、课程大作业或期末…

2026/9/24 18:11:44

医学图像处理实战:基于CT的肺结节检测全流程解析

简介:这份资源面向医学图像处理与深度学习方向的初学者及进阶开发者,聚焦肺部CT影像中的肺结节自动检测问题,提供了一套可复现的完整项目代码。包内共26个文件,以11个Python脚本、4个Jupyter Notebook为主,辅以8张结果…

2026/9/24 18:11:44

Python医疗知识图谱问答系统:从零搭建可答辩的工程骨架

简介:这是一套面向高校学生与Python开发者的医疗知识图谱问答系统完整源码,可直接用于毕业设计、期末大作业或课程设计场景。项目围绕医疗领域知识图谱构建与智能问答展开,涵盖知识抽取、意图识别、实体识别等核心模块,代码注释详…

2026/9/24 18:11:44

农作物多类别目标检测数据集:16类1041张YOLO格式,含遮挡样本

简介:这份农作物多类别目标检测数据集面向农业AI开发者、农机视觉算法工程师及农业院校研究人员,用于解决农田场景下作物种类识别与定位的模型训练需求。数据覆盖香蕉、豆类、茄子、辣椒、黄瓜、大蒜、生姜、玉米、洋葱、豌豆、菠萝、马铃薯、水稻、高粱…

2026/9/24 18:11:44

基于图像识别的明日方舟自动化助手:模板匹配实战与避坑指南

简介:这是一份面向明日方舟玩家的自动化辅助工具源码,基于图像识别技术实现日常任务的一键执行,适合具备C基础、对计算机视觉与游戏自动化感兴趣的中高级开发者研究学习。资源包共2000个文件,约124.87MB,以1487个json配…

2026/9/24 18:06:44

学生选课系统毕业设计:Java+微信小程序+MySQL 架构拆解与避坑指南

简介:这是面向计算机相关专业毕业设计或课程设计的微信小程序学生选课系统完整源码包,使用Java 微信小程序 MySQL搭建,涵盖学生、教师、管理员三类角色,包含首页、个人中心、学生管理、教师管理、课程类型管理、课程信息管理、选…

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码