技术开发 频道

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 是精确匹配。

0
相关文章