0

假设我有一个客户的 Lucene 索引。每个客户都有他们订购的产品。

假设这两个家伙代表我索引中的两个文档:

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 美元的顾客”将只返回 John Q.Public?

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