Lucene 在文档中关联多值字段?

Lucene 在文档中关联多值字段?,lucene,solr,faceted-search,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 考虑

假设我有一个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>
  ...

约翰·史密斯
鸡肉三明治
10
道奇挑战者
35000
约翰·Q·公众
...
最终会把所有的价格和产品作为多值字段混在一起,并失去它们之间的关联


我如何将其输入我的索引?我如何查询它?这样搜索“每一位为鸡肉三明治支付超过12美元的顾客”只会返回John Q.Public

听起来您需要的查询需要将每个单独的事务作为一个文档。因此,对于您给出的示例,数据如下所示:

<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查询解析器时会出现问题:它不理解此字段类型

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


祝你好运

实际上,我所有的查询都是以客户为中心的。因此,将我的索引转换为以订单为中心将最终为我提供大量重复的客户数据。有没有标准的方法来剔除重复的客户?我读到的东西(过滤器、收集器、排序规则)似乎都不适合……如果你不“存储”数据(即,只使用Lucene对数据进行索引),那么就不用担心了。复制数据不会有多大区别。这都是关于术语查询查找的。在数据样本上尝试一下,看看索引大小有什么不同。我怀疑您会觉得这太令人担忧了(除非您的磁盘空间非常不足)。我不担心这里的速度/索引大小,更好奇的是,当我重新获得重复客户时该怎么办。例如,在您的示例中搜索所有“John”将返回4条记录,而不是2条记录,我不希望将重复数据消除逻辑交给我的java项目。嗯,我明白您的意思。在这种情况下,您的原始模式可能是正确的。我的问题可能也是正确的(这是否意味着我会得到一个半正确的答案??)。该名称将包含您需要的信息。你是如何考虑更新索引的?我想您需要阅读现有条目,删除文档并再次添加。(在Lucene中,每个字段可以有多个值)。如果客户再次订购,您只需更新他的记录和所有订单即可。无论如何,我想我需要继续挖掘。谢谢你的帮助!
Product:"Chicken Sandwich" AND Price:[00000000 TO 00001200]