XML 列的全文索引

您可以对 XML 列创建全文索引,这种索引对 XML 值的内容进行索引,但忽略 XML 标记。元素标记用作标记边界。将对以下项进行索引:

  • XML 元素的内容。

  • 仅限顶级元素的 XML 属性的内容,除非这些值是数值。

如有可能,可以按如下方式将全文搜索与 XML 索引结合起来:

  1. 首先,使用 SQL 全文搜索筛选感兴趣的 XML 值。

  2. 然后,查询那些使用 XML 列的 XML 索引的 XML 值。

示例:将全文搜索和 XML 查询结合起来

对 XML 列创建了全文索引后,下面的查询将检查 XML 值是否在书的标题中包含“custom”一词:

SELECT * 
FROM   T 
WHERE  CONTAINS(xCol,'custom') 
AND    xCol.exist('/book/title/text()[contains(.,"custom")]') =1

contains() 方法使用全文索引来将文档中任何位置包含“custom”一词的 XML 值组合为一个子集。exist() 子句确保“custom”一词出现在书的标题中。

使用 contains() 的全文搜索与 XQuery contains() 具有不同语义。后者是子字符串匹配,前者是使用词干匹配的标记匹配。因此,如果搜索标题中包含“run”的字符串,则匹配结果将包括“run”、“runs”和“running”,因为同时满足全文 contains() 和 Xquery contains()。但是,查询不匹配标题中的“customizable”一词,因为全文 contains() 失败,而满足 Xquery contains()。通常,对于纯子字符串匹配,应删除全文 contains() 子句。

此外,全文搜索使用词干匹配,而 XQuery contains() 是文字匹配。这一区别在下一个示例中进行说明。

示例:使用词干匹配对 XML 值进行全文搜索

通常不能消除上一个示例中执行的 XQuery contains() 检查。请看下面的查询:

SELECT * 
FROM   T 
WHERE  CONTAINS(xCol,'run') 

因为使用了词干匹配,所以文档中的“ran”一词匹配搜索条件。此外,不通过使用 XQuery 来检查搜索上下文。

当通过使用全文索引的 AXSD 将 XML 分解为关系列时,对 XML 视图执行的 XPath 查询不对基础表执行全文搜索。

请参阅

概念