次の方法で共有


フルテキスト検索

SQL Server と Azure SQL Database のフルテキスト検索を使用すると、ユーザーやアプリケーションは、SQL Server のテーブルの文字ベースのデータに対して、フルテキスト クエリを実行できます。 テーブルに対してフルテキスト クエリを実行する前に、データベース管理者はテーブルにフルテキスト インデックスを作成する必要があります。 フルテキスト インデックスには、テーブル内に 1 つ以上の文字ベースの列が含まれています。 これらの列には、 charvarcharncharnvarchartextntextimagexmlvarbinary(max) 、FILESTREAM のいずれかのデータ型を使用できます。 各フルテキスト インデックスはテーブルの 1 つ以上の列にインデックスを付け、各列は特定の言語を使用できます。

フルテキスト クエリでは、英語や日本語などの特定の言語のルールに基づいて単語や語句を操作して、フルテキスト インデックス内のテキスト データに対して言語検索を実行します。 フルテキスト クエリには、単純な単語や語句、または複数の形式の単語または語句を含めることができます。 フルテキスト クエリは、少なくとも 1 つの一致 ( ヒットとも呼ばれます) を含むドキュメントを返します。 一致は、ターゲット ドキュメントにフルテキスト クエリで指定されたすべての用語が含まれており、一致する用語間の距離など、その他の検索条件を満たしている場合に発生します。

フルテキスト検索は、SQL Server データベース エンジンのオプション コンポーネントです。 詳細については、「 SQL Server 2014 のインストール」を参照してください。

Full-Text 検索でできること

フルテキスト検索は、ビジネスシナリオの幅広い範囲に適用できます。例えば、Webサイトでアイテムを検索する電子ビジネス、法務データリポジトリ内でケース履歴を検索する法律事務所、保存された履歴書とジョブの説明を一致させる人事部門などです。 フルテキスト検索の基本的な管理タスクと開発タスクは、ビジネス シナリオに関係なく同等です。 ただし、特定のビジネス シナリオでは、ビジネス目標を達成するためにフルテキスト インデックスとクエリを磨くことができます。 たとえば、e-business の場合、結果のランク付け、再現率 (フルテキスト クエリによって実際に返される既存の一致の数)、または複数の言語をサポートするよりも、パフォーマンスを最大化することが重要な場合があります。 法律事務所にとっては、あらゆる可能な検索結果を取得すること(情報の完全な検索結果の取得)が最も重要な考慮事項である場合があります。

このトピックについて

Full-Text 検索クエリ

列がフルテキスト インデックスに追加されると、ユーザーとアプリケーションは列内のテキストに対してフルテキスト クエリを実行できます。 これらのクエリでは、次のいずれかを検索できます。

  • 1 つ以上の特定の単語または語句 (単純な用語)

  • 単語が指定したテキスト (プレフィックス用語) で始まる単語または語句

  • 特定の単語の変曲形 (生成用語)

  • 別の単語または語句に近い単語または語句 (近接用語)

  • 特定の単語の類義語辞典 (類義語辞典)

  • 重み付け値を使用する単語または語句 (重み付け用語)

フルテキスト クエリでは、大文字と小文字は区別されません。 たとえば、"Aluminum" または "aluminum" を検索すると、同じ結果が返されます。

フルテキスト クエリでは、少数の Transact-SQL 述語 (CONTAINS および FREETEXT) と関数 (CONTAINSTABLE および FREETEXTTABLE) が使用されます。 ただし、特定のビジネス シナリオの検索目標は、フルテキスト クエリの構造に影響します。 例えば次が挙げられます。

  • eビジネス: Webサイトでの製品検索

    SELECT product_id 
    FROM products 
    WHERE CONTAINS(product_description, "Snap Happy 100EZ"
        OR FORMSOF(THESAURUS,'Snap Happy')
        OR '100EZ') 
    AND product_cost < 200 ;
    
  • 採用シナリオ - SQL Server の使用経験がある求職者の検索:

    SELECT candidate_name,SSN 
    FROM candidates 
    WHERE CONTAINS(candidate_resume,"SQL Server") AND candidate_division = 'DBA';
    

