XQuery Full Text 是 W3C 标准的语义化文本搜索扩展,支持词干提取、停用词过滤、权重计算、邻近搜索和模糊匹配,需依赖底层全文索引与语言配置(如中文需额外分词器),非简单子串匹配。

XQuery Full Text 是 W3C 标准定义的一套用于在 XML 文档中执行语义化文本搜索的语言扩展,它不是简单的“包含子串”匹配,而是支持词干提取、停用词过滤、权重计算、邻近搜索、模糊匹配等高级检索能力。它被设计为嵌入在 XQuery 表达式中使用,常见于 Oracle XML DB、eXist-db、BaseX 等支持标准 XQuery 的 XML 数据库中。
它和普通 LIKE 或 CONTAINS 有什么区别
普通 SQL 的 LIKE '%关键词%' 是字符级模糊匹配,效率低、无法理解语言结构;而 XQuery Full Text 是语义级搜索:
- 自动忽略常见停用词(如“的”“and”“the”)
- 支持大小写不敏感、重音不敏感(如 café ≈ cafe)
- 可指定搜索范围(整个文档、特定元素、属性值)
- 允许组合条件,比如“database NEAR performance”或“query WEIGHT(3.0)”
基本用法:ora:contains 和 ftcontains
不同数据库语法略有差异,但核心结构一致:
- Oracle XML DB 中常用
ora:contains($node, 'search term'),返回布尔值,常配合 XPath 使用,例如://book[ora:contains(., 'XML AND performance')] - 标准 XQuery Full Text 使用
ftcontains表达式,例如://title ftcontains "XQuery" && "full text" - 支持修饰符:case insensitive、diacritics insensitive、language 'zh'(部分实现支持中文分词需额外配置)
使用前必须做的两件事
即使语法写对,没做下面准备也搜不到结果:
-
索引准备:Oracle 需先在 XMLType 列上创建 Oracle Text 索引,并指定
PATH TABLE和STORAGE参数;eXist-db 要在 collection 上启用 full-text index 并配置 analyzer(如 smartcn 支持中文) - 数据格式合规:XML 必须是 well-formed,且目标文本不能被 CDATA 或实体编码完全包裹(否则解析器可能跳过索引)
常见误区提醒
很多人试了几次没结果,其实卡在这些细节上:
- 默认不支持中文全文搜索——Oracle 需配置 Chinese lexer;eXist-db 需加载中文分词插件并设
analyzer="smartcn" - 短词(如“go”“db”)可能被当作停用词过滤,可查数据库的 stoplist 设置并自定义
-
ftcontains不是函数,不能直接写在 FLWOR 的where子句里当普通表达式用(某些引擎会报错),应确保上下文节点路径有效 - 搜索含标点的短语,记得加双引号:
"real-time processing",否则会被拆成独立词
基本上就这些。XQuery Full Text 功能强,但依赖底层索引和语言配置,不是写对语法就能立刻见效。先确认你的 XML 数据库是否开启并正确配置了全文索引,再动手写查询。










