トップ回答者
フルテキスト検索の類義語辞典の編集について

質問
-
SQL Server 2008 Workgroup 64bit を使用しています。
日本語の類義語の設定ファイルtsjpn.xml に日本語が含まれると、読込に失敗します。
[tsjpn.xml]
<XML ID="Microsoft Search Thesaurus">
<thesaurus xmlns="x-schema:tsSchema.xml">
<diacritics_sensitive>0</diacritics_sensitive>
<expansion>
<sub>マイクロソフト</sub>
<sub>Microsoft</sub>
</expansion>
</thesaurus>
</XML>
use database;
EXEC sys.sp_fulltext_load_thesaurus_file 1041;
メッセージ 50000、レベル 16、状態 1、プロシージャ sp_fulltext_rethrow_error、行 36
Error 30049, Level 16, State 1, Procedure sp_fulltext_thesaurus_update, Line 61, Message: フルテキスト類義語辞典の内部エラー (HRESULT = '0x8007054e')
日本語が含まれていない場合は、読込は成功します。
設定ファイルのエンコードは、Unicode系でUTF-8.UTF-7 でBomありでもなしも、というかどのエンコードでやっても上記のエラーが発生します。
また日本語全てが失敗するのではなく、短いものはエラーが発生しません。
ys.dm_fts_parser で確認すると、拡張されています。
<XML ID="Microsoft Search Thesaurus">
<thesaurus xmlns="x-schema:tsSchema.xml">
<diacritics_sensitive>0</diacritics_sensitive>
<expansion>
<sub>ああ</sub>
<sub>いい</sub>
</expansion>
</thesaurus>
</XML>
ネットで検索すると、このような現象は、自分の所だけのようです。
原因として何が考えられるでしょうか?
回答
-
TPN32 さん、こんにちは。マイクロソフトの石田です。
このエラーは DBCS (double-byte character set / 日本語、中国語、韓国語など) の照合順序に設定されたデータベースにおいて、DBCS 文字を含む類義語辞典ファイルをロードした場合に発生する可能性があります。
対処方法といたしましては、SBCS (single-byte character set) 照合順序に設定されたデータベース上で類義語辞典ファイルをロードすることによって回避することが可能です。
現在ご使用の SQL Server 2008 において、SBCS 照合順序のデータベースが存在しない場合は、一時的に SBCS 照合順序のデータベースを作成していただき、そのデータベースへ移動した後に、類義語辞典ファイルをロードしてください。
ご参考までに、一時的に SBCS 照合順序のデータベースを作成し、類義語辞典ファイルをロードするサンプル スクリプトを以下にご紹介いたします。
-- (1) SBCS 照合順序 である SQL_Latin1_General_CP1_CI_AS でデータベースを作成
USE master
GO
CREATE DATABASE temp_sbcs COLLATE SQL_Latin1_General_CP1_CI_AS
GO
-- (2) 作成したデータベースへ移動
USE temp_sbcs
GO
-- (3) 類義語辞典ファイルのロード
EXEC sys.sp_fulltext_load_thesaurus_file 1041
GO
-- (4) データベースの削除
USE master
GO
DROP DATABASE temp_sbcs
GO- 回答としてマーク 菊地俊介 2009年9月11日 8:55
-
TPN32 さん、こんにちは。マイクロソフトの石田です。
類義語辞典ファイルのロードに関する問題が解決して何よりです。類義語辞典を使用した検索方法ですが、以下の SQL Server 2008 オンライン ブックを参照する限りでは、
THESAURUS 以下は <simple term> となっているので、この中で OR や AND の演算子は使えないようです。以下の SQL Server 2008 オンライン ブック (2009 年 5 月)
CONTAINS (Transact-SQL)
http://technet.microsoft.com/ja-jp/library/ms187787.aspxFORMSOF ( { INFLECTIONAL | THESAURUS } , < simple_term > [ ,...n ] )
残念がら、TPN32 さんが既に書かれている方法か、少しシンプルに以下のように検索ワードをカンマ区切りで
複数指定するような方法になるかと思います。WHERE CONTAINS(*, 'FORMSOF(THESAURUS, "日本", "韓国")')
- 回答としてマーク 菊地俊介 2009年9月11日 8:55
すべての返信
-
TPN32 さん、こんにちは。マイクロソフトの石田です。
このエラーは DBCS (double-byte character set / 日本語、中国語、韓国語など) の照合順序に設定されたデータベースにおいて、DBCS 文字を含む類義語辞典ファイルをロードした場合に発生する可能性があります。
対処方法といたしましては、SBCS (single-byte character set) 照合順序に設定されたデータベース上で類義語辞典ファイルをロードすることによって回避することが可能です。
現在ご使用の SQL Server 2008 において、SBCS 照合順序のデータベースが存在しない場合は、一時的に SBCS 照合順序のデータベースを作成していただき、そのデータベースへ移動した後に、類義語辞典ファイルをロードしてください。
ご参考までに、一時的に SBCS 照合順序のデータベースを作成し、類義語辞典ファイルをロードするサンプル スクリプトを以下にご紹介いたします。
-- (1) SBCS 照合順序 である SQL_Latin1_General_CP1_CI_AS でデータベースを作成
USE master
GO
CREATE DATABASE temp_sbcs COLLATE SQL_Latin1_General_CP1_CI_AS
GO
-- (2) 作成したデータベースへ移動
USE temp_sbcs
GO
-- (3) 類義語辞典ファイルのロード
EXEC sys.sp_fulltext_load_thesaurus_file 1041
GO
-- (4) データベースの削除
USE master
GO
DROP DATABASE temp_sbcs
GO- 回答としてマーク 菊地俊介 2009年9月11日 8:55
-
マイクロソフトの石田さん
ありがとうございました。
解決しました。
こんどはこのような問題がでてきました。
類義語を使わない場合は、以下のようにandやorを使えました。
select *
from テーブル
where contains(*, '日本 or 韓国')
類義語辞典を使う場合は、以下のようにすると、単に"日本"、"韓国" でAND検索するようです。
where contains(*, 'FORMSOF( THESAURUS, "日本 or 韓国") ')
こんな風にやればできるようですが、検索の指定部分だけを変えることで実現できないでしょうか?
where contains(*, 'FORMSOF( THESAURUS, "日本") ') or contains(*, 'FORMSOF( THESAURUS, "韓国") ')
-
TPN32 さん、こんにちは。マイクロソフトの石田です。
類義語辞典ファイルのロードに関する問題が解決して何よりです。類義語辞典を使用した検索方法ですが、以下の SQL Server 2008 オンライン ブックを参照する限りでは、
THESAURUS 以下は <simple term> となっているので、この中で OR や AND の演算子は使えないようです。以下の SQL Server 2008 オンライン ブック (2009 年 5 月)
CONTAINS (Transact-SQL)
http://technet.microsoft.com/ja-jp/library/ms187787.aspxFORMSOF ( { INFLECTIONAL | THESAURUS } , < simple_term > [ ,...n ] )
残念がら、TPN32 さんが既に書かれている方法か、少しシンプルに以下のように検索ワードをカンマ区切りで
複数指定するような方法になるかと思います。WHERE CONTAINS(*, 'FORMSOF(THESAURUS, "日本", "韓国")')
- 回答としてマーク 菊地俊介 2009年9月11日 8:55