フィルターとワード ブレーカーをカスタマイズする

適用対象:SQL Server

この記事では、SQL Server インスタンス Full-Text 検索フィルター、ワード ブレーカー、ステマーを表示およびカスタマイズする方法について説明します。

Azure SQL DatabaseやAzure SQL Managed Instanceでは、Windowsレジストリやホストファイルシステムへのアクセスが制限されるため、カスタマイズは許可されていません。

カスタマイズ プロセスは、フルテキスト インデックスのバージョンによって異なります。

  • フルテキスト インデックス バージョン 1 では、レジストリ ベースWindowsコンポーネントの登録が使用されます。 インスタンス固有のコンポーネント登録は、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceRoot>\MSSearchFilters、およびLanguageサブキーに分割されたCLSIDに格納されます。 sp_fulltext_service を使用して load_os_resources1 に設定すると、Full-Text Search は、インスタンス登録にない拡張子および LCID について HKEY_CLASSES_ROOT を検索するようになります。 詳細については、「 バージョン 1 のフィルターとワード ブレーカーのカスタマイズ」を参照してください。

  • フルテキスト インデックス バージョン 2 では、カスタマイズ プロセスが簡略化されます。 Windows レジストリを読み取る代わりに、インスタンスごとにオプションのversion_overrides.json ファイルを指定できます。 詳細については、「 バージョン 2 のフィルターとワード ブレーカーをカスタマイズする」を参照してください。

フルテキスト インデックスで使用されているバージョンを確認するには、sys.fulltext_indexesのindex_version列に対してクエリを実行します。 インデックスの作成または再構築時に使用されるバージョンを制御するには、 FULLTEXT_INDEX_VERSION データベース スコープ構成を使用します。

登録済みコンポーネントを表示する

概念の概要については、「フィルターの構成と管理」および「ワード ブレーカーとステマーの構成と管理」を参照してください。

すべての言語コンポーネントを表示するには、引数を指定してsp_help_fulltext_system_componentsを実行します。

EXECUTE sp_help_fulltext_system_components 'all';

sp_help_fulltext_system_components は、 FULLTEXT_INDEX_VERSION データベース スコープ構成で指定されたフルテキスト インデックス バージョンの登録済みコンポーネントを報告します。

バージョン 2 のフィルターとワード ブレーカーをカスタマイズする

対象:SQL Server 2025(17.x)以降のバージョン。

バージョン 2 のフルテキスト インデックスは、Windows レジストリを読み取りません。 バージョン 2 のワード ブレーカー、ステマー、フィルターをカスタマイズするには、このセクションの手順に従います。

  1. SQL Server 2025 (17.x) 以降のバージョンの既定のフルテキスト インデックス バージョンは バージョン 2 です。 バージョン 2 の既定の DLL ファイルは、 C:\Program Files\Microsoft SQL Server\MSSQL17.<instance-name>\MSSQL\Binn\ftcomponents\[filters|wordbreakers] ディレクトリにあります。

  2. デフォルトを上書きしたり新しいコンポーネントを追加するには、version_overrides.jsonディレクトリ内にC:\Program Files\Microsoft SQL Server\MSSQL17.<instance-name>\MSSQL\FTDataファイルを作成します。

  3. ワード ブレーカーを追加または置換するには、JSON ファイルの languages セクションを更新します。 フィルターの場合は、 doctypes セクションを更新します。

    JSON 構造の例:

    {
       "languages": {
             "en": [{
                "version": 2,
                "handler": "MSWB7.dll",
                "wbClsid": "9faed859-0b30-4434-ae65-412e14a16fb8",
                "stemmerClsid": "e1e5ef84-c4a6-4e50-8188-99aef3de2659"
             }],
             "<BCP 47 locale name>": [{ ... }],
          }
    
       "doctypes": {
             ".html": [{
                "version": 2,
                "handler": "nlhtml.dll",
                "clsid": "e0ca5340-4534-11cf-b952-00aa0051fe20"
             }],
             ".<extension 2>": [{ ... }],
          }
    }
    

    version_overrides.json ファイルには、次の規則を考慮してください。

    • JSON ファイル内のすべてのフィールドは、 stemmerClsid (省略可能) を除いて必須です。

    • ロケール名には、標準ロケール名に従って、任意の BCP 47 ロケール名を指定できます。

    • 同じ言語とバージョン、または拡張とバージョンに対して重複エントリが存在する場合、最新のエントリが優先されます。

    • ハンドラー DLL は、既定のバイナリが配置されている C:\Program Files\Microsoft SQL Server\MSSQL17.<instance-name>\MSSQL\Binn\ftcomponents\[filters|wordbreakers] ディレクトリに関連するファイルへの相対パスにすることができます。 また、絶対パスを指定することもできます。 たとえば、次の JSON ファイルを使用すると、組み込みのWindows PDF フィルターを使用して PDF のインデックスを作成できます。

    {
       "doctypes": {
          ".pdf": [
             {
                "version": 2,
                "handler": "%SystemRoot%\\system32\\windows.data.pdf.dll",
                "clsid": "6C337B26-3E38-4F98-813B-FBA18BAB64F5"
             }
          ]
       }
    }
    

    重要

    署名済みコンポーネントと検証済みコンポーネントのみを読み込む必要があります。 DLL ファイルおよび ACL を含むフォルダーに正しいアクセス制御リスト (ACL) を構成します。 また、FDHOST Launcher (MSSQLFDLauncher) サービスは、最小限の特権で実行する必要があります。

  4. sp_fulltext_serviceを使用して、正確な DMV レポートのために言語とドキュメントの種類の内部リストを更新します。

    EXECUTE sp_fulltext_service 'update_languages';
    
  5. フィルター デーモン ホスト プロセス (fdhost.exe) を再起動して、今後のクエリやデータ更新における上書きを有効にします。

    EXECUTE sp_fulltext_service 'restart_all_fdhosts';
    

