[pgsql-jp: 26739] Re: Likeの部分一致で検索

Naofumi Kondoh nkon @ shonan.ne.jp
2002年 7月 18日 (木) 01:26:01 JST


ソフト工房の近藤です。

Hashimoto, Masaru wrote:
> 橋本です。
....略.....

> 長くなってしまいましたが、以下に実際のSQL文を記述します。
> 
> ・キーワードは[windows][ウィンドウズ][ウインドウズ]です。
> ・すべてORで検索しています。
> ・キーワードにひとつでもアルファベットがあったらILIKEにしています。
> ・このテーブルにインデックスは張っていません。
> ・ちなみに、キーワードを[windows]だけにしてみると、
>  カウントとレコード取得であわせて5秒くらいで帰ってきます。
....略.....

18 もの列に OR で 前方一致以外の検索をしたら遅く 
なるのはあたりまえですね。
データーの中身がわからないとなんとも言えないので
すが、思いつくままに列挙すると、

(a) 長い文章なら全文検索エンジンを使う。

(b) 会社名など固有名詞や短い単語ならば、
  本来の列の他に、シソーラス辞書で変換した検索
  専用の列だけの表を別に作り、検索専用表で検索
  を実行する。検索結果は、PRIMARY KEY 又は
    OID で本来の表と JOIN できるようにする。

  keyword1 〜 18 を INSERT/UPDATE するときに、
  シソーラス辞書で、例えば、

    ウィンドウズ    ==>  WINDOWS
    ウィンドーズ    ==>  WINDOWS
     とか
    ジャパン        ==> 日本
    JAPAN           ==> 日本
  ニッポン    ==> 日本

    というように変換して、検索専用の表に格納する。
  また、英字大文字小文字、片仮名の大文字小文字、
  異字体や、類似の文字、アラビア数字漢数字等々
  の文字単位の変換もして統一しておく。

  # 異字体: "亞", "亜"  "藝", "芸" "齊", "斉"
    #  類似文字  ニ 二 ('に'の片仮名と漢数字の2)
   類似文字は用途によって使用の可否を判断すること。

  # JIS 規格の 異字体なら C のプログラムがあります
  # ので無保証でよければ差し上げます。

  ユーザー入力の検索語も同様に変換するので、例題
  のように3種類の OR ではなく、LIKE '%WINDOWS%'
    だけですむので検索量が減る。

  # 全件検索になってしまうと ILIKE と LIKE の差は
    # ほとんどないかもしれません。


(c) 前日データーの検索でもかまわなければ、夜間バッチ
  で、通常のテキストファイルに落として、grep 等で
  検索する。

(d) 1文字毎にビットマップインデックスをつくり、検索
  文字でビットの AND をとって行を絞り込む。(列の
  文字数が短い場合)。

他にもいい方法があると思います。

ただ、データー件数が数万件とひどく少ないですから、
各列の長さが短かければ、数GBの主記憶を搭載すれば、
解決かもしれませんね。

....略.....

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 (株)ソフト工房   近藤直文        Email:  nkon @ shonan.ne.jp
http://www.SOFTKOUBOU.co.jp/      http://www.shonan.ne.jp/~nkon/
2002-07-27(土)14:00-16;30 JPUG 業務アプリ分科会 セミナー/勉強会
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/





pgsql-jp メーリングリストの案内