XQuery作为专门针对XML数据设计的查询语言,提供了完善的文本搜索能力,既可以完成基础的文本定位,也支持全文检索和模糊匹配等高级功能,能够满足不同复杂度的XML文档查询需求。
XQuery基础文本搜索
基础的文本搜索可以直接使用XPath的contains()、starts-with()、ends-with()等函数,这些函数可以直接嵌入XQuery表达式中,快速定位包含指定文本的节点。
基础搜索函数示例
假设存在如下XML文档结构:
<bookstore>
<book category="web">
<title lang="en">XQuery Tutorial</title>
<author>John Smith</author>
<year>2023</year>
<price>39.99</price>
</book>
<book category="xml">
<title lang="en">XML Basics</title>
<author>Jane Doe</author>
<year>2022</year>
<price>29.99</price>
</book>
</bookstore>
查询所有标题中包含Tutorial的图书节点,XQuery代码如下:
for $book in /bookstore/book where contains($book/title, "Tutorial") return $book
查询标题以XML开头的图书节点:
for $book in /bookstore/book where starts-with($book/title, "XML") return $book
XQuery全文检索语法
基础的字符串函数只能做简单的包含判断,无法实现语义层面的全文检索,XQuery全文检索规范(XQuery and XPath Full Text 1.0)提供了专门的ft:contains等函数,支持分词、权重、排序等高级检索能力。
全文检索基础用法
使用ft:contains查询标题中包含XQuery的图书,代码如下:
import module namespace ft = "http://www.w3.org/2007/xpath-functions/fulltext"; for $book in /bookstore/book where ft:contains($book/title, "XQuery") return $book
全文检索高级配置
可以指定检索的匹配模式,比如忽略大小写、按短语匹配等,示例代码如下:
import module namespace ft = "http://www.w3.org/2007/xpath-functions/fulltext";
for $book in /bookstore/book
where ft:contains($book/title, "xquery tutorial", map {
"case-sensitive": false(),
"diacritics-sensitive": false(),
"stemming": true()
})
return $book
上述配置中case-sensitive设为false()表示忽略大小写,stemming设为true()表示开启词干提取,能匹配到XQuery、xquery、XQUERY等不同形式的文本。
XQuery模糊匹配语法
模糊匹配用于查询和指定文本相似但不完全一致的内容,XQuery支持通配符匹配和基于编辑距离的模糊匹配两种方式。
通配符模糊匹配
使用matches()函数结合正则表达式实现通配符匹配,查询标题中包含XQuery且后面跟着任意字符的图书:
for $book in /bookstore/book where matches($book/title, "XQuery.*") return $book
正则表达式中.匹配任意单个字符,*表示前面的字符出现零次或多次,也可以根据需求调整通配规则。
编辑距离模糊匹配
部分XQuery实现支持基于编辑距离的模糊匹配,比如查询和XQuery编辑距离小于等于1的标题内容,示例代码如下:
for $book in /bookstore/book
where ft:contains($book/title, "XQuery", map {
"fuzzy-match": true(),
"fuzzy-min-similarity": 0.8
})
return $book
其中fuzzy-min-similarity表示最小相似度,取值范围是0到1,数值越高匹配结果越接近原文本。
不同搜索方式对比
以下是三种文本搜索方式的特性对比:
| 搜索方式 | 适用场景 | 性能 | 功能复杂度 |
|---|---|---|---|
| 基础字符串函数搜索 | 简单文本包含、前缀后缀判断 | 高 | 低 |
| 全文检索 | 语义化文本查询、多条件检索 | 中 | 高 |
| 模糊匹配 | 文本存在拼写误差、相似内容查询 | 中低 | 中 |
注意事项
- 全文检索和模糊匹配的相关函数属于XQuery扩展模块,使用前需要确认当前XQuery处理器是否支持对应规范。
- 正则匹配中的特殊字符需要进行转义,比如要匹配
.本身需要写成.。 - 模糊匹配的相似度阈值需要根据实际数据量调整,阈值过低会返回大量无关结果,过高可能漏掉有效内容。