例: カスタム ドキュメント拡張機能をサポートする

シナリオ: .myextensionのような独自のカスタム拡張子でファイルのインデックス作成をサポートしたい場合。

  1. sys.fulltext_document_typesまたはsp_help_fulltext_system_components 'filter'を使用して、関連付けられているドキュメント クラスの既存のインストール済みフィルター ハンドラーを検索します。 プレーンテキストの場合、次に例を示します。

    ALTER DATABASE SCOPED CONFIGURATION
        SET FULLTEXT_INDEX_VERSION = 1;
    GO
    
    SELECT *
    FROM sys.fulltext_document_types
    WHERE document_type = '.txt';
    
  2. 上記のversion_overrides.jsonFTDataを使用して、class_id ディレクトリ内のpathを作成または更新します。 この場合、次のようになります。

    {
       "doctypes": {
          ".myextension": [
             {
                "version": 2,
                "handler": "%SystemRoot%\\system32\\query.dll",
                "clsid": "C1243CA0-BF96-11CD-B579-08002B30BFEB"
             }
          ]
       }
    }
    
  3. 登録済みコンポーネントの一覧を更新し、フィルター デーモン ホスト プロセスを再起動します。

    EXECUTE sp_fulltext_service 'update_languages';
    EXECUTE sp_fulltext_service 'restart_all_fdhosts';
    

例: サード パーティ製フィルターをインストールする (Foxit PDF IFilter)

  1. サード パーティ製のインストール ドキュメントに従います。 Foxit PDF IFilter については、「 Foxit PDF エディター用の IFilter アドオンをダウンロードする方法」を参照してください。

    インストーラーは通常、登録情報を HKCR に書き込み、バイナリを Program Files の下に配置します。

  2. version_overrides.json ディレクトリにFTDataを作成または更新します。

    {
       "doctypes": {
          ".pdf": [
             {
                "version": 2,
                "handler": "C:\\Program Files\\Foxit Software\\Foxit PDF IFilter\\PDFFilt.dll",
                "clsid": "987f8d1a-26e6-4554-b007-6b20e2680632"
             }
          ]
       }
    }
    
  3. 登録済みコンポーネントの一覧を更新し、フィルター デーモン ホスト プロセスを再起動します。

    EXECUTE sp_fulltext_service 'update_languages';
    EXECUTE sp_fulltext_service 'restart_all_fdhosts';
    

CLSID を検索する

公開ドキュメントに記載されていない場合に CLSID を見つける最も簡単な方法は、sp_help_fulltext_system_componentsFULLTEXT_INDEX_VERSION = を使用して DMV または 1 を照会するか、古い SQL Server インスタンスから取得することです。

影響を受けるレジストリ キーを確認することもできます。 たとえば、PDF フィルターをインストールすると、HKCR\.pdf\PersistentHandler が更新されます。 その後、その PH CLSID を取得し、コンポーネント CLSID を HKEY_CLASSES_ROOT\CLSID\{PH CLSID}\PersistentAddinsRegistered\{Component CLSID}として見つけることができます。

バージョン 1 のフィルターとワード ブレーカーをカスタマイズする

適用対象: SQL Server 2025 (17.x) 以前のバージョン。

バージョン 1 のフルテキスト インデックスでは、Windows レジストリを使用してフィルター、ワード ブレーカー、ステミング機能を解決します。 これは、index_version = 1を引き続き使用する SQL Server 2025 (17.x) インデックスと、以前のSQL Server バージョンのフルテキスト インデックスに適用されます。

