Solr为结果中的每个文档返回不同的输出字段

时间:2012-07-31 15:05:59

标签: dynamic solr field

您好我已阅读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为 101 102 的文档。现在我想返回与查询匹配的合同的不同字段。

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

有没有办法用内置组件来实现这种行为?


我知道我可以通过highlight-component找出哪些字段与查询匹配。

我努力遵循以下决议,但这迫使我延长Solr:

  1. 编写QParser以识别needet字段,将它们添加到fl-param
  2. 在将结果返回给客户端之前执行突出显示查询
  3. 对结果中的所有文档进行迭代,并将与每个文档的查询匹配的字段添加到结果列表中
  4. 我希望我能清楚地解决问题。任何建议,这是一个很好的存档方式,非常感谢。

    问候René

2 个答案:

答案 0 :(得分:1)

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

我现在设法按以下方式构建我的自定义结果列表:

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

// 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);

为此我创建了一个自定义List,它可以计算每个合约的匹配数(contract_X_s在突出显示的结果中有多少个字段)。

这很好用。

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

有没有人对changig /自定义响应作者提出建议?

问候René

答案 1 :(得分:1)

我现在管理了整个事情。

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

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

rb.rsp.setReturnFields(globalResultFields);

问候René