DB2 中的 XML 全文搜索
XML 名称空间考虑事项
在 XML 数据属于特定的非默认名称空间的情况下,在搜索文档结构中的特定元素或子树时必须使用完全限定的名称(名称空间前缀+元素 名称)。
假设 XML 产品数据的元素属于一个以 “ns” 为前缀的名称空间。
图 4. 具有名称空间的 XML 产品数据

对于前一个搜索示例,Net Search Extender 在这种情况下找不到任何结果:
清单 28. Net Search Extender 找不到任何结果
SELECT pid
FROM product
WHERE CONTAINS(description,
'SECTION("/product/description/details") "pattern"')=1;
用来定义要搜索的 XML 部分的 XPath 表达式没有包含名称空间前缀 —— 换句话说,没有包含完全限定的元素名称(QName)。
在 SECTION 参数中必须使用完全限定的 XML 元素名称,才能搜索示例文档:
清单 29. 在 SECTION 参数中使用完全限定的 XML 元素名称
SELECT pid FROM product
WHERE CONTAINS (description,
'SECTION("/ns:product/ns:description/ns:details")
"pattern"IN SAME SENTENCE AS "sugar and creamer"')=1;
Net Search Extender 按照元素/属性名称在文档中出现的形式对它们进行匹配,包括任何名称空间前缀。但是,如果使用默认名 称空间,那么就不必给元素加前缀!
对如何定位 XML 文档结构中的各个部分进行配置的一种方法是使用 Net Search Extender 文档模型。下一节解释它的使用方法。
NSE 文档模型揭秘
可以使用 Net Search Extender 文档模型配置结构化文档(比如 XML)中要搜索的范围。文档模型主要控制文档结构的哪些 部分要建立 索引、这些部分如何 建立索引以及在搜索期间用哪些名称 引用这些文档部分。
有两种文档模型:
默认文档
用户定义的定制文档模型
要使用定制的文档模型,就必须在创建文本索引时指定一个文档模型。如果没有通过索 引参数提供定制的文档模型,那么 Net Search Extender 使用它的默认模型。
到目前为止,本文中的示例都使用 Net Search Extender 提供的默认文档模型。默认文档模型的性质是:
文档的所有部分都建立索引(对于 XML 文档,这包括所有元素和属性)
可以使用与 XPath 相似的语法将搜索限制到特定的文档 部分
数值不建立索引,所以不支持数值比较或范围搜索
如果使用定制的文档模型,就可以:
定义 XML 文档的哪些部分应该建立索引,哪些部分应该排除在索引之外
为某些 XML 子树、XML 元素或属性定义定制的名称
将 XML 元素或属性内容定义为数值,从而允许在此内容上进行数值比较或范围搜索
文档模型本身是一个 XML 文档,它采用一种预 定义的语法(语法定义见 Net Search Extender 文档)。文档模型在一个文件中定义,它们指定对结构化文档(例如 XML 格式的文档)进 行解析和建立索引的模型。在创建索引期间,模型文件作为参数传递,而且只在此期间被读取;以后的修改不影响现有的索引。
图 5 针对产品数据(参见 清单 1)定义了一个定制文档模型。这个文档模型存储在文件 nsemodel.xml 中。
图 5. 定制文档模型

每个 XML 文档模型都以 “XMLModel” 元素开头。XMLModel 可以有两个 XML 子元素:
表 2. NSE XML 模型文件元素
模型文件元素 说明
XMLFieldDefinition 这个元素为 XML 文档的特定部分、元素或属 性(由 “XMLFieldDefinition” 的 “locator” 属性标识)定义一个定制的名称
XMLAttributeDefinition 这个元素在可以用于数 值(参数化)搜索的 XML 元素或 XML 属性上定义一个 NSE 属性