2011-07-13 17 views
0

私は顧客のLuceneインデックスを持っているとします。各顧客には、注文した製品があります。ドキュメント内の複数値フィールドを関連付ける?

のは、これら2つのfellasが私のインデックスに2つの文書を表すとしましょう:

<add> 
<doc> 
    <field name="Name">John Smith</field> 
    <field name="Product">Chicken Sandwich</field> 
    <field name="Price">10</field> 
    <field name="Product">Dodge Challenger</field> 
    <field name="Price">35000</field> 
</doc> 
<doc> 
    <field name="Name">John Q. Public</field> 
    ... 
:私のインデックスは顧客中心ではなく、順番中心であることを考えると

Name: John Smith 
    Product: Chicken Sandwich, Price: $10 
    Product: Dodge Challenger, Price: $35000 

Name: John Q. Public 
    Product: Chicken Sandwich, Price: $15 
    Product: Audi TT, Price: $35000 

を、マイドキュメントは、おそらくこのようになります。

価格と商品のすべてを多値フィールドとしてまとめ、相対的な関連性を失うことになります。

"私はチキンサンドウィッチを12ドル以上支払ったすべての顧客"を検索すると、John Q. Publicのみが返されるように、これを私のインデックスにどのようにして取得できますか?

答えて

0

必要なクエリのように、それぞれの個別のトランザクションをドキュメントとして持つ必要があります。あなたが与え例えば、データは次のようになりますので:さらなる情報については

Product:"Chicken Sandwich" AND Price:[00000000 TO 00001200] 

Lucene documentationは良くない:上記のスキーマを考える

<add> 
<doc> 
    <field name="Name">John Smith</field> 
    <field name="Product">Chicken Sandwich</field> 
    <field name="Price">10</field> 
</doc> 
<doc> 
    <field name="Name">John Smith</field> 
    <field name="Product">Dodge Challenger</field> 
    <field name="Price">35000</field> 
</doc> 
<doc> 
    <field name="Name">John Q. Public</field> 

、ここにあなたの例のための可能なクエリ構文です私はこれまで以上に仕事ができました!

この軟膏の唯一のフライは価格フィールドのデータタイプです。最小限のコードを書いている点で、それをゼロ詰めの文字列として格納すると(おそらくセントで、私がアメリカのマネーシステムを理解すれば!)、それは最も簡単なアプローチです。しかし、実行するトランザクションの数に応じて重要な可能性がある最も優れた方法は、数値フィールドを使用することです(やはりセントで)。 Luceneクエリーパーサーを使用するときに問題が発生します。このフィールドタイプは理解できません。

とにかく、数値フィールドの問題は間違いなく別の質問の見出しになります。

幸運を祈る!

+0

私の質問のほとんどは顧客中心です。そのため、インデックスを注文中心に変換すると、大量の顧客データが複製されることになります。重複顧客を淘汰する標準的な方法はありますか?私が読んだことの何も(フィルター、コレクター、照合)は適合しているようです... – inanutshellus

+0

データを保存していない場合(つまり、Luceneを使用してデータをインデックスに登録していない場合)、心配しないでください。データを複製することで大きな違いはありません。それはすべて、用語クエリの検索についてです。あなたのデータのサンプルでそれを試し、インデックスのサイズの違いが何であるかを見てください。私はあなたがあまりにも心配しているとは思わないでしょう(あなたがディスク容量が非常に少ない場合を除きます)。 –

+0

ここでスピード/インデックスのサイズは心配していません。たとえば、あなたの例ではすべての "John"を検索すると2つではなく4つのレコードが返されますが、私はその重複しないロジックをJavaプロジェクトに渡す必要はありません。 – inanutshellus

関連する問題