对 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 查询不对基础表执行全文搜索。

另请参阅

XML 索引 (SQL Server)