none
フルテキストだとlikeと違った結果がかえってきた RRS feed

  • 質問

  • SQL server 2000を使用しています。
    現在like文を使って処理を行っていますが、時間がかかるのでフルテキストに切り替えようか検討しています。
    ところがlike文と同じような検索をおこなったところ結果が違うことがわかりました。

    select COLUMN from TABLE where COLUMN like '%BOOK%'
    ---結果---
    BOOK1の登録
    BOOK3の登録
    BOOK5の登録
    BOOK7の登録
    BOOK9の登録
    ---------

    select COLUMN from TABLE where contains(COLUMN,'BOOK')
    ---結果---
    ---------

    ちなみに「BOOK7」で検索すると結果が返ってきます。
    select COLUMN from TABLE where contains(COLUMN,'BOOK7')
    ---結果---
    BOOK7の登録
    ---------

    このような奇妙な結果が出るのではなぜなのでしょうか?

    2010年6月17日 2:51

回答

  • どこを単語として判断されたか(インデックスが作成されたか)によると思うのですが
    'BOOK'→'"BOOK*"'
    だと結果はいかがでしょうか?

    ちなみに、、、
    どういう仕様でインデックスが作成されるかがわからないため(公開されてない?)
    曖昧さが許されない業務システムでは使えない機能かなと思ってます。

    Vista などでファイルエクスプローラーの検索結果がおかしいのと同じですね(たぶん)

    • 回答の候補に設定 山本春海 2010年6月21日 5:24
    • 回答としてマーク 山本春海 2010年6月23日 2:50
    2010年6月17日 4:31
  • フルテキスト検索は、ワードブレークされた文字に対して検索を行ないますが、like 文はすべての文字列に対して検索を行ないます。

    そのため、フルテキストでは検索できなくて、like 文では検索できるということは、通常起こりえます。

    今回の現象は、"BOOK7の登録" も文字列が、"BOOK7" "登録" という形で、ワードブレイクされたのではないかと。

    個人的な意見としては、フルテキストは、Web 上のSearchなど、曖昧な検索には有効だと思いますが、必ずヒットさせないといけないという要件がある場合は、like 文にする必要があると思います。

    ※ 英語では、単語単位でワードブレイクされるので、ヒット率が高いのですが、日本語の文字列は、どのようにワードブレイクされるかによって、検索結果がことなるので、フルテキストには向いていないのではないかと思っています。

     

    • 回答の候補に設定 山本春海 2010年6月21日 5:25
    • 回答としてマーク 山本春海 2010年6月23日 2:50
    2010年6月17日 4:36
  • anningoさん、回答ありがとうございます。

    'BOOK'→'"BOOK*"'にすることで、likeの場合と同じ結果を得ることができました。
    ここでの「"」と「*」はどういった役割があるんでしょうかねぇ。

    ためしに%OOK%でlike検索したものをフルテキストでも検索してみましたがこちらはダメでした。

    select COLUMN from TABLE where COLUMN like '%OOK%'
    ---結果---
    BOOK1の登録
    BOOK3の登録
    BOOK5の登録
    BOOK7の登録
    BOOK9の登録
    ---------

    select COLUMN from TABLE where contains(COLUMN,'"*OOK*"')
    ---結果---
    ---------
    うまくいきませんねぇ。

    like文の時と同じに結果になってくれない曖昧さがあるようなので、
    それも含めて検討してみます。
    • 回答としてマーク 山本春海 2010年6月23日 2:50
    2010年6月17日 6:31
  • ダブルコーテーションは
    '"abc" OR "def"' のように単語を区切るため、
    アスタリスクはワイルドカードですが
    ダブルコーテーションの前でしかワイルドカードとして機能しないようです。
    これも英語で都合いいからからでしょうか ^^;

    ↓詳細はコチラ
    CONTAINS (Transact-SQL)
    http://msdn.microsoft.com/ja-jp/library/ms187787.aspx
    • 回答としてマーク 山本春海 2010年6月23日 2:50
    2010年6月17日 7:14

