VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 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ライブラリのように、データが更新されない
静的なデータの場合は、インデックスファイルが有効な手段となります。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -