2011-12-08 12 views
0

PHPで検索エンジンをコーディングすると、各プロジェクトが独自のsqliteデータベースファイルに含まれている複数のプロジェクトに含まれるテキストを検索できます。複数のsqliteデータベースを検索するためのPHP検索エンジンのコーディング方法

いくつかの時点で100件のプロジェクト(100を超えるsqliteのデータベース)、私は思っていたの上にも存在しますので、以下になり、よりスマートなプログラミングの選択のどの(もしあれば):

  1. 初期ページ中、ロード、すべてのデータベースをループし、各データベースからすべてのコンテンツを読み込み、検索可能なすべてのコンテンツをPHPオブジェクト/配列/何にでも挿入します。ユーザーは検索フレーズを入力し、PHPオブジェクトを検索するだけです。各データベースは、彼らが興味を持っているコンテンツを検索するために一度に1を検索して「検索」をクリックし、ユーザの際
私は本当にそれがいずれかのオプションを実行するためにかかる時間を知らない

、またはより良い習慣です。ほとんどのデータベースファイルは< 1MBです。

ありがとうございます!

答えて

1

まず、PHP-GTKなどのグラフィカルアプリケーションを開発していない限り、PHPのページロードはステートレスであることを忘れないでください。つまり、オプション1を選択した場合、データをどこか別の場所(たとえば別のDB)にキャッシュする必要があります。私はとにかくそれを記憶に残すつもりはない。

また、設定したインデックスの種類によって異なります。データベースにフルテキストインデックスがある場合は、100件のテキスト検索が非常に高速になります。

したがって、ファイルをループすることはオプションです。 100種類のSQLiteファイルを開く必要があるため、オーバーヘッドが発生する可能性があります。また、メモリ使用量を減らすために、すべてのファイルを終了した後にすべてのファイルを閉じることを忘れないでください。すべてのSQlite DBが適切に索引付けされていることを確認する必要があります。

もう1つの可能性は、すべての検索可能なデータと、元のデータが見つかるsqliteファイルと、それらがチェックされた最後のタイムスタンプに関する追加のメタデータを含むローカルDBを作成することです。その後、すべてのリクエストに対して、sqliteファイルの最終変更タイムスタンプをチェックし、変更されたSQlite DBの新しいデータをローカルDBにコピーし、タイムスタンプを更新し、ローカルDBで検索することができます。 この場合のパフォーマンスは、SQliteファイルの更新頻度とmutchデータの同期方法によって異なりますが、あなたのケースでは十分です。

+0

私は、データを格納するためにJavascriptを使用できますか?うまくいけば、これらのデータベースには全文索引が付いているはずですが、Trac(実際にこれらのDBに書き込むソフトウェア)はかなり簡単な検索機能を持っています。あなたの提案をありがとう! – gamemusicmaker

0

私は間違いなくすべてのコンテンツを読んで、それからPHPを通してそれを検索することはかなり非効率的です。本当に効果的なクエリを作成し、ユーザーのクエリを取得した後はすべてのデータベースでクエリを実行する方が効率的です。かなりの役に立ちそうな検索状況をユーザーに通知することができれば。つまり、現在検索しているデータベースと残っているデータベースを指定してください。

+0

Googleの新しいインスタント検索機能のように、インスタント検索に便利だと思ったのは唯一の理由だが、これはおそらく私の目的にとっては必要ないだろう。 – gamemusicmaker

+0

本当にあなたが本当にメモリに文脈を持っている本格的なwebbappを必要とするよりもそのルートに行きたい場合... –

1

このようなことはしていませんが、おそらくデータが非常に動的であれば、他のデータベースの内容を含むデータベースこのオプションは、スクリプトを実行し、cronjobでデータを毎晩または週に1回、または何でもコピーするまでは機能しません。 データベースが似ている場合は、同様の構造(検索のために意味をなさない)があることを意味しているので、上記の私の提案をおそらく使用します。 データベースの複雑さを知らずには分かりません。

+0

私は、このデータベースを別のデータベースを使用している既存のバグ追跡Wikiシステム(Trac)プロジェクトごとに私はそれに固執しています。私はデータベースが超複雑だとは思わない。 – gamemusicmaker

+0

私は新しいデータベースを設定し、それを一定期間ごとに入力するのが最良の選択肢だと思います。まあそれは私がやることだ:) – Ignas

+0

これまでのところ最高のソリューション、感謝;-)のように思われる – gamemusicmaker

0

すべてのデータベースのインデックスを作成し、定期的に更新します。それは読み込み専用なので大きな問題ではありません。

簡単な単語インデックスはちょうどのように

word[ [document,occurrences], [document,occurrences] ... ] 

することができ、単語 "foo" が文書1に表示され、3回、文書4、5回。

foo[ [1,3] , [4,5] ] 

これは、正確なフレーズ検索はできませんが、それは単純で高速です。

関連する問題