2009-06-13 29 views
5

私はたくさんのデータを持つプロジェクトに取り組んでいます.SQLクエリとして非常に効率的に表現されるいくつかのフォームで検索できますが、自然言語処理でも検索する必要があります。Lucene.NETとリレーショナルデータベースを組み合わせるベストプラクティス?

私の計画は、Luceneを使用してこの検索フォームを作成することです。

私がこれを行い、検索を実行すると、Luceneはインデックス内の一致するドキュメントのIDを返しますので、これらのエンティティをリレーショナルデータベースから検索する必要があります。

これは、2つの方法(私がこれまでの考えることができること)で行うことができます。おそらく、と(一度にストアドプロシージャに

  • N(恐ろしい)クエリの量
  • パスすべてのIDのコンマで区切られたパラメータ)。これには、最大パラメーター・サイズに制限されているという欠点と、ストリングを一時表に分割するUDFのパフォーマンスが低いことがあります。

私はほとんど私がperiodiclyバッキングストアからインデックスを生成することができるように、lucenesインデックスにすべてをミラーリングする誘惑が、唯一のフロントエンドのためにそれにアクセスする必要があるんです。

アドバイス?

+0

こんにちは。あなたはあなたのプロジェクトを終えましたか?あなたは何をした? – Eduardo

答えて

2

私はこの問題に遭遇したとき、全文検索機能を持つリレーショナルデータベース(私はPostgreSQL 8.3を使用していました。これは、ステミングとシソーラスサポートを備えています)。このようにして、データベースはSQLコマンドとftコマンドの両方を使用してクエリできます。欠点は、フルテキスト検索機能を持つDBが必要なことです。これらの機能は、ルーネンの機能に劣る可能性があります。

4

私はインデックスの中に 'frontend'データを格納して、データベースとのやりとりを避けました。 dbは、特定のレコードに関する詳細情報が必要な場合にのみ照会されます。

1

答えはグリッドに結果を表示し、ユーザーがアクセスしたいと思っている正確なドキュメントを選択させようとしている場合に、結果に何をしようとしているかによって決まります。ユーザーが文書を識別するための十分なテキストを作成します。たとえば、200文字のように、メンバーが文書を選択するとDB全体を検索して全体を検索します。

これは、インデックスのサイズには影響しますので、これを考慮する必要があります。また、DBとフロントエンドの間にキャッシュを置くことで、最も頻繁に使用されるアイテムが毎回DBアクセスの全コストを負担することはありません。

+0

Luceneはメモリ内のキャッシュを持っていると思います。いいえ? –

0

あなたのデータベースにどれくらいのものがあるかに応じて、おそらくオプションはありませんが、私がやったことは、インデックスを付けたいプロパティと共に検索インデックスにdb idを格納することです。私のサービスクラスでは、すべてのオブジェクト(名前、db id、画像URL、説明blurbs、ソーシャルメディア情報など)の検索結果を表示するために必要なすべてのデータをキャッシュします。サービスクラスはdb idでオブジェクトを検索できる辞書を返し、Lucene.NETから返されたIDを使用してメモリ内のキャッシュからデータを取得します。

また、検索インデックスを検索結果に表示するために必要なすべてのプロパティをメモリ内キャッシュから除外して保存することもできます。メモリ内キャッシュは検索以外のシナリオでも使用されるため、私はこれをしませんでした。

メモリ内のキャッシュは常に数時間で新鮮です。私がデータベースにヒットする必要があるのは、単一のオブジェクトの詳細なデータを取得する必要がある場合です(ユーザーがリンクをクリックした場合そのオブジェクトのページに移動する特定のオブジェクト)。

関連する問題