DB2 中的 XML 全文搜索
将文本搜索限制到 XML 元素或属性上
将文本搜索限制到文档结构中的特定部分是 XML 全文搜索最常用的特性之一。在 DB2 Net Search Extender 中,将文本搜索限制到 XML 文档的特定元素或子树是用一个完全限定的 XPath 表达的。这个 XPath 标识应该搜索的 XML 文档结构部分。
Net Search Extender 支持缩写的 XPath 位置-步骤语法,允许使用子轴(/)和属性轴(@)。不支持其他 XPath 表达式或功能。
例如,可以用以下查询将对单词 “creamer” 和 “pattern” 的文本搜索限制到 “product.description” 中产品 XML 文档的 “name” 元素:
清单 10. 用 SECTION 子句将搜索限制到 XML 元素或属性
SELECT XMLQUERY('$prod//name' passing description as "prod")
FROM product
WHERE CONTAINS(description,'
SECTION("/product/description/name") ("creamer","pattern") ')=1;
SECTION 子句作为文本搜索条件的一部分,标识出应该在 XML 文档结构的哪个部分中进行文本搜索。根据 XPath 标准的定义,上面的示 例使用位置步骤标识出产品 XML 文档结构中的 XML “name” 元素。SELECT 语句返回在 “name” 元素中有任何次序的单词 “creamer” 和 “pattern” 的所有产品的 name 元素。
使用 XQuery,同样的查询也可以写成:
清单 11. XQuery 作为主要语言
XQUERY for $prod in db2-fn:sqlquery("SELECT description
FROM product
WHERE CONTAINS(description,
' SECTION("/product/description/name") ("creamer","pattern" ')=1)
return $prod//name
另外,还可以使用属性轴将文本搜索限制到特定的 XML 属性,见下面的示例:
清单 12. 将文本搜索限制到 XML 属性
SELECT XMLQUERY('$prod//name' passing description as "prod")
FROM product
WHERE CONTAINS(description,'
SECTION("/product/description/category/@catx")"sterling" ')=1;
SECTION 子句使用对应的 XPath 将文本搜索限制到 “catx” XML 属性。这个查询返回 “catx” XML 属性值为 “sterling” 的所有 产品的 “name” 元素。
清单 12 演示如何在同一 部分中搜索不同的词。还可以将不同 部分中的搜索组合起来。使用布尔 AND 操作符(&),清单 13 中的 查询返回在 “category” 元素的 “catx” 属性中有 “sterling” 而且在 “name” 元素中有 “creamer” 的所有产品的 “name” 元 素:
清单 13. 在不同的部分中进行搜索
SELECT XMLQUERY('$prod//name' passing description as "prod")
FROM product
WHERE CONTAINS(description,' SECTION("/product/description/category/@catx")"sterling"
& SECTION("/product/description/name")"creamer" ')=1;
跨元素边界进行搜索
有时候会遇到具有混合内容类型的 XML 元素,也就是既包含文本数据,也包含其他 XML 元素。例如,以下 XML 元素 “sentence” 包 含一些文本和另一个元素 “entity”:
图 3. 混合内容类型的 XML 元素

在这种情况下,希望跨元素边界进行搜索(换句话说,在 “sentence” 元素中搜索短语 “IBM Software Group” 应该能够找到其他元 素中出现的搜索词)。Net Search Extender 能够处理混合内容,即跨元素边界进行搜索。
假设将上面的 XML 片段存储在表 “product” 的列 “description” 中,以下查询返回一个结果:
清单 14. 查询结果
SELECT description
FROM product
WHERE CONTAINS(description,'
SECTION ("/sentence") "IBM Software Group" ')=1;
尽管符号 “IBM” 是元素 “entity” 的直接文本节点,而文本搜索的范围是 XML 元素 “sentence”,但是查询找到了一个结 果。
到目前为止,还没有充分揭示全文索引的实力。您已经看到了将搜索限制到文档结构的特定部分的示例,但是 Net Search Extender 还 提供了表达搜索条件的其他方式。
文本搜索的实力
除了将文本搜索限制到特定的元素或属性之外,Net Search Extender 还提供了几个用来定义文本搜索条件的其他特性。例如,可以将文 本搜索限制到只匹配同一句子中出现的单词(接近搜索)。
下面几节提供前面提到的几个搜索特性的示例。
接近搜索
清单 15 中的查询寻找不仅在 XML 文档的 “details” 元素,而且在同一句子 中有 “pattern” 和 “sugar and creamer” 所有产 品的产品标识符:
清单 15. 接近搜索
SELECT pid FROM product
WHERE CONTAINS(description, 'SECTION ("/product/description/details") "pattern"
IN SAME SENTENCE AS "sugar and creamer"')=1;
这个示例中组合了两个结构化约束:搜索被限制到一个特定的元素(“details”),而且在这个元素的文本内容(它的文本节点 )中,搜索限制到在同一句子中出现的单词。注意,搜索词 “sugar and creamer” 组成一个短语,这会搜索在句子中出现的三个单词 “sugar”、“and” 和 “creamer”。另一方面,要在同样的上下文中搜索任意次序的 符号 “creamer”、and” 和 “sugar”,可以使 用下面的表达方式:
清单 16. 短语搜索和符号搜索之间的差异
SELECT pid FROM product
WHERE CONTAINS(description, 'SECTION ("/product/description/details") "pattern"
IN SAME SENTENCE AS ("creamer","and","sugar")')=1;
布尔操作符
可以使用布尔操作符 “&”(AND)、“|”(OR)和 NOT 将不同的搜索词组合起来。下面的示例使用布尔操作符 AND 和 OR 组合几 个搜索词:
清单 17. 使用布尔操作符 AND 和 OR
SELECT pid FROM product
WHERE CONTAINS(description, 'SECTION ("/product/description") "pattern" & "creamer" | "sugar" ')=1;
这个查询返回在 description 元素中有 “pattern” 并且有 “creamer” 或 “sugar” 的所有产品的 “pid”。
可以使用布尔操作符 NOT 从搜索结果中排除特定的词。例如,清单 18 中的查询搜索在 “description” 元素中有 “pattern” 和 “ creamer”,但是没有 “sugar” 的文档:
清单 18. 布尔操作符 NOT
SELECT pid FROM product
WHERE CONTAINS(description,
'SECTION ("/product/description") "pattern" & "creamer" & NOT "sugar" ')=1;
模糊搜索
另一个流行的特性是模糊搜索。模糊搜索寻找包含与提交的搜索词拼写相似的词的文档。因此,需要匹配前 3 个字符。当文档中可能有 错误的拼写时,常常使用模糊搜索。
清单 19. 模糊搜索寻找拼写相似的词
SELECT pid
FROM product
WHERE CONTAINS(description,
'SECTION("/product/description") FUZZY FORM OF 80 "patern" & "creamer"')=1;
注意,“patern” 拼写错了,但是用模糊搜索可以找到包含拼写正确的 “pattern” 的文档。匹配级别(在这个示例中是 80) 指定精确度。精确度的范围在 1 到 100 之间,100 是精确匹配。