詳細については、「 Full-Text 検索を使用したクエリ」を参照してください。

このトピックについて

LIKE と Full-Text Search の比較

フルテキスト検索とは異なり、LIKETransact-SQL 述語は、文字パターンにのみで動作します。 また、フォーマットされたバイナリ データのクエリには LIKE 述語を使用できません。 さらに、構造化されていない大量のテキスト データに対して LIKE クエリを実行すると、同じデータに対して同等のフルテキスト検索を実行する場合に比べてはるかに時間がかかります。 数百万行のテキスト データに対して LIKE クエリを実行すると、結果が得られるまでに数分かかる場合があります。一方、同じデータに対してフルテキスト クエリを実行すると、返される行数にもよりますが、数秒以内で結果を取得できます。

このトピックについて

Full-Text 検索のコンポーネントとアーキテクチャ

フルテキスト検索アーキテクチャは、次のプロセスで構成されます。

  • SQL Server プロセス (sqlservr.exe)。

  • フィルター デーモン ホスト プロセス (fdhost.exe)。

    セキュリティ上の理由から、フィルターはフィルター デーモン ホストと呼ばれる個別のプロセスによって読み込まれます。 fdhost.exe プロセスは FDHOST ランチャー サービス (MSSQLFDLauncher) によって作成され、FDHOST ランチャー サービス アカウントのセキュリティ資格情報で実行されます。 そのため、フルテキスト インデックス作成とフルテキスト クエリを機能させるには、FDHOST ランチャー サービスが実行されている必要があります。 このサービスのサービス アカウントの設定については、「 フルテキスト フィルター デーモン ランチャーのサービス アカウントを設定する」を参照してください。

これら 2 つのプロセスには、フルテキスト検索アーキテクチャのコンポーネントが含まれています。 これらのコンポーネントとその関係を次の図にまとめます。 コンポーネントについては、図の後で説明します。

フルテキスト検索アーキテクチャ

このトピックについて

SQL Server プロセス

SQL Server プロセスでは、フルテキスト検索に次のコンポーネントが使用されます。

  • ユーザー テーブル。 これらのテーブルには、フルテキスト インデックスを作成するデータが含まれています。

  • フルテキスト 収集ツール。 フルテキスト 収集ツールは、フルテキスト クロール スレッドで動作します。 フルテキスト インデックスの作成のスケジュール設定と推進、およびフルテキスト カタログの監視も担当します。

  • 類義語辞典ファイル。 これらのファイルには、検索語句のシノニムが含まれています。 詳細については、「 Full-Text 検索のための類義語辞典ファイルの構成と管理」を参照してください。

  • ストップリスト オブジェクト。 ストップリスト オブジェクトには、検索に役立たない一般的な単語の一覧が含まれています。 詳細については、「 フルテキスト検索に使用するストップワードとストップリストの構成と管理」を参照してください。

  • SQL Server クエリ プロセッサ。 クエリ プロセッサは、SQL クエリをコンパイルして実行します。 SQL クエリにフルテキスト検索クエリが含まれている場合、クエリはコンパイル中と実行中の両方で、Full-Text エンジンに送信されます。 クエリ結果はフルテキスト インデックスと照合されます。

  • Full-Text エンジン。 SQL Server の Full-Text エンジンは、クエリ プロセッサと完全に統合されています。 Full-Text エンジンは、フルテキスト クエリをコンパイルして実行します。 クエリの実行の一環として、Full-Text エンジンは類義語辞典とストップリストから入力を受け取る場合があります。

  • インデックス ライター (インデクサー)。 インデックス ライターは、インデックス付きトークンの格納に使用される構造体を構築します。

  • フィルター デーモン マネージャー。 フィルター デーモン マネージャーは、Full-Text エンジン フィルター デーモン ホストの状態を監視します。

