none
FullText検索での変数の指定方法 RRS feed

  • 質問

  • このたびはお世話になります。
    SQL Server2012のフルテキスト検索での質問です。
    FREETEXTTABLEでのKeywordに変数を使用したいのですが、DECLARE文での型は何を使用するのが適切なのでしょうか?
    検索するキーワード(ワードブレーカが働くかどうか?かもしれません)によって正常な結果が異なります。

    正:DECLARE @SearchWord nvarchar(30) = 'スピーカー'
    誤:DECLARE @SearchWord nvarchar = 'スピーカー'

    正:DECLARE @SearchWord nvarchar = '音が出ません'
    誤:DECLARE @SearchWord nvarchar(30) = '音が出ません'

    select [KEY], [RANK] from FREETEXTTABLE (tblTest, question , @SearchWord, LANGUAGE 1041)

    海外のサイトを見ると Varchar (またはNVarchar)で桁数をしていしたり、しなかったりとまちまちです。
    下記のように直接リテラルを指定した場合は、桁数指定した場合と同じ結果(=’音が出ません’の場合は誤り)になるようです。

    正:select [KEY], [RANK] from FREETEXTTABLE (tblTest, question ,'スピーカー', LANGUAGE 1041)

    誤:select [KEY], [RANK] from FREETEXTTABLE (tblTest, question , '音が出ません', LANGUAGE 1041)

    ここでいう誤りとは、'スピーカー'の場合は一件もヒットせず、'音が出ません'の場合は、RANKが0として全レコードが返ってくる状態です。

    テストデータ自体がおかしい可能性も考えましたが、型の指定方法によって正常な(にみえる)結果が返ってくるので、文字コードの違いやごみデータの混入の可能性は低いと思われます。
    恐れ入りますが、どなたかご指摘いただけると大変助かります。

    再現環境として、下記にテーブルとカタログの定義とテストデータを記入します。

    --------------------------------------

    CREATE TABLE tblTest(
     ID   nvarchar(10),
     Question nvarchar(MAX)
     CONSTRAINT PK_tblTest PRIMARY KEY (ID)
    );
    GO


    --フルテキストインデックスのカタログ作成

    CREATE FULLTEXT CATALOG test_catalog
      ON FILEGROUP SECONDARY

    --フルテキストインデックスの作成
    CREATE FULLTEXT INDEX
      ON tblTest(
     Question  Language 1041
      )
      KEY INDEX PK_tblTest
        ON test_catalog;

    GO

    INSERT INTO tblTest ( ID, question )
    VALUES ( '0001', 'ヘッドホンから音がでるのに、スピーカーから音が出ません。');
     
    INSERT INTO tblTest ( ID, question )
    VALUES ( '0002', 'Windows7環境で、スピーカーから音が出なくなりました。');

    INSERT INTO tblTest ( ID, question )
    VALUES ( '0003', 'スピーカーから音が出なくなりました。 Windows XP環境で、ワイヤレスマネージャーを使用しています。');

    INSERT INTO tblTest ( ID, question )
    VALUES ( '0004', 'パソコン本体のキーボードや底面が熱を持ちますが異常ではありませんか' );


    Sho

    2012年12月3日 19:16

すべての返信

  • 追記です。

    正:select [KEY], [RANK] from FREETEXTTABLE (tblTest, question ,'スピーカー', LANGUAGE 1041)

    誤:select [KEY], [RANK] from FREETEXTTABLE (tblTest, question , '音が出ません', LANGUAGE 1041)

    この結果だけ見ると、単純にワードブレーカが壊れているように思えますが、

    DECLARE @SearchWord nvarchar = '音が出ません'
    select [KEY], [RANK] from FREETEXTTABLE (tblTest, question , @SearchWord, LANGUAGE 1041)

    とすると、正常に(0004の発熱に関するレコードが対象外となり、RANKもそれらしい数値が帰ってきます)結果を出すため、混乱しております。
    DBのキャッシュ機能などで古い結果を表示しているのではないかと、リブートしたり、LACをクリアしたりしましたが、結果が変わりません。


    Sho

    2012年12月3日 19:39
  • フルテキスト検索でヒットするかしないかは、作成されているインデックスと検索条件が一致するかどうかなので、sys.dm_fts_index_keywords_by_documentやsys.dm_fts_index_keywordsで作成されているインデックスを確認してみることをお勧めします。

    当然ですが、検索条件もwordbreakerにより処理されますので、sys.dm_fts_parserで検索条件がどのように分割されるのかも確認してみる必要があると思います。

    • 回答の候補に設定 佐伯玲 2012年12月25日 7:06
    • 回答としてマーク 佐伯玲 2012年12月27日 6:16
    • 回答としてマークされていない shojiro matsuhiro 2013年1月18日 5:03
    2012年12月21日 6:52
  • こんにちは、shojiro matsuhiro さん
    フォーラムオペレータの佐伯 玲 です。

    MKIII さんの情報が参考になる情報だと思われたので勝手ながら私のほうで「回答としてマーク」とさせて頂きました。
    不明点や追加の質問などありましたら回答マークを後から解除することも可能ですので引き続きこちらのスレッドご活用くださいませ。

    宜しくお願いいたします。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレータ 佐伯 玲

    2012年12月27日 6:16