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

标签 dynamic solr field

您好,我已阅读 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 为 101102 的文档将出现在结果中。现在我想返回与查询匹配的契约(Contract)的不同字段。

在此示例中,对于文档 102,这些应为 contract_change_date_1_dt,对于文档 101,这些应为 contract_change_date_2_dt,因为契约(Contract)号1 号是文档 102 中的外部契约(Contract),2 号契约(Contract)是文档 101 中的外部契约(Contract)。

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


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

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

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

我希望我的问题说清楚了。任何作为存档此内容的好方法的建议都非常感谢。

问候雷内

最佳答案

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

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

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

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

相关文章:

solr - 使用 Solr 的 NGramFilterFactory 进行相似性搜索

html - xslt disable-output-escaping 将非拉丁字符变成问号 "...???????????..."

apache - Solr 查询搜索单个关键字的多个实例

jquery - 嵌套表单字段 gem 与 cocoon

c# - C# 类中的@namespace 字段是什么?

c++ - 在 C++ 中扩展数组

运行时的 WPF Binding.ValidationRules

C++ DLL 注入(inject)后不执行函数

asp.net - 无法加载 View 状态。正在加载 View 状态的控制树必须与用于保存 View 状态的控制树匹配

php - 在 Twitter 上分享表单输入