当存在动态场时,SOLR突出显示与多个字段HL.FL不起作用



我的索引中有一个动态文本字段bar_*,并希望Solr返回该字段的突出显示。所以我运行的是:

q=gold&hl=true&hl.fl=bar_*

它可以按预期工作,但如果我在hl.fl中添加更多字段,则停止工作。例如

q=gold&hl=true&hl.fl=bar_*,foo

注意:

  • bar_*foo字段在索引/架构中,这里没有错误。
  • 仅根据q=gold&hl=true&hl.fl=bar_*&hl.fl=fooq=gold&hl=true&hl.fl=bar_* foo重写请求无济于事。
  • 我在Solr Jira中没有在该主题上找到任何错误。

有人知道如何遇到这个问题吗?我看到的可能的解决方法是:

  1. 使用hl.fl=*。但这对性能不利。
  2. 明确指定我的动态字段的所有可能字段名称。但是我一点都不喜欢。

我不知道使用了哪个版本,但是这似乎是以前的solr版本的错误,我可以在Solr 7.3中确认这是按预期工作的。

curl -X GET 
  'http://localhost:8983/solr/test/select?q=x_ggg:Test1%20OR%20bar_x:Test2&hl=true&hl.fl=%2A_ggg,foo,bar_%2A' 
  -H 'cache-control: no-cache'

更正确的方法是:hl.fl=bar_*,foo,*_ggg(使用,或空间作为定界符)。

这有助于避免从hl.fl参数中删除星号并按字段突出显示时长时间调试,因为该字段不再处理为REGEX。

这是Solr 7.3来源中的斑点,我们可以追踪此行为:

  1. solr调用 org.apache.solr.highlight.SolrHighlighter#getHighlightFields
  2. 在处理字段之前,由,或空间拆分的值此处: org.apache.solr.util.SolrPluginUtils#split
  private final static Pattern splitList=Pattern.compile(",| ");
  /** Split a value that may contain a comma, space of bar separated list. */
  public static String[] split(String value){
     return splitList.split(value.trim(), 0);
  }
  1. 拆分的结果转到方法org.apache.solr.highlight.SolrHighlighter#expandWildcardsInHighlightFields

在文档中也提到了预期合同https://lucene.apache.org/solr/guide/7_3/highlighting.html

hl.fl 指定要突出显示的字段列表。接受塞尔应该生成突出显示的片段的逗号或空间限制的字段列表。

*(星号)的通配符可用于匹配字段地球,例如text_ *甚至 *,以突出显示可能突出显示的所有字段。使用 *时,请考虑添加hl.requirefieldmatch = true。

未定义时,将使用为DF查询参数定义的默认值。

尝试

q=gold&hl=true&hl.fl=bar_*&hl.fl=foo

挖掘Solr源后(org.apache.solr.highlight.SolrHighlighter#getHighlightFields),我为此找到了解决方法。如Solr所示,将hl.fl内容解释为正则表达方式。因此,我已经指定了HL.FL为:

hl.fl=bar_*|foo

即。使用|而不是逗号。这对我来说很好。

顺便说一句,我在Internet中没有发现有关此文件的文档。

最新更新