【问题标题】:Solr returning different output fields for each document in resultSolr 为结果中的每个文档返回不同的输出字段
【发布时间】: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 为 101102 的文档。现在我想返回与查询匹配的合同的不同字段。

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

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


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

我同意以下解决方案,但它迫使我扩展 Solr:

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

我希望我把我的问题说清楚了。非常感谢任何可以很好地存档此内容的建议。

问候勒内

【问题讨论】:

  • 既然您知道“哪个字段匹配”问题的情况并且您想避免扩展 Solr,我建议您获取所有文档的所有字段,然后在客户端解析结果。顺便说一句,如果您使用正确的用户名和永久帐户,您会收到更多回复。
  • 您好,谢谢您的回复。问题是,如果客户有很多合同,我们每个文档都会有很多字段。目前最大值约为 470。在一个特定情况下,我必须读取多达 40.000 个客户,这将是大量数据,只是为了丢弃 60%...
  • 由于您在单个 Solr 文档中合并不同的合同,但您只需要返回匹配的合同...为什么不将每个合同索引为不同的文档?
  • 您好 javanna,感谢您的回复 :-) 用户应该能够在一次查询中根据合同数据和客户数据的条件进行搜索,因此我们需要将所有数据一起索引。如果我们独立索引合同,我们就会松散客户与合同之间的关系。

标签: dynamic solr field


【解决方案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 字段)。

这很好用。

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

有人对更改/自定义响应编写器有什么建议吗?

问候勒内

【讨论】:

    【解决方案2】:

    我现在管理了整个事情。

    我绝对不能更改响应作者 :-)

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

    rb.rsp.setReturnFields(globalResultFields);
    

    问候勒内

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多