バージョン 1 のコンポーネント参照では、次の順序が使用されます。

  1. 一致する拡張機能については HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceRoot>\MSSearch\Filters の下で、一致する LCID については HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceRoot>\MSSearch\Languages の下で行うインスタンス固有の登録。
  2. オペレーティング システム リソースの読み込みがHKEY_CLASSES_ROOTを介して有効になっている場合は、HKCR (sp_fulltext_service 'load_os_resources') でのシステム登録。

インスタンス固有の登録が優先されます。 オペレーティング システムの登録やその他のインストール済みインスタンスとは異なるコンポーネントをSQL Server インスタンスで使用する場合に変更します。

バージョン 1 コンポーネントのインストールと読み込み

  1. 新しいワード ブレーカーまたはフィルターを含む DLL ファイルをインストールする前に、サーバー インスタンスにインストールされている既存の DLL ファイルとは異なるファイル名があることを確認してください。

  2. サーバー インスタンスの標準 SQL Server DLL ファイルが格納されているディレクトリに新しい DLL ファイルをコピーします。 既定の場所は次のとおりです。

    C:\Program Files\Microsoft SQL Server\MSSQL.<instance_name>\MSSQL\Binn
    
  3. ドキュメントに従って、新しいワード ブレーカーまたはフィルターをインストールします。

  4. sp_fulltext_service を使用して、新しくインストールされたワード ブレーカーおよびフィルターをサーバー インスタンスに読み込みます。次に例を示します。

    EXECUTE sp_fulltext_service
        @action = 'load_os_resources',
        @value = 1;
    
  5. sp_fulltext_service を使用して、言語の一覧を更新します。次に例を示します。

    EXECUTE sp_fulltext_service 'update_languages';
    
  6. fdhost.exe を使用して、フィルター デーモン ホスト プロセス (sp_fulltext_service) を再起動します。次に例を示します。

    EXECUTE sp_fulltext_service 'restart_all_fdhosts';
    

例: カスタム ドキュメント拡張機能をサポートする

シナリオ:既存のフィルターを使って、 .myextensionなどの独自のカスタム拡張子でファイルのインデックス作成をサポートしたい場合。

  1. 再利用するフィルターの CLSID を見つけます。 たとえば、プレーンテキスト フィルターを再利用するには、バージョン 1 のコンポーネント レポートで .txt 登録を調べます。

    ALTER DATABASE SCOPED CONFIGURATION
        SET FULLTEXT_INDEX_VERSION = 1;
    GO
    
    SELECT *
    FROM sys.fulltext_document_types
    WHERE document_type = '.txt';
    
  2. 新しい拡張機能のインスタンス固有のレジストリ エントリを追加します。 拡張エントリは .myextension をフィルター CLSID にマップし、 CLSID エントリはその CLSID をフィルター DLL にマップします。

    次の例では、従来のプレーンテキスト フィルター CLSID と msfte.dllを使用します。

    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceRoot>\MSSearch\Filters\.myextension" /ve /t REG_SZ /d "{C7310720-AC80-11D1-8DF3-00C04FB6EF4F}" /f
    

    <InstanceRoot>を、MSSQL16.MSSQLSERVERなどのSQL Serverインスタンス ルートに置き換えます。

  3. 登録済みコンポーネントの一覧を更新し、フィルター デーモン ホスト プロセスを再起動します。

    EXECUTE sp_fulltext_service 'update_languages';
    EXECUTE sp_fulltext_service 'restart_all_fdhosts';
    

例: サード パーティ製フィルターをインストールする (Foxit PDF IFilter)

シナリオ: バージョン 1 のフルテキスト インデックスで、Windows に登録されているサードパーティ製の PDF IFilter を使用したい。

  1. サード パーティ製のインストール ドキュメントに従います。 Foxit PDF IFilter については、「 Foxit PDF エディター用の IFilter アドオンをダウンロードする方法」を参照してください。

  2. SQL Server インスタンスにHKCRのインスタンス固有の登録がない場合に、バージョン 1 のコンポーネント参照を.pdfにフォールバックできるように、オペレーティング システム リソースの読み込みを有効にします。

    EXECUTE sp_fulltext_service
        @action = 'load_os_resources',
        @value = 1;
    
  3. 登録済みコンポーネントの一覧を更新し、フィルター デーモン ホスト プロセスを再起動します。

    EXECUTE sp_fulltext_service 'update_languages';
    EXECUTE sp_fulltext_service 'restart_all_fdhosts';
    

HKCRフォールバックに依存しない場合は、代わりにインスタンス固有のMSSearch\FiltersMSSearch\CLSID.pdfエントリを追加します。 インスタンス固有のエントリは、システム登録よりも優先されます。