0

Luceneの顧客インデックスがあるとします。各顧客は注文した製品を持っています。

これらの2つのフェラーが私のインデックスの2つのドキュメントを表しているとしましょう。

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

私のインデックスが注文中心ではなく顧客中心であることを考えると、私のドキュメントはおそらく次のようになります。

<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>
  ...

これは、すべての価格と製品を多値フィールドとしてまとめて、それらの相対的な関連付けを失うことになります。

「チキンサンドイッチに12ドル以上を支払ったすべての顧客」を検索すると、ジョンQ.パブリックのみが返されるように、これをインデックスにどのように取得し、どのようにクエリしますか。

4

1 に答える 1

0

必要なクエリには、それぞれ個別のトランザクションをドキュメントとして含める必要があるようです。したがって、あなたが与えた例では、データは次のようになります。

<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>

上記のスキーマが与えられた場合、例の可能なクエリ構文は次のとおりです。

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

詳細については、Luceneのドキュメントは私がこれまでにできたよりも優れた仕事をしています!

この軟膏の唯一のフライは、価格フィールドのデータ型です。最小限のコードを書くという点では、ゼロで埋められた文字列として保存する場合(アメリカの通貨システムを理解している場合は、おそらくセント単位で!)、これが最も簡単なアプローチです。ただし、最もパフォーマンスの高いアプローチ(トランザクションの数によっては重要な場合があります)は、数値フィールド(ここでもセントを使用)を使用することです。Luceneクエリパーサーを使用すると問題が発生します。このフィールドタイプを理解していません。

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

幸運を!

于 2011-07-14T00:58:09.853 に答える