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" が含まれる文字列を検索する場合、Xquery contains() とフルテキスト contains() の両方が満たされているため、"run"、"runs"、および "running" が検索結果に含まれます。 ただし、フルテキスト contains() が失敗するが、Xquery contains( ) が満たされるという点で、クエリはタイトルの "カスタマイズ可能" という単語と一致しません。 一般に、純粋部分文字列の一致の場合は、フルテキスト contains() 句を削除する必要があります。
さらに、フルテキスト検索では単語ステミングが使用されますが、XQuery contains() はリテラル一致です。 この違いを次の例に示します。
例: ステミングを使用した XML 値のフルテキスト検索
一般に、前の例で実行された XQuery contains() チェックは削除できません。 次のクエリについて考えてみます。
SELECT *
FROM T
WHERE CONTAINS(xCol,'run')
文書内の "ran" という単語は、ステミングによって検索条件と一致します。 さらに、検索コンテキストは XQuery を使用してチェックされません。
フルテキスト インデックスが作成された AXSD を使用して XML がリレーショナル列に分解された場合、XML ビューで発生する XPath クエリは、基になるテーブルに対してフルテキスト検索を実行しません。