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 中感知结构 的搜索进行进一步配置。
