假设我有一个客户的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?
答案 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查询解析器时遇到了麻烦:它不理解这个字段类型。
无论如何,数字字段问题肯定属于另一个问题的标题。
祝你好运!