すべての返信

  • どこを単語として判断されたか(インデックスが作成されたか)によると思うのですが
    'BOOK'→'"BOOK*"'
    だと結果はいかがでしょうか?

    ちなみに、、、
    どういう仕様でインデックスが作成されるかがわからないため(公開されてない?)
    曖昧さが許されない業務システムでは使えない機能かなと思ってます。

    Vista などでファイルエクスプローラーの検索結果がおかしいのと同じですね(たぶん)

    • 回答の候補に設定 山本春海 2010年6月21日 5:24
    • 回答としてマーク 山本春海 2010年6月23日 2:50
    2010年6月17日 4:31
  • フルテキスト検索は、ワードブレークされた文字に対して検索を行ないますが、like 文はすべての文字列に対して検索を行ないます。

    そのため、フルテキストでは検索できなくて、like 文では検索できるということは、通常起こりえます。

    今回の現象は、"BOOK7の登録" も文字列が、"BOOK7" "登録" という形で、ワードブレイクされたのではないかと。

    個人的な意見としては、フルテキストは、Web 上のSearchなど、曖昧な検索には有効だと思いますが、必ずヒットさせないといけないという要件がある場合は、like 文にする必要があると思います。

    ※ 英語では、単語単位でワードブレイクされるので、ヒット率が高いのですが、日本語の文字列は、どのようにワードブレイクされるかによって、検索結果がことなるので、フルテキストには向いていないのではないかと思っています。

     

    • 回答の候補に設定 山本春海 2010年6月21日 5:25
    • 回答としてマーク 山本春海 2010年6月23日 2:50
    2010年6月17日 4:36
  • anningoさん、回答ありがとうございます。

    'BOOK'→'"BOOK*"'にすることで、likeの場合と同じ結果を得ることができました。
    ここでの「"」と「*」はどういった役割があるんでしょうかねぇ。

    ためしに%OOK%でlike検索したものをフルテキストでも検索してみましたがこちらはダメでした。

    select COLUMN from TABLE where COLUMN like '%OOK%'
    ---結果---
    BOOK1の登録
    BOOK3の登録
    BOOK5の登録
    BOOK7の登録
    BOOK9の登録
    ---------

    select COLUMN from TABLE where contains(COLUMN,'"*OOK*"')
    ---結果---
    ---------
    うまくいきませんねぇ。

    like文の時と同じに結果になってくれない曖昧さがあるようなので、
    それも含めて検討してみます。
    • 回答としてマーク 山本春海 2010年6月23日 2:50
    2010年6月17日 6:31
  • NOBTAさん、回答ありがとうございます。

    必ずヒットさせる必要がある場合にはlikeのほうがよさそうですね。
    「BOOK7」に対して「BOOK」の文字列で検索しても引っかかってくれないのは、検索で使用するものとしては厳しいのかもしれません。
    既にlike文を使って検索しているところもあるので、そこで使われている単語をピックアップして、フルテキストで検索した場合にどのくらい結果に違いが出てくるのか比較してみます。
    2010年6月17日 6:39
  • ダブルコーテーションは
    '"abc" OR "def"' のように単語を区切るため、
    アスタリスクはワイルドカードですが
    ダブルコーテーションの前でしかワイルドカードとして機能しないようです。
    これも英語で都合いいからからでしょうか ^^;

    ↓詳細はコチラ
    CONTAINS (Transact-SQL)
    http://msdn.microsoft.com/ja-jp/library/ms187787.aspx
    • 回答としてマーク 山本春海 2010年6月23日 2:50
    2010年6月17日 7:14
  • こんにちは、ゲンガー さん。

    anningo さんや、NOBTA さんからの情報が参考になったようですので、勝手ながら私のほうで回答としてマークさせていただきました。
    anningo さん、NOBTA さん情報ありがとうございます。

    いただいた情報のなかで、参考になったものや有効な情報には、回答としてマークすることで、今後同じ問題でこのスレッドを参照された方にも、有効な情報が目に留まりやすくなるかと思いますので、回答としてマークをお願いしています。
    今回は私のほうで先にマークさせていただきましたが、ゲンガーさんも次回から回答としてマークしてみてくださいね。

    現在ご確認いただいている結果についても、投稿お待ちしておりますので、よろしくお願いいたしますね。
    それでは。
                                             
    マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2010年6月23日 2:52