2012-01-25 13 views
0

私はLuceneを使用して連絡先データベースを検索しています。連絡先では、名前、複数の電話番号、電子メール、アドレスなどを意味します。データベースでは、これらは明らかに別々のフィールドに分割され、別々のテーブルに分割されます。私はフィールドのいずれかに基づいて連絡先を検索することができるようにしたい、例えば、 "John Doe"と入力すると、LuceneがJohn Doeの連絡先情報を返すことができます。ジョン・ドゥにも電話番号があり、その電話番号や住所、電子メールなどを入力して自分のレコードを見つけることができるようにしたいと思います。私が探しているフィールドを具体的に述べる必要はありません。連絡先を検索するためのLucene検索インデックスを構築する最善の方法

インデックスを作成する場合は、すべてのデータを1つの「データ」フィールドにマージするか、別々に保管するのが最善でしょうか?データベースからすべての追加データを取得するために使用するidを除いて、インデックスにデータを格納しません。私の状況では、標準アナライザーとクエリーパーサーがうまく機能するのでしょうか、それともカスタムアプローチをさらに取るべきですか?

私はLuceneにとってかなり新しく、本当にどれほど強力かを学んでいるので、実際にそれに慣れたり、複雑なカスタム検索クエリを作成したりすることに反対しているわけではありません。そのすべてが必要でない場合は、そのすべてを行う必要はありません。

答えて

1

1つの結合フィールドを作成する必要はありません。別々のフィールドを作成することは、おそらく設計上のより優れた選択です。ラインを考えれば、特殊な検索をしたいかもしれません。

あなたはこのような名前、住所、市としてすべてのフィールドを検索するMultiFieldQueryを使用することができます

...

+0

はKISS - シングルキャッチオールフィールドは、簡略化の面で最良の選択となる所定の電流要件ごととスペースと検索速度。さらに、現代のユーザーは、どのフィールドを検索するかを指定することはできません。彼らはそれだけでそれを把握するシステムにAlaのGoogleの検索バーをしたい。 –

1

単一の検索フィールドを使用するのが最も効率的なソリューションです。これにより、インデックスをより小さく、より速く検索することができます。フィールドを格納していても、検索のための1つの集約インデックス付き(格納されていない)フィールドと、すべての連絡先情報に格納された(ただしインデックスされていない)フィールドを1つずつ持つことができます。

標準アナライザとクエリパーサがすばやくプロトタイプの構築を支援しますが、あなたがしたい場合たとえば、あなたのアプリケーションを改善するために、カスタム・アナライザを使用する必要があります。

  • クエリと同じ結果を与えるために、 ()、
  • の電話番号のスペースを処理する( "0532"のクエリが "0532"と同様に "0532"に一致するように)。
関連する問題