このトピックについて

フィルター デーモン ホスト プロセス

フィルター デーモン ホストは、Full-Text エンジンによって開始されるプロセスです。 次のフルテキスト検索コンポーネントが実行されます。このコンポーネントは、テーブルからのデータのアクセス、フィルター処理、単語区切り、およびクエリ入力の単語区切りとステミングを担当します。

フィルター デーモン ホストのコンポーネントは次のとおりです。

  • プロトコル ハンドラー。 このコンポーネントは、さらに処理するためにメモリからデータをプルし、指定されたデータベースのユーザー テーブルからデータにアクセスします。 その役割の 1 つは、フルテキスト インデックスが作成されている列からデータを収集し、必要に応じてフィルター処理とワード ブレーカーを適用するフィルター デーモン ホストに渡すことです。

  • フィルター。 一部のデータ型では、 varbinaryvarbinary(max)image、または xml 列のデータなど、ドキュメント内のデータにフルテキスト インデックスを作成する前にフィルター処理が必要です。 特定のドキュメントに使用されるフィルターは、そのドキュメントの種類によって異なります。 たとえば、Microsoft Word (.doc) ドキュメント、Microsoft Excel (.xls) ドキュメント、XML (.xml) ドキュメントには、さまざまなフィルターが使用されます。 次に、フィルターによってドキュメントからテキストのチャンクが抽出され、埋め込まれた書式設定が削除され、テキストが保持され、テキストの位置に関する情報が保持される可能性があります。 結果はテキスト情報のストリームです。 詳細については、「 検索のフィルターの構成と管理」を参照してください。

  • ワード ブレーカーとステマー。 ワード ブレーカーは、特定の言語の字句規則 (単語区切り) に基づいて単語の境界を検索する言語固有のコンポーネントです。 各ワード ブレーカーは、動詞を結合し、変曲拡張を実行する言語固有のステマー コンポーネントに関連付けられています。 インデックス作成時に、フィルター デーモン ホストはワード ブレーカーとステマーを使用して、特定のテーブル列のテキスト データに対して言語分析を実行します。 フルテキスト インデックスのテーブル列に関連付けられている言語によって、列のインデックス作成に使用されるワード ブレーカーとステマーが決まります。 詳細については、「 検索用のワード ブレーカーとステマーの構成と管理」を参照してください。

このトピックについて

Full-Text 検索処理

フルテキスト検索は、Full-Text エンジンを利用します。 Full-Text エンジンには、インデックス作成のサポートとクエリのサポートという 2 つのロールがあります。

Full-Text インデックス作成プロセス

フルテキスト作成 (クロールとも呼ばれます) が開始されると、Full-Text エンジンは大量のデータバッチをメモリにプッシュし、フィルター デーモン ホストに通知します。 ホストは、データをフィルター処理して単語を分割し、変換されたデータを逆ワード リストに変換します。 フルテキスト検索では、変換されたデータがワード リストからプルされ、ストップワードを削除するデータが処理され、バッチの単語リストが 1 つ以上の逆インデックスに保持されます。

varbinary(max)またはimage列に格納されているデータのインデックスを作成する場合、IFilter インターフェイスを実装するフィルターは、そのデータの指定されたファイル形式 (Microsoft Word など) に基づいてテキストを抽出します。 場合によっては、フィルター コンポーネントでは、メモリにプッシュされるのではなく、 varbinary(max)または image データを filterdata フォルダーに書き込む必要があります。

処理の一環として、収集されたテキスト データはワード ブレーカーを介して渡され、テキストが個々のトークンまたはキーワードに分割されます。 トークン化に使用される言語は、列レベルで指定するか、フィルター コンポーネントによって varbinary(max)image、または xml データ内で識別できます。

ストップワードを削除し、フルテキスト インデックスまたはインデックス フラグメントに格納する前にトークンを正規化するために、追加の処理を実行できます。

