您好,我已阅读 Solr wiki 并在此处进行搜索,但没有找到适合我的用例的解决方案:
我们正在将具有不同类型契约(Contract)的客户数据索引到单个文档中。 因此,每个客户都会生成一份包含一个或多个不同契约(Contract)的 Solr 文档。
每个契约(Contract)的字段都是通过导入动态添加的(例如contract_type_1_s、contract_type_2_s、...;contract_change_date_1_dt、contract_change_date_2_dt、...)。因此,所有带有“2”的字段都与 2 号契约(Contract)相关。 通过此功能,用户可以搜索拥有第一类契约(Contract)且没有第二类契约(Contract)的客户,依此类推。
我的用例现在是仅返回与查询匹配的契约(Contract)字段。
这是一个例子:
<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>
如果用户现在搜索契约(Contract)类型为“外部”的客户,则 ID 为 101 和 102 的文档将出现在结果中。现在我想返回与查询匹配的契约(Contract)的不同字段。
在此示例中,对于文档 102,这些应为 contract_change_date_1_dt,对于文档 101,这些应为 contract_change_date_2_dt,因为契约(Contract)号1 号是文档 102 中的外部契约(Contract),2 号契约(Contract)是文档 101 中的外部契约(Contract)。
有没有办法通过内置组件实现这种行为?
我知道我可以找出哪些字段与突出显示组件的查询相匹配。
我最终得到了以下解决方案,但它迫使我扩展 Solr:
- 编写一个 QParser 来识别 needet 字段,并将它们添加到 fl-param
- 在将结果返回给客户端之前执行突出显示查询
- 迭代结果中的所有文档,并将与每个文档的查询匹配的字段添加到结果列表中
我希望我的问题说清楚了。任何作为存档此内容的好方法的建议都非常感谢。
问候雷内
最佳答案
如果有人需要类似的东西;-)
我现在设法通过以下方式构建我的自定义结果列表:
创建一个自定义查询组件(扩展标准查询组件)来存储查询中使用的字段。在准备方法中激活突出显示存储的字段:
// Making params modifieable
ModifiableSolrParams modifiableParams = new ModifiableSolrParams(params);
req.setParams(modifiableParams);
modifiableParams.set(HighlightParams.FIELDS, queryFieldList);
modifiableParams.set(HighlightParams.HIGHLIGHT, "true");
modifiableParams.set(HighlightParams.FIELD_MATCH, "true");
modifiableParams.set(HighlightParams.SIMPLE_PRE, "");
modifiableParams.set(HighlightParams.SIMPLE_POST, "");
创建一个自定义HighlightComponent(扩展标准HighlightComponent)以从std中构建结果。结果。在处理方法中,我现在获取突出显示信息并提取我需要的信息:
NamedList<Object> rspValues = rb.rsp.getValues();
NamedList<Object> nlHl = (NamedList<Object>) rspValues.get("highlighting");
this.hlDocsAndFields = extractHighlightingInfo(nlHl);
为此,我创建了一个自定义列表,它能够计算每个契约(Contract)的匹配数(突出显示的结果中有多少contract_X_s 字段)。
这很好用。
我现在陷入了响应编写者在构建响应时自行解析文档字段的情况:-(
有人对更改/自定义响应编写器有建议吗?
问候雷内
关于dynamic - Solr 在结果中为每个文档返回不同的输出字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11743144/