XQuery Full Text是什么 XML全文搜索语法

XQuery Full Text 是 XQuery 1.0 及后续版本中支持语义化、语言感知型全文检索的扩展机制,提供词干提取、停用词过滤、权重排序、短语匹配、布尔组合、邻近搜索等能力,通过 ftcontains 表达式实现,依赖底层引擎(如 eXist-db、BaseX)的全文索引支持。

XQuery Full Text 是 XQuery 1.0 及后续版本(特别是 XQuery 1.0 Full Text 扩展)中定义的一套专门用于在 XML 内容中执行语义化、语言感知型全文检索的语法机制。它不是简单地用 contains() 做子串匹配,而是支持词干提取(stemming)、停用词过滤、权重排序、短语匹配、通配符、布尔组合(AND/OR/NOT)、邻近搜索(near)、大小写与重音不敏感等能力,更接近搜索引擎的行为。

核心语法结构:ftcontains 表达式

ftcontains 是 XQuery Full Text 的关键字,必须配合 ftselection 使用,基本形式为:

  • $node ftcontains "keyword" —— 最简用法,匹配任意含该词的文本节点
  • $node ftcontains "XML" ftand "query" —— 布尔 AND,要求两词都出现
  • $node ftcontains "custom" ftweight 2.5 —— 提升匹配项权重(用于排序)
  • $node ftcontains phrase "XQuery tutorial" —— 精确短语匹配
  • $node ftcontains "run" ftwith wildcards at start —— 支持前缀通配(如 "running", "runner")
  • $node ftcontains "fast" ftor "quick" ftorder by score descending —— 多条件+按相关性排序

与普通 contains() 的关键区别

普通 contains($text, "abc") 只做字符串包含判断,区分大小写,不处理空格/标点,也不理解语言规则。

ftcontains 则依赖底层全文引擎(如 eXist-db、BaseX 或 SQL Server 的 XML 全文索引),自动进行:

  • 分词(tokenization)和语言分析(如英文词干还原:running → run)
  • 忽略常见停用词(the, and, of 等,除非显式启用)
  • 支持字段加权(如 title 比 content 权重高)
  • 可结合 ftoptions 显式控制行为,例如:
    ftcontains $b/title ftcontains "xml" ftoptions (language "en", case insensitive, diacritics insensitive)

实际使用前提与限制

不是所有 XQuery 引擎都默认支持 Full Text。需确认:

  • eXist-db:从 2.2 版起完整支持,需在 collection 上启用全文索引(
  • SQL Server:XML 列的全文索引 + .exist().value() 配合 CONTAINS() 实现类似效果,但原生 ftcontains 不可用;它用的是 T-SQL 全文语法,非标准 XQuery FT
  • BaseX:支持,需开启 ftindex 并在查询中启用 ft:search 或标准 ftcontains
  • Oracle / IBM DB2:部分支持,具体取决于版本和配置

一个典型可运行示例(eXist-db)

假设有如下 XML 文档存于 /db/books.xml

XQuery Full-Text Search GuideLearn how to search XML with stemming and phrases.

查询标题或描述中包含 “search” 或其变形(如 searching, searched),且同时含 “XML” 的文档:

for $b in doc("/db/books.xml")/book
where $b/(title|desc) ftcontains "search" ftor "searching" ftand "XML"
return $b/title

该查询将命中,因为 “search” 经词干还原后与 “searching” 视为等价,且 “XML” 作为独立词存在。