適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
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" が使用されている文字列を検索する場合、フルテキスト contains() と XQuery contains() をいずれも満たすため、"run"、"runs"、および "running" が検出されます。 ただし、そのクエリはタイトル内の語句 "customizable" には一致しません。つまり、フルテキスト contains() は失敗しますが、XQuery contains() は満たされます。 一般に純粋な部分文字列の検索を行うには、フルテキストの contains() 句を削除する必要があります。
さらに、フルテキスト検索では語幹抽出が使用されますが、XQuery contains() はリテラル一致です。 両者の違いを次の例で示します。
例 : ステミングを使用した XML 値のフルテキスト検索
上記の例で行った XQuery contains() による確認は、通常は省略できません。 次のクエリについて考えてみます。
SELECT *
FROM T
WHERE CONTAINS(xCol,'run');
ドキュメント内で語 "ran" が使用されていると、ステミングによりこの検索条件に一致します。 また、XQuery では検索コンテキストは確認されません。
フルテキスト インデックスが作成された AXSD を使用して XML をリレーショナル列に分解した場合、XML ビューに XPath クエリを実行しても基になるテーブルのフルテキスト検索は行われません。