作成が完了すると、最終的なマージ プロセスが起動され、インデックス フラグメントが 1 つのマスター フルテキスト インデックスにマージされます。 これにより、多数のインデックス フラグメントではなく、1 つのマスター インデックスのみをクエリすれば済むため、クエリのパフォーマンスが向上し、関連順位付けにもより的確なスコア (評価) 統計を適用できます。

このトピックについて

Full-Text クエリ 処理

クエリ プロセッサは、クエリのフルテキスト部分を Full-Text エンジンに渡して処理します。 Full-Text エンジンは単語区切りを実行し、必要に応じて類義語辞典の拡張、ステミング、ストップワード (ノイズ ワード) 処理を実行します。 その後、クエリのフルテキスト部分は、主にストリーミング テーブル値関数 (STVF) として、SQL 演算子の形式で表されます。 クエリの実行中に、これらの STVF は逆インデックスにアクセスして正しい結果を取得します。 結果は、この時点でクライアントに返されるか、クライアントに返される前にさらに処理されます。

このトピックについて

Full-Text 検索での言語コンポーネントと言語サポート

フルテキスト検索では、英語、スペイン語、中国語、日本語、アラビア語、バングラ語、ヒンディー語など、約 50 の多様な言語がサポートされています。 サポートされているフルテキスト言語の完全な一覧については、「 sys.fulltext_languages (Transact-SQL)」を参照してください。 フルテキスト インデックスに含まれる各列は、フルテキスト検索でサポートされている言語に相当する Microsoft Windows ロケール識別子 (LCID) に関連付けられます。 たとえば、LCID 1033 は米国英語に相当し、LCID 2057 は英国英語に相当します。 サポートされているフルテキスト言語ごとに、SQL Server には、その言語に格納されているフルテキスト データのインデックス作成とクエリをサポートする言語コンポーネントが用意されています。

言語固有のコンポーネントには、次のものが含まれます。

  • ワード ブレーカーとステマー。 ワード ブレーカーは、特定の言語の字句規則 (単語区切り) に基づいて単語の境界を検索します。 各ワード ブレーカーは、同じ言語の動詞を結合するステマーに関連付けられています。 詳細については、「 検索用のワード ブレーカーとステマーの構成と管理」を参照してください。

  • ストップリスト。 基本的なセット ストップワード (ノイズ ワードとも呼ばれます) を含むシステム ストップリストが提供されます。 ストップワードは検索に役立たない単語であり、フルテキスト クエリでは無視されます。 たとえば、"a"、"and"、"is"、"the" などの英語のロケールの単語はストップワードと見なされます。 通常、1 つ以上の類義語辞典ファイルとストップリストを構成する必要があります。 詳細については、「 フルテキスト検索に使用するストップワードとストップリストの構成と管理」を参照してください。

  • 類義語辞典ファイル。 SQL Server では、フルテキスト言語ごとに類義語辞典ファイルと、グローバル類義語辞典ファイルもインストールされます。 インストールされている類義語辞典ファイルは基本的に空ですが、それらを編集して、特定の言語またはビジネス シナリオのシノニムを定義できます。 フルテキスト データに合わせた類義語辞典を開発することで、そのデータに対するフルテキスト クエリの範囲を効果的に広げることができます。 詳細については、「 Full-Text 検索のための類義語辞典ファイルの構成と管理」を参照してください。

  • フィルター (iFilters)。 varbinary(max)image、またはxmlデータ型の列でドキュメントのインデックスを作成するには、追加の処理を実行するためのフィルターが必要です。 フィルターは、ドキュメントの種類 (.doc、.pdf、.xls、.xmlなど) に固有である必要があります。 詳細については、「 検索のフィルターの構成と管理」を参照してください。

ワード ブレーカー (およびステマー) とフィルターは、フィルター デーモン ホスト プロセス (fdhost.exe) で実行されます。

このトピックについて

関連タスク

このトピックについて

関連コンテンツ

このトピックについて