SQL Server のフルテキスト検索機能を用いて Word や PDF ファイルから日本語を検索する

Posted by

This post has been republished via RSS; it originally appeared at: New blog articles in Microsoft Community Hub.

こんにちは、 SQL Server サポート チームです。

 

本記事では SQL Server のフルテキスト検索機能を用いて Word PDF ファイルから日本語を検索するための手順を紹介します。

 

SQL Server のフルテキスト検索の詳細については下記ページをご参照ください。

https://learn.microsoft.com/ja-jp/sql/relational-databases/search/full-text-search?view=sql-server-ver16

 

事前準備

1. 現在のフィルターに Word PDF が対象になっているか確認します。

例えば、PDF を検索対象になっているかを確認するためには、下記クエリを実行します。

EXEC sp_help_fulltext_system_components 'filter', '.pdf';

 

上記クエリの実行結果が0件だった場合は、PDF ファイルが検索対象になっていないことを意味します。その場合は、既定で有効になっていないワード ブレーカーおよびフィルターを検索対象に含まれるように下記コマンドを実行します。

-- 署名されてないワード ブレーカーおよびフィルターをロードする EXEC sp_fulltext_service @action='verify_signature', @value=0; EXEC sp_fulltext_service @action='load_os_resources', @value=1; -- 言語の一覧を更新 EXEC sp_fulltext_service 'update_languages'; -- フィルター デーモン ホスト プロセス (fdhost.exe) を再起動 EXEC sp_fulltext_service 'restart_all_fdhosts';

 

PDF のフィルターが有効になっている場合は、以下のようにドライバーの情報が確認できます。

EXEC sp_help_fulltext_system_components 'filter', '.pdf';

 

出力結果例

componenttype 

componentname 

clsid 

fullpath 

version 

manufacturer 

filter 

.pdf 

6C337B26-3E38-4F98-813B-FBA18BAB64F5 

C:\Windows\system32\Windows.Data.Pdf.dll 

6.2.20348.1 

Microsoft Corporation 

 

Word を検索対象になっているかを確認するためには、下記クエリを実行します。

EXEC sp_help_fulltext_system_components 'filter', '.docx';

 

 

2. ワード ブレーカーの設定を行います。

これからの作業では、レジストリの値を変更します。万が一の場合に元の値に戻せるように、本作業を実施する前にレジストリのバックアップを取得してください。

 

2.1 現在の日本語用の [WBreakerClass]レジストリの値をメモします。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.<インスタンス名>\MSSearch\Language\jpn

prakashkc_0-1670465866914.png

 

2.2 ニュートラル用の [WBreakerClass]レジストリの値を上記で取得した日本語用の値で上書きします。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.<インスタンス名>\MSSearch\Language\Neutral

prakashkc_1-1670465866916.png

 

2.3 レジストリを変更したら、SQL Server を再起動します。

 

既にフルテキスト カタログの構築済みの場合は、ここでフルテキスト カタログの再構築を行います。

SQL Server Management Studio (SSMS) のオブジェクト エクスプローラーにて [対象のデータベース] > [ストレージ] > [フルテキスト カタログ] を順に展開し、対象のフルテキスト カタログを右クリック、[再構築] を選択します。

または、次の T-SQL を実行します。

ALTER FULLTEXT CATALOG <フルテキスト カタログ名> REBUILD

 

 

ここまでで日本語をフルテキスト検索の対象にするための準備が完了しました。


同様の設定に関して、以前 Windows Server 2008 R2 と SQL Server 2008 R2 で、Excel に関して同様の対処をご案内しておりましたが、バージョンによって GUID が異なるため、改めて本記事にて手順を案内させて頂きました。

https://support.microsoft.com/ja-jp/topic/windows-server-2008-r2-%E3%81%A7-excel-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-xls-%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%83%AB%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E6%A4%9C%E7%B4%A2%E3%81%8C%E8%A1%8C%E3%82%8F%E3%82%8C%E3%81%AA%E3%81%84-08e98b60-02e2-2716-fed8-2c87f845385c

 

日本語の検索方法

ここからは、実際にデータベースを作成して、日本語を検索するための手順を記載します。

1. 検証用のデータベース [Test] を作成します。

USE [master] GO CREATE DATABASE Test GO

 

2. 検証用のテーブル [Table_1] を作成します。

USE [Test] GO CREATE TABLE Table_1( col1_id uniqueidentifier NOT NULL, col2_data varbinary(MAX) NOT NULL, col3_ext varchar(10) NOT NULL, CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED (col1_id) ) GO

 

3. フルテキスト カタログとフルテキスト インデックスを作成します。

USE [Test] GO CREATE FULLTEXT CATALOG ftCatalog; GO CREATE FULLTEXT INDEX ON Table_1 KEY INDEX PK_Table1 ON ftCatalog; GO ALTER FULLTEXT INDEX ON Table_1 ADD (col2_data TYPE COLUMN col3_ext LANGUAGE Japanese); GO ALTER FULLTEXT INDEX ON Table_1 ENABLE; GO

 

