技术开发 频道

DB2 中的 XML 全文搜索

    在使用 Net Search Extender 之前,必须先启动它的实例服务,见 清单 2。

    清单 2. 启动 Net Search Extender 实例服务的命令

db2text start

    注意,这个命令调用一个单独的可执行程序 db2text。以后会看到,任何文本索引管理任务都需要用命令 db2text 来执行。

    在启动 Net Search Extender 之后,对 DB2 数据库启用文本搜索操作。这个步骤创建必需的管理表以及各种用户定义函数(UDF)和存 储过程(STP),这是对 DB2 数据进行全文搜索所需要的,而且对每个数据库只执行一次。

    对数据库 “test” 启用文本搜索操作的命令如下:

    清单 3. 对数据库 “test” 启用文本搜索操作的命

db2text enable database for text connect to test

    如果还没有设置 DB2DBDFT 环境变量,那么所有 Net Search Extender 管理任务都需要 connect to <dbname> 子句,其中的 <dbname> 是数据库的名称。以下命令假设设置了 DB2DBDFT。

    在为数据库启用文本搜索操作之后,可以在以各种格式(比如 XML)存储文本数据的列上创建文本索引。create index 命令定义文本索 引属性,比如更新频率、文档格式、索引目录等等,从而建立文本索引基础设施。关于各种索引属性的更多信息,请参考 Net Search Extender 文档。本文中的示例使用一个基本的文本索引创建过程,见 清单 4:

    清单 4. 在 “product.description” 上创建文本索引 ix1

db2text create index ix1 for text on product (description)

    清单 4 中的命令在 “product” 表的 “description” 列中本机存储的 XML 文档上创建一个名为 “ix1” 的全文索引。

    注意,在创建文本索引之后,文本搜索还不能找到任何结果,因为此时文本索引不包含任何数据。如果没有指定更新频率,那么需要显式 地对数据和文本索引进行同步。对文本索引进行同步的任务称为索引更新,通常在创建文本索引之后立即执行。

    清单 5. 使文本索引与基表中的数据同步

db2text update index ix1 for text

    索引更新过程可以使用 清单 5 中的命令手工执行,也可以使用后台守护进程自动执行。自动索引更新可以在创建索引时用索引属性指定 ,也可以以后使用 alter index 命令指定。

    下面总结一下在 DB2 中准备全文搜索操作所需完成的步骤:

    表 1. 在 DB2 中准备全文搜索操作的步骤
    步骤 说明 示例
    步骤 1 启动 Net Search Extender 实例服务 db2text start
    步骤 2 为数据库启用全文搜索 db2text enable database for text
    步骤 3 创建全文索引 db2text create index ixName for text on table(column)
    步骤 4 更新前面创建的全文索引 db2text update index ixName for text

    在完成这四个管理步骤之后,就可以对 XML 数据进行全文搜索了。那么,可以用来寻找相关信息的实际搜索特性是什么?

    寻找要找的东西

    用 Net Search Extender 执行全文搜索最常用的方法是使用它的 SQL 标量搜索函数 CONTAINS()。可以将它用在能够使用标准 SQL 的地 方,而且可以将它与 SQL WHERE 中的其他条件轻松地组合在一起。另外,它与 DB2 优化器紧密集成,提供了很好的运行时性能。(还有其 他两个用于更特殊情况的搜索方法,但是本文不讨论它们。)以下示例演示如何使用标量 CONTAINS() 函数执行全文搜索:

    清单 6. 标量 CONTAINS 函数

SELECT column FROM table WHERE CONTAINS(column-name, 'search-criteria') =1;

    CONTAINS() 函数有两个参数:列名(建立应该进行全文搜索的上下文)和应该应用的实际搜索条件。

    Net Search Extender 的基本搜索条件具有以下特性:

    布尔操作用于搜索词的合并(AND)、分离(OR)和排斥(NOT)
    搜索词可以是单一单词或短语,例如 “New”、“York” 或 “New York”
    接近搜索可以搜索同一句子或同一段落中的单词
    模糊搜索可以搜索与搜索词拼写相似的单词
    通配符搜索 使用前、中和尾匹配
    Net Search Extender 提供的更高级的搜索特性如下:

    用于更广泛查询的词表支持,它不但搜索特定的搜索词,还通过用户定义的关系搜索相关的词
    搜索结构化文档或附加列中的数值 范围
    词根化将搜索词缩减成它的词根,然后再进行搜索(只针对英语)
    为了在 XML 文档的文档结构中进行目标明确的搜索, Net Search Extender 通过以下措施提供基于部分的搜索:

    将搜索限制到 XML元素 上
    将搜索限制到 XML 属性 上
    支持混合内容类型的 XML 元素
    既然已经了解了 Net Search Extender 提供的搜索特性的基本概念,现在就通过示例讲解它们的实际使用方法。

    使用 SQL 和 XQuery 进行文本搜索

    下面的查询访问 清单 1 中建立的 “product” 表。“product.description” 列中存储的 XML 数据示例见 图 1。后面的查询示例搜 索这个 XML 列中的特定元素。

    考虑下面这个对 “product” 表的简单文本搜索,它返回在产品信息(在 “product.description” 列中)的文档结构中有单词 “creamer” 的所有产品标识符(“pid” 数据):

    清单 7. 文本搜索的基本语法

SELECT pid FROM product WHERE CONTAINS(description,' "creamer" ')=1;

    通过使用 SQL/XML 函数 XMLQUERY(),可以让产品信息的各个 XML 元素出现在结果中。下面的查询返回文档结构中有单词 “creamer” 的产品的 “name” 元素:

    清单 8. 结合使用文本搜索功能和 XMLQUERY() 

SELECT XMLQUERY('$prod//name' passing description as "prod") FROM product WHERE CONTAINS(description, ' "creamer" ')=1;

    清单 8 中的 SQL 全文搜索查询也可以用 XQuery 表示为:

    清单 9. XQuery 上下文中的文本搜索

XQUERY for $prod in db2-fn:sqlquery("SELECT description FROM product WHERE CONTAINS (description, ' "creamer" ')=1") return $prod//name

    全文搜索表达式在 SQL 上下文中表达,相关的 XML 文档在 XQuery 上下文中使用 db2-fn:sqlquery() 输入函数进行处理。

    在前面的示例中,文本搜索在整个 XML 文档结构上执行(换句话说,在所有文本节点和属性值上执行,而不管搜索条件匹配文档中的哪 些部分)。那么,怎么将文本搜索限制到特定的 XML 元素或 XML 属性上呢?

<
0
相关文章