对 XML 列使用全文搜索
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例
您可以对 XML 列创建全文索引,这种索引对 XML 值的内容进行索引,但忽略 XML 标记。 元素标记用作标记边界。 将对以下项进行索引:
XML 元素的内容。
仅限顶级元素的 XML 属性的内容,除非这些值是数值。
如有可能,可以按如下方式将全文搜索与 XML 索引结合起来:
首先,使用 SQL 全文搜索筛选感兴趣的 XML 值。
然后,查询那些使用 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 查询不对基础表执行全文搜索。