[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 メーリングリストの案内