none
フルテキスト RRS feed

  • 質問

  • ご指導お願いいたします。

     現在SQLserver2008R2を使用して
     以下のストアドを作成しました。

     --コマンド1
     @項目1   int
      @項目2   varchar(16) --部分一致用
      @項目3   varchar(16) --部分一致用

      select *
      from  Atable as A left outer join
     Btable as B on A.id = B.id
      where A.コード = @コード
     and A.名前 like %@項目2%
            and rtrim(B.名称1)+rtrim(B.名称2) like %@項目3%
      --コマンド1終了

     こちらは動作はしするのですが
     使用者から結果までの時間が10秒弱かかるからもう少し
     速くならないかとの要望を受けました。

     そこで、サイト等で調べてみたら
     フルテキストを使用しての検索があったので
     
     Atableにフルテキストを作成して
     上述コマンドを以下のように書き換えました。

     --コマンド2
     @項目1   int
      @項目2   varchar(16) --部分一致用
      @項目3   varchar(16) --部分一致用

      select *
      from  Atable as A left outer join
     Btable as B on A.id = B.id
      where A.コード = @コード
     and freetext(A.名前,@項目2) -- ①
            and freetext(rtrim(B.名称1)+rtrim(B.名称2),@項目3) --②
      --コマンド2終了

     初めに②がない状態で、@項目2が存在する状態実行してみたら
     動作しました。しかし空白の場合は
     エラーで、nullか空白がありますのメッセージで進みませんでした。
     次に、②のみで実行したら
     記述が間違っているのエラーで進みませんでした。

     以上のことより、
     フルテキストを空白で実行する方法と
     ②の記述はだめなのか
     そして、ほかの方法で処理結果をあげる方法がありましたら
     ご回答いただけたら幸いです。
     
     以上 

    2012年2月11日 23:45

すべての返信

  • フルテキストインデックスの機能についてご理解いただく必要があると思います。

    フルテキストインデックスは、文字列を単語に切り分けてインデックスを
    作成するもので、Like検索の動作とは結果が異なる場合があります。
    http://msdn.microsoft.com/ja-jp/library/ms142547.aspx

    この前提の上で、

    freetext(A.名前,@項目2) -- ①
    については、

    Case
      When @項目2 is null Then 1
      When @項目2 ='' Then 1
      When freetext(A.名前,@項目2) Then 1
      Else 0
    End = 1

    としてみてはいかがでしょうか?

    freetext(rtrim(B.名称1)+rtrim(B.名称2),@項目3) --②
    については、 フルテキストインデックスの特性を理解していれば
    rtrim(B.名称1)+rtrim(B.名称2)
    という結合文字列に対して、検索を行うことに意味がなく
    (freetext(rtrim(B.名称1),@項目3) or
       freetext(rtrim(B.名称2),@項目3) )
    とするのが正しい検索式になることがご理解いただけると思います。

    rtrim(B.名称1)+rtrim(B.名称2)に対して行いたいのであれば
    計算列を作成して、ここにフルテキストインデックスを設定するのがいいと思います。
    http://msdn.microsoft.com/ja-jp/library/ms191250.aspx


    ---------------------------------
    Infospire Kayano

    2012年2月13日 11:00
  •   ご回答ありがとうございます。

     さっそく以下の通り試したのですが

     空白やnullがあるためできませんのメッセージが表示されダメでした。

     いろいろと編集しましたがお手上げです。

     where A.コード = @コード
     and

    Case   When @項目2 is null Then 1  

    When @項目2 ='' Then 1  

    When freetext(A.名前,@項目2) Then 1  

    Else 0

        End = 1

     /*     and rtrim(B.名称1)+rtrim(B.名称2) like %@項目3% --これはまだテストしていません。*/

     @項目2を空白ではない場合はうまくいきましたが

     空白だとメッセージが表示されました。

     


    • 編集済み zeak01 2012年2月16日 7:12
    2012年2月16日 7:09
  • 	CASE WHEN @項目2 IS NULL THEN
    	         1
    	     WHEN @項目2 = '' THEN
    	         1
    	     WHEN freetext(A.名前, ISNULL(@項目2, 'temp')) THEN
    	         1
    	     Else
    	         0
    	End = 1
    

    試しにこうしたらどうなりますか?

    ※綺麗ではないですが、'temp'に置き換えて実行してます。実行結果は変わらないかと・・・

    また、

    	(
    		@項目2 IS NULL
    	OR	@項目2 = ''
    	OR	freetext(A.名前, CASE WHEN @項目2 IS NULL THEN
    		                          'temp'
    		                      WHEN @項目2 = '' THEN
    		                          'temp'
    		                      ELSE
    		                          @項目2
    		                 END)
    	)
    
    こんなのも気になります。
    2012年2月17日 12:25