4. 日本語を含めた PDF ファイルを用意し、検証用のデータを挿入します。

USE [Test] GO INSERT INTO Table_1 SELECT NEWID(), *, N'.pdf' FROM OPENROWSET(BULK N'C:\Temp\sample.pdf', SINGLE_BLOB) AS document

 

5. 日本語を用いてフルテキスト検索を実施します。

SELECT * FROM Table_1 WHERE CONTAINS(col2_data,'日本語')

 

出力結果例

col1_id 

col2_data

col3_ext

F93B232-B838-4BC3-8A49-AA2AC58488

0x255044462D312E370D0A25B5B5B5..

.pdf 

 

 


 

Please refer to this blog to search Japanese words included in Word or PDF files using SQL Server's Full-Text Search feature.

 

Regarding Full-Text Search, please refer to the following page.

https://learn.microsoft.com/en-us/sql/relational-databases/search/full-text-search?view=sql-server-ver16

 

Prerequisites

1. First of all we should check if the Word or PDF are included in the current filter or not.

For example, if we want to search if the PDF filter is active or not, then we run this query.

EXEC sp_help_fulltext_system_components 'filter', '.pdf';

 

If the result is 0 record, then PDF is not included in the filter. In that case, we need to run the following queries so that Full-Text Engine includes the word breakers and filters which are not included by default.

-- load the binaries without verifying EXEC sp_fulltext_service @action='verify_signature', @value=0; EXEC sp_fulltext_service @action='load_os_resources', @value=1; -- update the list of languages registered with full-text search EXEC sp_fulltext_service 'update_languages'; -- restart fdhost.exe EXEC sp_fulltext_service 'restart_all_fdhosts';

 

If PDF filters are active then, we can see the driver information like in the below table.

EXEC sp_help_fulltext_system_components 'filter', '.pdf';

 

Result:

componenttype 

componentname 

clsid 

fullpath 

version 

manufacturer 

filter 

.pdf 

6C337B26-3E38-4F98-813B-FBA18BAB64F5 

C:\Windows\system32\Windows.Data.Pdf.dll 

6.2.20348.1 

Microsoft Corporation 

 

If we want to search if the Word filter is active or not, then we run this query.

EXEC sp_help_fulltext_system_components 'filter', '.docx';

 

 

2. Make sure to change the word breaker registry value.

We will make some changes to the registry. Please take a backup of the registry so that you can restore back if something goes wrong.

2.1 Take a memo of the current Japanese [WBreakerClass] registry.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.<SQL Server Instance Name>\MSSearch\Language\jpn

 

2.2 Overwrite the current [WBreakerClass] registry for neutral with the value of Japanese [WBreakerClass] memoed at step 2.1.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.<SQL Server Instance Name>\MSSearch\Language\Neutral

 

2.3 restart SQL Server service.

 

※ If the full-text catalog is already built, a rebuild is required. It can be done either by SQL Server Management Studio (SSMS) or by running the following T-SQL command.

ALTER FULLTEXT CATALOG <full-text catalog name> REBUILD

 

 

Now, we are ready to search Japanese words from PDF using Full-Text Search.

 

Steps

Going forward, we will proceed to create a test database so that we can search Japanese words from a PDF file.

1. Create a [Test] database.

USE [master] GO CREATE DATABASE Test GO

 

2. Create a table [Table_1].

USE [Test] GO CREATE TABLE Table_1( col1_id uniqueidentifier NOT NULL, col2_data varbinary(MAX) NOT NULL, col3_ext varchar(10) NOT NULL, CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED (col1_id) ) GO

 

3. Create full-text catalog and full-text index.

USE [Test] GO CREATE FULLTEXT CATALOG ftCatalog; GO CREATE FULLTEXT INDEX ON Table_1 KEY INDEX PK_Table1 ON ftCatalog; GO ALTER FULLTEXT INDEX ON Table_1 ADD (col2_data TYPE COLUMN col3_ext LANGUAGE Japanese); GO ALTER FULLTEXT INDEX ON Table_1 ENABLE; GO

 

4. Create a sample pdf that contains Japanese characters with word [日本語].

USE [Test] GO INSERT INTO Table_1 SELECT NEWID(), *, N'.pdf' FROM OPENROWSET(BULK N'C:\Temp\sample.pdf', SINGLE_BLOB) AS document

 

5. Search for the Japanese word [日本語].

SELECT * FROM Table_1 WHERE CONTAINS(col2_data,'日本語')

 

Result

col1_id 

col2_data

col3_ext

F93B232-B838-4BC3-8A49-AA2AC58488

0x255044462D312E370D0A25B5B5B5..

.pdf 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.