投稿日 | : 2003/08/25(Mon) 11:01 |
投稿者 | : 魔界の仮面弁士 |
Eメール | : |
URL | : |
タイトル | : Re: 検索を早くしたい |
全文検索には幾つかの方式がありますが、いずれにしても、検索速度を高速化するには
適切な「インデックス」が必要となります。
例えば、キーワードの一覧テーブルを作成し、
[Keyword]表 ―― [Key]は主キー、[Word]はユニークキー
Key Word
---- ----------
1 LISTBOX
2 TEXTBOX
3 COMBOBOX
: :
それを、過去ログテーブルに対するインデックスのようにする方法が考えられます。
[LogIndex]表 ―― [Key]はKeyword.Keyと結合、[ID]は過去ログの主キーと結合
Key ID
---- ------
1 2374
1 2375
1 2376
2 3375
2 3377
: :
このようにしておけば、『WHERE 回答 LIKE '*ListBox*'』とするかわりに、
『WHERE Keyword = 'LISTBOX'』のような検索条件とする事ができます。
これならばインデックスを使って検索できるので、検索時間は短縮されます。
ただし、データ量は格段に増えるため、データベース自体は肥大化します。
巨大なmdbは、破損率・読み込み速度面などで不利になりますから、
どの程度の規模のインデックス表を、どのようなアルゴリズムで生成するかが、
プログラマの腕の見せ所になりますね。
キーワードの抽出には、茶筅などを使うと便利かもしれません。
http://member.nifty.ne.jp/hippo2000/ComCha/ComCha.htm
なお、単語ベースの検索を行う場合は、表記ゆれも解決しておくと良いでしょう。
http://magazine.fujitsu.com/vol48-2/4-3zu3.html
ちなみに、全文検索におけるインデックステーブルの作り方としては、
幾つかの方式が研究されています。下記なども参照してください。
http://www.jpo.go.jp/shiryou/s_sonota/hyoujun_gijutsu/search_engine/c/c32.htm
あるいはmdbではなく、既存の全文検索システムを併用するという手もあります。
ファイルベースの全文検索が可能な "Namazu for Win32" などが有名ですね。
また、Windows 2000以上ならば Index Serviceなども利用できます。
たとえば、Index Serviceを使った、以下のようなソフトもあります。
http://www.forest.impress.co.jp/article/2003/07/15/satori.html
# Index Serviceは、ローカルファイル(テキスト、HTML、Office文書等)向けの
# システムであり、VBからは ADO経由で検索する事ができます。
また、Indexing Service/Index Server以外で、全文検索可能な
Microsoft製品としては、
Microsoft IIS Index Server
Microsoft SharePoint Portal Server
Microsoft SQL Server
Microsoft Site Server
などもあります。まぁ、今回の要件ではオーバースペックかもしれませんが。
そこまでの仕組みを導入したくはない、という事であれば、
絞り込み条件範囲を増やすのも有効です。例えば、
WHERE (ID BETWEEN 1 AND 500) AND (回答 LIKE '*ListBox*')
のように条件を絞る事で、検索対象のレコード数が減らすわけです。
さらに、間にDoEventsなどをはさむなどして、
:
WHERE (ID BETWEEN 501 AND 1000) AND (回答 LIKE '*ListBox*')
:
WHERE (ID BETWEEN 1001 AND 1500) AND (回答 LIKE '*ListBox*')
:
WHERE (ID BETWEEN 1501 AND 2000) AND (回答 LIKE '*ListBox*')
:
のように、次々と検索を行うようなコードにすると、途中で検索を打ち切ったりする事が
可能になるので、見た目の使い勝手は向上します。(トータルの処理時間は延びますが)
> MSDNの全文検索ってどうやっているんでしょうか???できればあの程度まで早くしたい
あれは、検索用のインデックスファイルを、別途用意しているのです。
# MSDNライブラリのバージョンによっては、インデックスファイルのインストールを
# 行うかどうかを、インストール時に選択できるものもあります。
内容が逐次書き換わるようなデータベースの場合は、インデックスの追加生成を行うために
パフォーマンスが低下する可能性がありますが、MSDNライブラリのように、データが更新されない
静的なデータの場合は、インデックスファイルが有効な手段となります。