在搜索中使用名称空间

必须在搜索项的 @xmlxp 查询序言中定义 QName 前缀和缺省元素 namespaces

将名称空间 ns1 映射到 URI "http://mycompany.com" 的示例序言

declare namespace ns1 = "http://mycompany.com"; 

用于指定所有未限定元素都由 URI "http://mycompany.com"限定的示例序言:

declare default element namespace "http://mycompany.com"

如果查询未声明任何名称空间 QName 前缀或缺省元素名称空间,那么不会在查询中考虑名称空间。 如果元素或属性名称存在于任何名称空间中,那么会将其视为匹配项。

如果声明了任何 QName 前缀或缺省名称空间,那么仅当元素或属性名称存在于指定的名称空间中时,它们才会匹配。

语法
declare default element namespace "”; 
可用于指示未限定的标记不在任何名称空间中。

XML 搜索字符串中使用的 QName 前缀不需要与 XML 文档中使用的 QName 前缀匹配。 匹配仅基于长名称 URI。

示例:

将搜索限制为元素 test 的属性 attr ,其中元素 test 映射到 namespace "http://posample.org",而 attr 不在任何 namespace中。 使用缺省 namespace 来简化语法。

CONTAINS(myxmlcol, '@xmlxp:''declare default element namespace “http://myexample.org”;
 /test[@attr > xs:date(“2005-01-01”)]''')

将搜索限制为元素 test 的属性 attr ,其中元素 testnamespace"http://myexample.org"。 通过使用 QName 前缀 abc来使用显式 namespace 语法。

CONTAINS(myxmlcol, '@xmlxp:''declare namespace abc =  “http://myexample.org”;
 /abc:test[@attr < xs:date(“2009-01-01”)]''')

将搜索限制为使用 QName prefix ns1显式映射到 namespace "http://myexample.org" 的元素 purchaseOrdershipTo namebillTo name 子元素。 还定义了缺省名称空间 ("http://mastsample.org") ,这适用于 shipTonamebillTo

CONTAINS(myxmlcol, '@xmlxp:'' declare default namespace "http://mastsample.org";
 declare namespace ns1 = "http://posample.org"; /ns1:purchaseOrder[shipTo/name = "Jane"
 and billTo/name = "Jason"]''')

将搜索限制为 shipTo 元素 (在缺省名称空间 "http://mastsample.org"中) 的属性 name (在名称空间 "http://posample.org"中显式定义) ,这是元素 purchaseOrder 的子代 (在名称空间 "http://posample.org"中显式定义)。 缺省名称空间 "http://mastsample.org" 适用于元素 shipTobillToname

CONTAINS(myxmlcol, '@xmlxp:'' declare default namespace "http://mastsample.org";
 declare namespace ns1 = "http://posample.org"; /ns1:purchaseOrder/shipTo[@ns1:name = 
"Jane" and billTo/name = "Jason"]''')

XML 搜索示例

  • 在模式 XMLTEST 中创建表 XML_DOCUMENTS 以存储 XML 文档:
    CREATE TABLE XMLTEST.XML_DOCUMENTS (ID INT, XML_DATA XML, PRIMARY KEY (ID));
  • 在 XML 列上创建名为 XML_INDEX 的文本搜索索引:
    call SYSPROC.SYSTS_CREATE('XMLTEST', 'XML_INDEX', 'XMLTEST.XML_DOCUMENTS(XML_DATA)', '');
  • 插入一些 XML 文档:
    INSERT INTO XMLTEST.XML_DOCUMENTS (ID, XML_DATA)
    VALUES(1,
          '<BOOK publication_date="2009-01-01">' ||
          ' <TITLE> OmniFind Text Search Server for DB2 </TITLE>' ||
          ' <ID_NUMBER> 1 ></ID_NUMBER>' ||
          ' <CHAPTER>' ||
          '   <NUMBER> 1 </NUMBER>' ||
          '   <TITLE> Introduction </TITLE>' ||
          '   <ABSTRACT> This chapter will introduce the reader to the capabilities of OmniFind 
                         for DB2 for IBM i </ABSTRACT>' ||
          ' </CHAPTER>'||
          ' <CHAPTER>' ||
          '   <NUMBER> 2 </NUMBER>' ||
          '   <TITLE> Creating a Text Search Index </TITLE>' ||
          '   <ABSTRACT> This chapter will explain how to create a text search index </ABSTRACT>' ||
          ' </CHAPTER>' ||
          '</BOOK>');
    INSERT INTO XMLTEST.XML_DOCUMENTS (ID, XML_DATA)
    VALUES(2,
          '<BOOK publication_date="2010-02-01">' ||
          ' <TITLE>  Using the XML data type for DB2 for IBM i </TITLE>' ||
          ' <ID_NUMBER> 2 ></ID_NUMBER>' ||
          ' <CHAPTER>' ||
          '   <NUMBER> 1 </NUMBER>' ||
          '   <TITLE> Introduction </TITLE>' ||
          '   <ABSTRACT> This chapter will introduce the reader to the DB2 XML data type </ABSTRACT>' ||
          '  </CHAPTER> ' ||
          '  <CHAPTER>' ||
          '    <NUMBER> 2 </NUMBER>' ||
          '    <TITLE>  Inserting XML data into a DB2 table </TITLE>' ||
          '    <ABSTRACT> This chapter will explain how to insert XML data into a DB2 table </ABSTRACT>' ||
          '  </CHAPTER>' ||
          '  <CHAPTER>' ||
          '    <NUMBER> 3 </NUMBER>' ||
          '    <TITLE>  Searching XML data </TITLE>' ||
          '    <ABSTRACT> This chapter will explain how to query data in XML columns
                          using the CONTAINS and SCORE UDFS </ABSTRACT>' ||
          '  </CHAPTER>' ||						
          '</BOOK>');
    INSERT INTO XMLTEST.XML_DOCUMENTS (ID, XML_DATA)
    VALUES(3,
          '<BOOK xmlns="http://www.ibm.com/digital_media_library"' ||
          '      publication_date="2010-02-01">' ||
          ' <TITLE> Using Namespaces with OmniFind Text Search Server for DB2 for IBM i  </TITLE>' ||
          ' <ID_NUMBER> 2 </ID_NUMBER>' ||
          ' <CHAPTER>' ||
          '   <NUMBER> 1 </NUMBER>' ||
          '   <TITLE> Introduction </TITLE>' ||
          '   <ABSTRACT> This chapter will introduce the reader to XML namespaces </ABSTRACT>' ||
          ' </CHAPTER>' ||
          ' <CHAPTER>' ||
          '   <NUMBER> 2 </NUMBER>' ||
          '   <TITLE> Using default namespaces </TITLE>' ||
          '   <ABSTRACT> This chapter will explain how to use a namespace in an XML search </ABSTRACT>' ||
          ' </CHAPTER>' ||
          '</BOOK>');
  • 更新索引:
    CALL SYSPROC.SYSTS_UPDATE('XMLTEST', 'XML_INDEX', '');

