DB2 中的 XML 全文搜索
【IT168 技术文档】通过支持原生存储 XML 文档,IBM® DB2® 9 向着混合型数据库系统迈出了革命性的一步。XQuery(DB2 中新的主要语言)允许以优化的 方式操作 XML。但是,XML 也常常包含大块文本,无法用 XQuery 轻松地搜索它们。为了高效地搜索文档的这些非结构化部分,DB2 提供了 一个全文搜索解决方案。本文主要关注 DB2 文本搜索的基本知识,包括创建文本索引和管理。本文还讨论 DB2 全文搜索的特定特性,比如 用模糊搜索、接近搜索和词根化在 XML 文档中搜索关键字或短语。
XQuery 是用于访问 XML 数据的 W3C 标准,提供了许多用来导航 和查询 XML 文档的扩展。也可以使用这种语言根据全文搜索条件搜索 XML 文档吗?答案是 “还不行”。XQuery 中目前不支持全文搜索特 性。其原因在于 XQuery Data Model,这是每个 XQuery 表达式的基础。为了能够高效地搜索全文数据,需要关于组成数据文本内容的各个 单词及其位置的信息。但是,在 XQuery Data Model 中,文本只是一个 “黑盒”。数据模型没有表示文本节点中的单词或符号的概念;它 只是将元素或属性的文本内容表示为一个后续节点。
因此,XQuery 最多只能进行子字符串匹配。这个功能是用内置函数 contains() 实现的,这个函数以一个上下文和搜索词作为参数。由于 DB2 9 将 XQuery 作为主要语言,在 DB2 命令窗口中可以执行以下 XQuery 表达式:
db2 => XQuery contains("e power of XML", "owe")
如前所述,contains() 函数实现子字符串匹配,因此对于以上查询返回 true。尽管用户搜索的是 “owe”,但是 contains() 也返回 “power” 等单词,这些可能不是用户实际上要寻找的搜索结果。还没有将文本搜索功能包含进 XQuery 语言中的标准。显然,这是 XQuery, Version 1 要完成的任务之一,已经在一个单独的工作组开始研究工作了:XQuery 1.0 and XPath 2.0 full text。
在等待这个新标准出台的同时,目前能够根据关键字和短语搜索相关的 XML 文档吗?下一节简要概述 DB2 的全文搜索功能,它允许对 XML 进行感知结构的文本搜索。
DB2 Net Search Extender
在对 XML 文档进行文本搜索时,要同时考虑实际内容和文档结构。一种典型的场景是将文本搜索限制在特定的元素或整个 XML 文档结构 的子树上,比如:
“寻找在 abstract 元素中有 ‘XML’ 和 ‘database’,并且在 title 元素中有 ‘text search’ 和 ‘Viper Release’ 的所有文 档,这两个词应该在同一句话中。”
在 DB2 中,这种感知结构的 XML 文档全文搜索是通过 DB2 Net Search Extender(NSE)实现的,这是 DB2 附带的一种单独安装的特性 。
文本搜索集成到 SQL 中,DB2 优化器在运行时会对它进行优化。可以使用 DB2 Control Center 执行创建和维护索引等管理任务。
Net Search Extender 使用 SQL 搜索数据库表的列中存储的文本数据。Net Search Extender 并不使用字符串匹配连续地搜索文本数据 (就像 XQuery contains() 函数所做的那样),而是使用文本索引。使用文本索引使文档搜索的效率大大提高,因为不需要像进行子字符串 匹配时那样在查询时检查文本数据。文本索引通常包含关于从文本文档中提取的相关词的信息。在 XML 文档的情况下,文本索引中不但包含 重要的词汇,而且包含它们在 XML 文档结构中的位置。
既然已经熟悉了 Net Search Extender 的基本原理,就可以开始学习如何使用它对 XML 数据执行全文搜索。下一节中讨论如何创建文本 索引。
为文本搜索做准备
搜索 DB2 中的 XML 文档需要执行的任务分成两部分:
索引管理任务
全文搜索
本节简要讨论这两种任务,使用的示例针对 清单 1 中定义的 “product” 表。注意,“product” 表的 “description” 和 “comments” 列是 XML 类型的(换句话说,“description” 和 “comments” XML 文档原生存储在数据库中)。
清单 1. 表定义
create table product (
pid varchar(10) primary key not null,
description xml,comments xml );
“product.description” 和 “product.comment” 列中存储的 XML 数据示例分别见 图 1 和 图 2。后面的查询示例搜索这些 XML 文 档的特定元素。“DB2 Viper 快速入门” (developerWorks,2006 年 3 月)讨论了如何在 DB2 中插入 XML 文档。
图 1. “product.description” 列的数据示例

图 2. “product.comments” 列的数据示例
首先考虑一下对 “product” 表执行文本搜索操作时需要做什么,比如搜索在评论的 “message” 元素中有单词 “satisfactory” 的 产品的名称,或者在描述的 “details” 元素中有短语 “sugar and creamer” 的产品的名称。