SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

フルテキスト インデックスについてのメモ (2015/5/17)

leave a comment

少し、フルテキスト インデックスについて調べる必要があったのでメモを。
以前投稿した、関連情報についてはこちらを。
フルテキストインデックスについての勉強メモ
SQL Database のフルテキスト検索 (プレビュー) を触ってみる
SQL Server 2012 のフルテキストインデックスで Office Open XML と PDF を検索

フルテキスト検索については
SQL Server 2012 フルテキスト検索の新機能(前編)
SQL Server 2012 フルテキスト検索の新機能(後編)
から情報を追うとよいかと思います。
# 本投稿も上記の記事をベースに調べていますので。

各種情報を調べるためには以下のカタログビュー / DMV / ストアドプロシージャを使用することができます。
フルテキスト検索およびセマンティック検索カタログ ビュー (Transact-SQL)
フルテキスト検索とセマンティック検索の動的管理ビューおよび関数 (Transact-SQL)
フルテキスト検索およびセマンティック検索ストアド プロシージャ (Transact-SQL)

フルテキスト インデックスで作成されているコンテンツを調べるための方法としては、
sys.dm_fts_index_keywords (Transact-SQL)
sys.dm_fts_index_keywords_by_document (Transact-SQL)
sys.dm_fts_index_keywords_by_property (Transact-SQL)
があります。

sys.dm_fts_index_keywords が上位の情報となり、この DMV でどのようなキーワードがフルテキストインデックスとして登録されているかを確認することができます。
この DMV からフルテキストインデックス全体として登録されている用語を確認することができます。

各ドキュメントでどのようにフルテキストインデックスが作成されているかについては、sys.dm_fts_index_keywords_by_document から確認をすることができます。

document_id がフルテキストインデックスのキー項目となるため、どの列のドキュメントに対して、どのようにインデックスが作成されているかはこちらの DMV から確認することができます。

使用方法としては以下のような形で。

SELECT * FROM sys.dm_fts_index_keywords( DB_ID(), OBJECT_ID('ftTest'))
SELECT * FROM sys.dm_fts_index_keywords_by_document ( DB_ID(), OBJECT_ID('ftTest')) WHERE document_id = 1

 

フルテキストインデックスを作成せずに、どのような形でワードが登録されるかを確認するためには、

sys.dm_fts_parser (Transact-SQL)

を使用します。

この DMF では特定の文字列がどのようにワードブレークされるかを確認することができます。

以下のようなクエリを実行します。

DECLARE @SearchQuery nvarchar(max) = N'<検索文字列>'
SELECT * FROM sys.dm_fts_parser( @SearchQuery, 1041, 0, 0)

image

special_term からどのようにマッチングしたかを確認することができます。

  • Extract match : 完全一致
  • Noise word : ノイズワード
  • End of Sentence : 文の末尾
  • End of Paragraph : 段落の末尾
  • End of Chapter : 章の末尾

ノイズワードについては、フルテキスト検索に使用するストップワードとストップリストの構成と管理 からストップワードを確認するとよいかと思います。

どのようなワードがストップワードとして登録されているかは、sys.fulltext_stopwords (Transact-SQL) から確認をすることができます。

日本語でストップワードとして登録されているものを調べる場合には、以下のようなクエリになります。

SELECT * FROM sys.fulltext_system_stopwords where language_id = 1041

これにより以下のようなワードが登録されていることが確認できます。

image

デフォルトでは、システム標準のストップリストが使用されるためカスタマイズしたい場合には、新しいストップリストを作成してそちらをメンテナンスすることで対応する形になるかと。

# 作成したストップリストを使用するように、フルテキストインデックスを設定する必要がありますが。

ワードブレーカーのカスタマイズについては、ユーザー辞書 (Custom Dictionary) を使用する形式が一般的になるでしょうか。

ユーザー辞書によるワード ブレーカーの動作のカスタマイズ

# カスタムワードブレーカーは私には敷居が高いです…。

   Getting the LRSAMPLE custom word-breaker to work on 64-bit SQL Server 2008

ユーザー辞書の一連の作成手順については、Creating Custom Dictionaries for special terms to be indexed ‘as-is’ in SQL Server 2008 Full-Text Indexes が参考になります。

ユーザー辞書の作成方法については、 ユーザー辞書を作成する (SharePoint Server 2010) から確認することができますが、「C:\Program Files\Microsoft SQL Server\<instance name>\MSSQL\Binn」に「Customxxxx.lex」(日本語の場合は Custom0011.lex) という Unicode 形式のテキストファイルを格納して、

exec sp_fulltext_service 'restart_all_fdhosts'

を実行して、「fdhost.exe」を再起動することで、作成したユーザー辞書が読み込まれます。

最初の状態では、

image

となっていたものが、このような辞書を登録することで、

image

以下のように結果が変わります。

image

特定の単語でワードブレイクしたい場合にはユーザー辞書を有効に使うとよいかもしれないですね。

ユーザー辞書を登録した場合、すでにコンテンツが登録されているインデックスに対しては再構築をしたタイミングで反映されそうなので、ユーザー定義辞書を作成した場合は、既存のコンテンツに対してのどのタイミングで反映するかを検討したほうがよさそうですね。

Share

Written by Masayuki.Ozawa

5月 17th, 2015 at 4:58 pm

Posted in SQL Server

Tagged with

Leave a Reply