none
フルテキスト検索の類義語辞典の編集について RRS feed

  • 質問

  • 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>


    ネットで検索すると、このような現象は、自分の所だけのようです。
    原因として何が考えられるでしょうか?

    2009年8月25日 7:03

回答

  • 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
    2009年8月26日 6:12
  • 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.aspx

    FORMSOF ( { INFLECTIONAL | THESAURUS } , < simple_term > [ ,...n ] )

    残念がら、TPN32 さんが既に書かれている方法か、少しシンプルに以下のように検索ワードをカンマ区切りで
    複数指定するような方法になるかと思います。

    WHERE CONTAINS(*, 'FORMSOF(THESAURUS, "日本", "韓国")')

    • 回答としてマーク 菊地俊介 2009年9月11日 8:55
    2009年9月1日 2:02

すべての返信

  • 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
    2009年8月26日 6:12
  • マイクロソフトの石田さん

    ありがとうございました。
    解決しました。

    こんどはこのような問題がでてきました。
    類義語を使わない場合は、以下のようにandやorを使えました。

    select *
    from テーブル
    where contains(*, '日本 or 韓国')


    類義語辞典を使う場合は、以下のようにすると、単に"日本"、"韓国" でAND検索するようです。
    where contains(*, 'FORMSOF( THESAURUS, "日本 or 韓国") ')

    こんな風にやればできるようですが、検索の指定部分だけを変えることで実現できないでしょうか?
    where contains(*, 'FORMSOF( THESAURUS, "日本") ') or contains(*, 'FORMSOF( THESAURUS, "韓国") ')

    2009年8月27日 7:56
  • 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.aspx

    FORMSOF ( { INFLECTIONAL | THESAURUS } , < simple_term > [ ,...n ] )

    残念がら、TPN32 さんが既に書かれている方法か、少しシンプルに以下のように検索ワードをカンマ区切りで
    複数指定するような方法になるかと思います。

    WHERE CONTAINS(*, 'FORMSOF(THESAURUS, "日本", "韓国")')

    • 回答としてマーク 菊地俊介 2009年9月11日 8:55
    2009年9月1日 2:02
  • TPN32さん、こんにちは。フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?類義語辞典を使用した検索方法についての疑問は解決しましたか?

    同じ問題で困っている方にも有用な情報と思われたため、勝手ながら石田の回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    2009年9月11日 8:58