【发布时间】:2012-07-31 15:05:58
【问题描述】:
您好,我已阅读 Solr wiki 并在此处搜索,但没有找到适合我的用例的解决方案:
我们正在将具有不同类型合同的客户数据索引到一个文档中。 因此,每个客户都会生成一份包含一份或多份不同合同的 Solr 文档。
通过导入动态添加每个合同的字段(例如,contract_type_1_s、contract_type_2_s、...;contract_change_date_1_dt、contract_change_date_2_dt、...)。因此,所有带有“2”的字段都与 2 号合同相关。 有了这个,用户就可以搜索拥有第一类合同而没有第二类合同的客户,依此类推。
我现在的用例是只返回与查询匹配的合同字段。
这是一个例子:
<doc>
<field name="id">100</field>
<field name="customer_name">paul</field>
<field name="contract_type_1_s">inhouse</field>
<field name="contract_change_date_1_dt">2012-09-01T00:00:00Z</field>
</doc>
<doc>
<field name="id">101</field>
<field name="customer_name">fred</field>
<field name="contract_type_1_s">inhouse</field>
<field name="contract_change_date_1_dt">2012-09-01T00:00:00Z</field>
<field name="contract_type_2_s">external</field>
<field name="contract_change_date_2_dt">2012-09-01T00:00:00Z</field>
</doc>
<doc>
<field name="id">102</field>
<field name="customer_name">karl</field>
<field name="contract_type_1_s">external</field>
<field name="contract_change_date_1_dt">2012-09-01T00:00:00Z</field>
<field name="contract_type_2_s">inhouse</field>
<field name="contract_change_date_2_dt">2012-09-01T00:00:00Z</field>
</doc>
如果用户现在搜索合同类型为“外部”的客户,则结果中包含 ID 为 101 和 102 的文档。现在我想返回与查询匹配的合同的不同字段。
在此示例中,对于文档 102,这些应该是 contract_change_date_1_dt,对于文档 101,这些应该是 contract_change_date_2_dt,因为合同号1 在文档 102 中是外部的,而第 2 号合同在文档 101 中是外部的。
有没有办法通过内置组件实现这种行为?
我知道我可以找出哪些字段与查询与突出显示组件相匹配。
我同意以下解决方案,但它迫使我扩展 Solr:
- 编写一个QParser来识别needet字段,将它们添加到fl-param
- 在将结果返回给客户端之前执行突出显示查询
- 遍历结果中的所有文档并将与每个文档的查询匹配的字段添加到结果列表中
我希望我把我的问题说清楚了。非常感谢任何可以很好地存档此内容的建议。
问候勒内
【问题讨论】:
-
既然您知道“哪个字段匹配”问题的情况并且您想避免扩展 Solr,我建议您获取所有文档的所有字段,然后在客户端解析结果。顺便说一句,如果您使用正确的用户名和永久帐户,您会收到更多回复。
-
您好,谢谢您的回复。问题是,如果客户有很多合同,我们每个文档都会有很多字段。目前最大值约为 470。在一个特定情况下,我必须读取多达 40.000 个客户,这将是大量数据,只是为了丢弃 60%...
-
由于您在单个 Solr 文档中合并不同的合同,但您只需要返回匹配的合同...为什么不将每个合同索引为不同的文档?
-
您好 javanna,感谢您的回复 :-) 用户应该能够在一次查询中根据合同数据和客户数据的条件进行搜索,因此我们需要将所有数据一起索引。如果我们独立索引合同,我们就会松散客户与合同之间的关系。