示例查询

示例 1:

查找具有根元素 BOOK 且具有包含 DB2的直接后代 TITLE 的所有文档。

SELECT ID 
FROM XMLTEST.XML_DOCUMENTS 
WHERE CONTAINS(XML_DATA, '@xmlxp:''/BOOK/TITLE[. contains("DB2")]'' ') = 1;

因为未在搜索项中指定名称空间序言,所以在搜索中不考虑任何名称空间。

表 1. 结果
标识
1
2
3

示例 2:

查找具有根元素 BOOK 且具有包含 DB2的直接后代 TITLE 的所有文档。 使用缺省元素名称空间来指示 BOOKTITLE 必须位于 "http://www.ibm.com/digital_media_library” namespace中。

SELECT ID 
FROM XMLTEST.XML_DOCUMENTS 
WHERE CONTAINS(XML_DATA, '@xmlxp:''declare default element namespace
 "http://www.ibm.com/digital_media_library";
 /BOOK/TITLE[. contains("DB2")]'' ') = 1;
表 2。 结果
标识
3

示例 3:

查找其根元素 BOOK"2010-01-01" 之后具有属性 publication_date 且具有包含 DB2的子元素 TITLE 的所有文档。 限制搜索,以便标记 BOOKTITLE 不得存在于任何名称空间中。
SELECT ID 
FROM XMLTEST.XML_DOCUMENTS 
WHERE CONTAINS(XML_DATA, '@xmlxp:''declare default element namespace ""; 
/BOOK[@publication_date > xs:date("2010-01-01")]/TITLE[. contains("DB2")]'' ') = 1;
表 3. 结果
标识
2

示例 4:

查找根元素为 BOOK (不在任何名称空间中) 且具有直接后代 CHAPTER (也不在名称空间中) 且包含有关将数据插入 XML 表的信息的所有文档。
SELECT ID 
FROM XMLTEST.XML_DOCUMENTS 
WHERE CONTAINS(XML_DATA, '@xmlxp:''declare default element namespace ""; 
/BOOK/CHAPTER[. contains("inserting XML data into a table")]'' ') = 1;
注:
  • CHAPTER 中包含的文本包含作为 CHAPTER后代的 ABSTRACTTITLE 元素中包含的文本。
  • 搜索字符串不区分大小写,并且会考虑搜索词的语言变体。
表 4. 结果
标识
2

示例 5:

查找根元素为 BOOK (在名称空间 “http://www.ibm.com/digital_media_library”中) 且具有直接后代 CHAPTER (也在名称空间 “http://www.ibm.com/digital_media_library”中) 的所有文档。 CHAPTER 必须具有值为 1的直接后代 NUMBER (在名称空间 “http://www.ibm.com/digital_media_library"中) ,并且还包含有关搜索 XML 名称空间的文本信息。
SELECT ID 
FROM XMLTEST.XML_DOCUMENTS 
WHERE CONTAINS(XML_DATA, '@xmlxp:''declare namespace ns1 = "http://www.ibm.com/digital_media_library"; 
/ns1:BOOK/ns1:CHAPTER[. contains("search XML using a namespace") and NUMBER = 1]'' ') = 1;

文档 #3 是唯一在正确名称空间中具有标记的文档,但它仅在数字值为 2 (而不是 1) 的章节中具有关键字匹配项。

未返回任何行。

表 5。 结果
标识
 

示例 6:

查找具有根元素 BOOK(在名称空间 “http://www.ibm.com/digital_media_library”中) 且具有直接后代 CHAPTER (在名称空间 “http://www.ibm.com/digital_media_library”中) 的所有文档。 CHAPTER 必须具有值为 1的直接后代 NUMBER (在名称空间 “http://www.ibm.com/digital_media_library”中)。 BOOK 必须具有包含有关搜索 XML 名称空间的文本信息的后代 CHAPTER (不一定具有 NUMBER 后代)。
SELECT ID 
FROM XMLTEST.XML_DOCUMENTS 
WHERE CONTAINS(XML_DATA, '@xmlxp:''declare namespace ns1 = "http://www.ibm.com/digital_media_library"; 
/ns1:BOOK[ns1:CHAPTER contains("search XML using a namespace")]/ns1:CHAPTER[ns1:NUMBER = 1]'' ') = 1;

文档 3 具有与 CONTAINS 条件匹配的 CHAPTER 元素,并且还具有具有值为 1的后代 NUMBERCHAPTER 元素。 因此,文档 3 是此查询的匹配项。

表 6。 结果
标识
3