【问题标题】:Associating multivalued fields within a document?关联文档中的多值字段?
【发布时间】:2011-07-13 21:34:32
【问题描述】:

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

【问题讨论】:

    标签: lucene solr faceted-search


    【解决方案1】:

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

    <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 查询解析器时遇到问题:它不理解这种字段类型。

    无论如何,数字字段问题肯定属于不同问题的标题。

    祝你好运!

    【讨论】:

    • 几乎我所有的查询都是以客户为中心的。因此,将我的索引转换为以订单为中心最终会给我大量重复的客户数据。是否有剔除重复客户的标准方法?我读过的所有内容(过滤器、收集器、排序规则)似乎都不适合......
    • 如果您没有“存储”数据(即仅使用 Lucene 对数据进行索引),请不要担心。复制数据不会有太大的不同。这都是关于术语查询查找的。在您的数据样本上尝试一下,看看索引大小的差异是什么。我怀疑你会觉得这太令人担忧了(除非你的磁盘空间非常不足)。
    • 我不担心这里的速度/索引大小,我更想知道当我得到重复的客户时该怎么办。例如,在您的示例中搜索所有“John”将返回 4 条记录,而不是 2 条,我宁愿不必将重复数据删除逻辑交给我的 java 项目。
    • 嗯,我明白你的意思了。在那种情况下,您的原始架构可能是正确的。我的查询也可能是正确的(这是否意味着我会得到一半正确的答案??)。该名称将包含您需要的信息。您是如何考虑更新索引的?我想您需要阅读现有条目,删除文档并再次添加。 (Lucene 中每个字段的多个值都可以)。
    • 如果客户再次订购,您只需更新他的记录,包括他的所有订单。无论如何,我想我需要继续挖掘。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多