XML 列でのフルテキスト検索の使用

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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" が使用されている文字列を検索する場合、フルテキスト contains() と XQuery contains() をいずれも満たすため、"run"、"runs"、および "running" が検出されます。 ただし、この例のクエリでは語 "customizable" が書名に使用されている場合、XQuery contains() は満たしますが、フルテキストcontains()では失敗し、検出されません。 一般に純粋な部分文字列の検索を行うには、フルテキストの contains() 句を削除する必要があります。

さらに、フルテキスト検索ではステマーが使用されますが、XQuery contains() はリテラルの照合です。 両者の違いを次の例で示します。

例 : ステミングを使用した XML 値のフルテキスト検索

上記の例で行った XQuery contains() による確認は、通常は省略できません。 次のクエリについて考えてみます。

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

ドキュメント内で語 "ran" が使用されていると、ステミングによりこの検索条件に一致します。 また、XQuery では検索コンテキストは確認されません。

フルテキスト インデックスが作成された AXSD を使用して XML をリレーショナル列に分解した場合、XML ビューに XPath クエリを実行しても基になるテーブルのフルテキスト検索は行われません。

関連項目