技术开发 频道

DB2 中的 XML 全文搜索

    locator 属性

    这两个模型文件元素 “XMLFieldDefinition” 和 “XMLAttributeDefinition” 都用 “locator” 属性标识源 XML 文档的部分。 locator 属性支持子轴(/)、后代及本身轴(//)和属性轴(@)。

    另外,模型文件还支持在指定位置时使用通配符。清单 30 中的示例 (1) 定义的 locator 属性标识 “product” 元素的所有子元素。 在示例 (2) 中,location 属性引用属于特定名称空间 “ns” 的 “product” 的所有子元素。

    另外,locator 属性还可以标识特定的节点类型。Net Search Extender 支持评论节点(清单 30 中的示例 3)和处理指令(PI)节点。 另外,还可以像示例 4 那样定义元素的组合。

    清单 30. locator 属性值示例
    (1) locator="/product/*"
    (2) locator="/product/ns:*"
    (3) locator="/product/comment()
    (4) locator="name | details"   

    总之,locator 属性定义应该建立索引的文档部分。可以使用 XPath 表达式的一个子集来指定 locator 属性:

    子轴(‘/’ 或 ‘child::’)
    后代及本身轴(‘//’)
    属性轴(‘@’ 或 ‘attribute::’)
    评论类型节点测试(‘comment()’)和 PI 类型节点测试(‘processing-instruction()’)
    节点的组 合(‘|’)
    通配符(‘*’)

    name 属性

    “XMLFieldDefinition” 或 “XMLAttributeDefinition” 元素的 “name” 属性定义一个名称,可以用这个名称引用 “locator” 属 性值标识出的 XML 文档结构部分。

    对于名称的定义,可以使用三个特殊的变量支持自动生成 name 值:

    表 3. name 属性的特殊值
    属性值 说明
    name="$(NAME)" 表示 locator 属性的 XPath 表达式标识出的 XML 元素或 属性的限定名称(QName)
    name="$(LOCALNAME") 表示 locator 属性的 XPath 表达式标识出的 XML 元素的局部名称(没有名称空间 前缀)
    name="$(PATH)" 表示 locator 属性的 XPath 表达式标识出的 XML 元素或属性的绝对路径

    根据默认文档模型的性质,可以猜到它定义为下面这样:

    图 6. 默认文档模型的定义   

    type 属性

    “type” 属性只能与 “XMLAttributeDefinition” 一起使用。惟一允许的值是 NUMBER,这指定 locator 属性标识出的元素或属性可 以用于参数化搜索。

    使用定制文档模型的索引定义

    定义了定制模型文件之后,就可以在创建索引时使用它。一个使用定制文档模型的文本索引定义如下:

    清单 31. 定义使用定制文档模型的文本索引

db2text create index ix2 for text on product(description) format xml documentmodel XMLModel in nsemodel.xml

    在创建索引时指定的文档模型参数指定模型文件的根元素。在 XML 的情况下,根元素是 <XMLModel>。另外,需要指定位置 (模型文件的文件名)。

    在根据定制文档模型创建新索引 “ix2” 并更新刚创建的索引之后,就可以开始根据文档模型中描述的规则搜索文档结构。

    利用定制文档模型搜索结构

    根据定制文档模型的性质,可以使用文档模型中定义的名称标识应该进行搜索的文档结构部分。没有在文档模型中由 locator 属性标识 的任何其他文档部分不会建立索引,因此不能搜索它们。

    例如,以下查询将搜索限制到 图 5 的文档模型中名称 “description” 所标识的文档部分,从而返回一个结果:

    清单 32. 查询结果

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

    但是,根据用 图 5 的定制文档模型定义的索引,执行以下查询却不返回结果,尽管引用了文档的相同部分:

    清单 33. 查询结果

SELECT pid FROM product WHERE CONTAINS(description, 'SECTION ("/product/description/details") "pattern"')=1;

    参数化搜索

    根据 图 5 的模型文件中的 “XMLAttributeDefinition”,可以对 “price” 元素的值进行参数化搜索。以下查询寻找价格在 50 和 120 之间的产品:

    清单 34. 参数化搜索

SELECT pid FROM product WHERE CONTAINS(description, 'ATTRIBUTE "price" BETWEEN 50 AND 120')=1;

    如果希望寻找价格大于 120 美元的产品,就需要考虑货币种类,那么应该怎么办?看一下 图 1 中的 XML 文档示例,会发现货币 种类是 XML 元素 “price” 的一个属性。除了使用关键字 “BETWEEN” 进行范围搜索之外,还可以使用操作符 GREATER THAN(‘>’ )和 LESS THAN(‘<’)进行参数化搜索。考虑货币种类需要使用 XMLEXISTS() SQL/XML 函数:

    清单 35. 使用 XMLEXISTS() SQL/XML 函数

SELECT pid FROM product WHERE CONTAINS(description, 'ATTRIBUTE "price" > 120')=1 AND XMLEXISTS('$prod/product/description/price[@currency="us"]' passing description as "prod");

    结束语

    DB2 Net Search Extender 提供了一种灵活的查询语言,可以根据复杂的获取操作(例如涉及布尔组合、通配符和模糊搜索)寻找相关信 息。因此,可以将搜索限制到文档结构中的特定 XML 元素或 XML 属性。可以利用 Net Search Extender 定制文档模型对 DB2 中感知结构 的搜索进行进一步配置。

0
相关文章