2

您好,我已阅读 Solr wiki 并在此处搜索,但没有找到适合我用例的解决方案:

我们正在将具有不同类型合同的客户数据索引到一个文档中。因此,每个客户都会生成一份包含一份或多份不同合同的 Solr 文档。

每个合约的字段通过导入动态添加(例如contract_type_1_s、contract_type_2_s、...;contract_change_date_1_dt、contract_change_date_2_dt、...)。因此,所有带有“ 2 ”的字段都与第 2 号合同相关。这样,用户可以搜索具有第 1 类合同但没有第 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 为101102的文档。现在我想返回与查询匹配的合同的不同字段。

在此示例中,对于文档102,它们应该是contract_change_date_1_dt ,对于文档101 ,它们应该是contract_change_date_2_dt,因为 1 号合同在文档 102 中是外部的,而 2 号合同在文档 101 中是外部的。

有没有办法通过内置组件实现这种行为?


我知道我可以找出哪些字段与查询与突出显示组件相匹配。

我最终得到以下解决方案,但它迫使我扩展 Solr:

  1. 编写一个 QParser 来识别需要字段,将它们添加到 fl-param
  2. 在将结果返回给客户端之前执行突出显示查询
  3. 遍历结果中的所有文档并将与每个文档的查询匹配的字段添加到结果列表中

我希望我把我的问题说清楚了。非常感谢任何可以将其存档的好方法的建议。

问候勒内

4

2 回答 2

1

如果有人需要类似的东西;-)

我现在设法通过以下方式建立我的自定义结果列表:

创建一个自定义查询组件(扩展标准查询组件)来存储查询中使用的字段。在准备方法中使用存储的字段激活突出显示:

// 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)以根据标准构建结果。结果。在过程方法中,我现在获取突出显示信息并提取我需要的信息:

NamedList<Object> rspValues = rb.rsp.getValues();
NamedList<Object> nlHl = (NamedList<Object>) rspValues.get("highlighting");
this.hlDocsAndFields = extractHighlightingInfo(nlHl);

为此,我创建了一个自定义列表,它能够计算每个合同的匹配数(突出显示的结果中有多少合同_X_s 字段)。

这工作正常。

我现在停留在响应作者身上,他在构建响应时自己解析文档字段:-(

有人对更改/自定义响应作者有什么建议吗?

问候勒内

于 2012-08-08T13:31:50.073 回答
1

我现在管理了整个事情。

我根本不能更改响应作者:-)

我只需要存储我为每个文档解析的所有字段并将它们添加到响应中:

rb.rsp.setReturnFields(globalResultFields);

问候勒内

于 2012-08-09T07:16:34.833 回答