关联文档中的多值字段?

时间:2011-07-13 21:34:33

标签: lucene solr faceted-search

假设我有一个客户的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?

1 个答案:

答案 0 :(得分: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 documentation比我做得更好!

本软膏中唯一的优点是价格字段的数据类型。在编写最少代码方面,如果你将它存储为零填充字符串(如果我理解美国货币系统,可能以美分为单位),这是最简单的方法。但是,表现最佳的方法(可能很重要,取决于您可能拥有的交易次数)是使用数字字段(再次使用美分)。使用Lucene查询解析器时遇到了麻烦:它不理解这个字段类型。

无论如何,数字字段问题肯定属于另一个问题的标题。

祝你好运!