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

Dynamic Solr为结果中的每个文档返回不同的输出字段,dynamic,solr,field,Dynamic,Solr,Field,您好,我已阅读Solr wiki并在此处搜索,但未找到适用于我的用例的解决方案: 我们正在将具有不同类型合同的客户数据索引到单个文档中。 因此,每个客户将生成一个包含一个或多个不同合同的Solr文档 通过导入动态添加每个合同的字段(例如,合同类型1、合同类型2、…;合同变更日期1、合同变更日期2、…)。因此,所有带有“2”的字段都与第2号合同相关。 有了它,用户就可以搜索拥有第一类合同而没有第二类合同的客户,以此类推 我的用例现在只返回与查询匹配的合同字段 下面是一个例子: 100 保罗 室内

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

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

通过导入动态添加每个合同的字段(例如,合同类型1、合同类型2、…;合同变更日期1、合同变更日期2、…)。因此,所有带有“2”的字段都与第2号合同相关。 有了它,用户就可以搜索拥有第一类合同而没有第二类合同的客户,以此类推

我的用例现在只返回与查询匹配的合同字段

下面是一个例子:


100
保罗
室内
2012-09-01T00:00:00Z
101
弗雷德
室内
2012-09-01T00:00:00Z
外部的
2012-09-01T00:00:00Z
102
卡尔
外部的
2012-09-01T00:00:00Z
室内
2012-09-01T00:00:00Z
如果用户现在搜索合同类型为“外部”的客户,则结果中将包含ID为101102的文档。现在我想返回与查询匹配的合同的不同字段

在本例中,对于文件102和文件101应分别为合同变更日期和合同变更日期,因为合同编号1在文件102中是外部的,合同编号2在文件101中是外部的

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


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

我以以下决议结束,但它迫使我扩展Solr:

  • 编写一个QParser来识别需要的字段,将它们添加到fl参数
  • 在将结果返回给客户端之前执行突出显示查询
  • 迭代结果中的所有文档,并将与每个文档的查询匹配的字段添加到结果列表中
  • 我希望我把问题说清楚。我们非常感谢您提出的任何归档建议


    问候勒内

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

    现在,我通过以下方式建立了自定义结果列表:

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

    //使参数可修改
    ModifiableSolrParams modifiableParams=新的ModifiableSolrParams(params);
    要求设置参数(可修改参数);
    modifiableParams.set(HighlightParams.FIELDS,queryFieldList);
    modifiableParams.set(HighlightParams.HIGHLIGHT,“true”);
    modifiableParams.set(HighlightParams.FIELD_匹配,“true”);
    modifiableParams.set(HighlightParams.SIMPLE_PRE,“”);
    modifiableParams.set(HighlightParams.SIMPLE_POST,“”);
    
    创建自定义HighlightComponent(扩展标准HighlightComponent)以根据标准结果生成结果。在process方法中,我现在可以获得突出显示信息并提取我需要的信息:

    NamedList rspValues=rb.rsp.getValues();
    NamedList nlHl=(NamedList)rspValues.get(“突出显示”);
    this.hlDocsAndFields=提取HighlightingInfo(nlHl);
    
    为此,我创建了一个自定义列表,它能够计算每个合同的匹配项(突出显示的结果中有多少合同字段)

    这个很好用

    现在,我把注意力集中在响应编写者身上,他在构建响应时自己解析文档字段:-(

    有没有关于更改/定制回复作者的建议


    你好,勒内

    我现在处理好了整个事情

    我绝对不能改变作者的回答:-)

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

    rb.rsp.setReturnFields(globalResultFields);
    

    你好René

    因为您知道“哪个字段匹配”问题的情况,并且希望避免扩展Solr,所以我建议您获取所有文档的所有字段,然后在客户端解析结果。顺便说一句,如果你使用正确的用户名和永久帐户,你会得到更多的回复。嘿,谢谢你的回复。问题是,如果一个客户有很多合同,那么每个文档都有很多字段。目前最大值约为470。在一个特定的案例中,我需要读取多达40000个客户,这将是一个巨大的数据量,只需扔掉60%…因为您要在单个Solr文档中合并不同的合同,但您只需要返回匹配的合同…为什么不将每个合同作为不同的文档进行索引?您好,javanna,感谢回复:-)用户应该能够在一次查询中按条件从合同和客户数据中搜索,因此我们需要将所有数据一起索引。如果我们对合同进行独立索引,我们就失去了客户和合同之间的关系。