可以对 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()条件。 但是,查询与标题中的“可自定义”一词不匹配,即全文 包含() 失败,但 Xquery 包含() 已满足。 通常,对于纯子字符串匹配,应删除全文 contains() 子句。
此外,全文搜索使用词词 下一个示例说明了这种差异。
示例:使用词干分析对 XML 值的全文搜索
XQuery 包含 在上一示例中执行的检查通常无法消除。 请看下面的查询:
SELECT *
FROM T
WHERE CONTAINS(xCol,'run')
文档中的单词“ran”符合搜索条件,是因为进行了词形还原处理。 此外,不会使用 XQuery 检查搜索上下文。
使用索引全文的 AXSD 将 XML 分解为关系列时,对 XML 视图发生的 XPath 查询不会对基础表执行全文搜索。