8

逆検索が必要なアプリを作っています。これは、アプリのユーザーが検索パラメーターを入力して保存することを意味します。次に、新しいオブジェクトがシステムに入力されると、それらがユーザーが保存した既存の検索パラメーターと一致する場合、通知が送信されます。

この種の問題の解決策を見つけるのに苦労しています。

私はDjangoを使用しており、ここで概説されているように、Qオブジェクトを使用して検索を構築し、それらをピクルスにすることを考えています: http://www.djangozen.com/blog/the-power-of-q

私の見方では、新しいオブジェクトがデータベースに入力されると、データベースから保存されたすべてのクエリをロードし、この 1 つの新しいオブジェクトに対して何らかの方法で実行して、その検索クエリと一致するかどうかを確認する必要があります...理想的ではないようです-前にそのような問題に取り組んだ人はいますか?

4

3 に答える 3

4

この問題を解決するために使用する作業量は、処理している保存済みクエリの数に直接関係しています。

20年以上前に、保存されたクエリをミニドキュメントとして扱い、すべての必須用語と用語に基づいてインデックスを作成することで処理しまし。新しいドキュメントの用語リストは、この「クエリのデータベース」に対する一種のクエリとして使用され、実行する可能性のある興味深い検索のリストを作成し、それらの検索のみが新しいドキュメントに対して実行されました。これは複雑に聞こえるかもしれませんが、保存されているクエリが少なく(たとえば、10,000〜1,000,000以上)、ブール検索と類似性ベースの検索のハイブリッドをサポートする複雑なクエリ言語を使用している場合は、クエリの数が大幅に減少します。フルオンクエリとして実行する必要がありました。多くの場合、10または15クエリ以下です。

助けになったのは、全体の水平方向と垂直方向を制御できることでした。クエリパーサーを使用して解析ツリーを構築し、それを使用して、クエリのインデックスを作成した用語のリストを作成しました。選択されたクエリの数が急増する可能性があるため、保存されたクエリで特定の種類のワイルドカードを使用しないようにお客様に警告しました。

コメントの更新:

簡単な答え:わかりません。

より長い答え:私たちはカスタムビルドのテキスト検索エンジンを扱っていましたが、そのクエリ構文の一部により、特に重点を置いて、特定の方法でドキュメントコレクションを非常に効率的にスライスすることができましたdate_added。1日に4〜10,000,000の新しいドキュメントを取り込み、64MBのメインメモリを備えたDEC Alphaで最大1,000,000以上の保存されたクエリに対してそれらを実行していたため、多くのゲームをプレイしました。(これは80年代後半/ 90年代前半でした。)

と同等のフィルタリングは、最後にクエリを実行した日付、または最後のクエリ実行時date_addedに最も高い日付と組み合わせて使用​​できると思います。id変更されたレコードに対してクエリを再実行する必要がある場合はid、クエリの一部として使用できます。

私がもっと具体的にするためには、あなたが解決しようとしている問題とあなたが達成しようとしている解決策の規模について、もっと具体的にしなければならないでしょう。

于 2010-03-12T15:31:25.247 に答える
4

データベース レベルでは、多くのデータベースが「トリガー」を提供します。

もう 1 つの方法は、最後の実行以降に最終更新日を持つすべてのアイテムをデータベースから定期的にフェッチする時間指定ジョブを使用することです。これらはフィルタリングされ、アラートが発行されます。おそらく、フィルタリングの一部をデータベースのクエリステートメントに入れることができます。ただし、アイテムが削除された場合に通知を送信する必要がある場合、これは少し注意が必要です。

データベースにデータを送信するコードにトリガーを手動で配置することもできます。これはおそらくより柔軟であり、データベースの特定の機能に依存していません。

トリガーとアラートが通信する良い方法は、メッセージ キューを使用することです。RabbitMQやその他のAMQP実装などのキューは、サイトに合わせて拡張されます。

于 2010-03-12T08:16:57.907 に答える
1

格納された各検索に含まれるオブジェクトのタイプを一般的なリレーションとして格納した場合、関連するすべてのオブジェクトに保存後のシグナルを追加できます。シグナルが発生すると、そのオブジェクト タイプに関連する検索のみを検索し、それらを実行します。データベースへの大量の書き込みと多くの保存された検索がある場合、おそらくスケーリングの問題が発生する可能性がありますが、それは単純な Django アプローチになります。

于 2010-03-12T23:10:14.837 に答える