1

基本的に、Lucene でインデックスを作成したい非常に単純なデータベースがあります。ドメインは次のとおりです。

// Person domain
class Person {
  Set<Pair> keys;
}

// Pair domain
class Pair {
  KeyItem keyItem;
  String value;
}

// KeyItem domain, name is unique field within the DB (!!)
class KeyItem{
  String name;
}

私は数千万のプロファイルと数億のペアを持っていますが、KeyItem の「名前」フィールドのほとんどが重複しているため、KeyItem インスタンスは数十しかありません。KeyItem インスタンスを節約するために、その構造にたどり着きました。

基本的に、任意のフィールドを持つ任意のプロファイルをその構造に保存できます。プロパティでプロファイリングしたとしましょう

- name: Andrew Morton
- eduction:  University of New South Wales, 
- country: Australia, 
- occupation: Linux programmer.

それを保存するために、1 つの Profile インスタンス、4 つの KeyItem インスタンス (名前、教育、国、職業)、および値を持つ 4 つの Pair インスタンス ("Andrew Morton"、"University of New South Wales"、"Australia"、"Linux) を用意します。プログラマー"。

他のすべてのプロファイルは、KeyItem の同じインスタンス (すべてまたは一部) を参照します: 名前、教育、国、および職業。

私の質問は、KeyItem::name と Pair::value の特定の値を Profile で検索できるように、すべてのインデックスを作成する方法です。理想的には、そのようなクエリが機能することを望みます:

名前:Andrew* AND 職業:Linux*

カスタム インデクサーとサーチャーを作成する必要がありますか? または、標準のものを使用して、KeyItem と Pair を Lucene コンポーネントとしてマップすることもできますか?

4

2 に答える 2

3

標準の Lucene 方法論を使用できると思います。私は...するだろう:

  • すべてのプロファイルを Lucene ドキュメントに変換します。
  • すべてのペアをこのドキュメントのフィールドに変換します。すべてのフィールドにインデックスを付ける必要がありますが、必ずしも保存する必要はありません。
  • プロファイル ID を持つ保存済みフィールドをドキュメントに追加します。
  • 例と同様に、名前と値のペアを使用して検索します。

裸の Lucene を選択した場合、カスタムのインデクサーとサーチャーが必要になりますが、構築するのは難しくありません。プログラミングの必要性が少ないSolrを使用する方が簡単かもしれません。ただし、Solr が私が説明したような制限のないスキーマを許可しているかどうかはわかりません。すべてのフィールド名を事前に定義する必要があるため、Solr を使用できなくなる可能性があります。

于 2010-04-29T11:40:25.690 に答える
1

Lucene は、基本的にクエリの種類に関係なく、キーワードの出現に基づいてヒット ドキュメントのリストを返します。基本セグメント リーダーは、関心のある特定の分野ではなく、インデックス データベース全体にキーワードが存在するかどうかをチェックします。

以下を実行するカスタムサーチャーの導入を提案します。

1. ドキュメント ID を使用して、候補リストにあるドキュメントを読み取ります。(私は、collect() メソッドがオーバーライドされて、IndexSearcher クラスの search() からドキュメント ID を渡す可能性があると思います)。
2.フィールド値を取得し、予想されるキーワードの存在を確認します。
3. ドキュメントがカスタム基準を満たす場合にのみ、ドキュメントをスコアリングの対象にします。

注 : カスタム シーチャーを最初から作成するのではなく、デフォルトの標準サーチャーを変更することができます。

于 2010-04-29T10:01:35.007 に答える