【问题标题】:Solr highlighting does not work with multiple fields hl.fl when dynamic field is present当存在动态字段时,Solr 突出显示不适用于多个字段 hl.fl
【发布时间】:2019-11-14 22:00:56
【问题描述】:

我的索引中有一个动态文本字段 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. 为我的动态字段明确指定所有可能的字段名称。但我一点也不喜欢。

【问题讨论】:

  • 您确定索引中有 foo 字段吗?

标签: solr


【解决方案1】:

我不知道使用的是什么版本,但这似乎是以前 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 参数中删除星号并且按字段突出显示停止工作时,这有助于避免长时间调试,因为该字段不再作为正则表达式处理。

以下是 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 指定要突出显示的字段列表。接受以逗号或空格分隔的字段列表,Solr 应为其生成突出显示的 sn-ps。

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

如果未定义,将使用为 df 查询参数定义的默认值。

【讨论】:

    【解决方案2】:

    试试

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

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请编辑您的答案以添加一些解释,包括您所做的假设。
    【解决方案3】:

    在深入了解 Solr 资源 (org.apache.solr.highlight.SolrHighlighter#getHighlightFields) 后,我找到了解决方法。 Solr 将hl.fl 内容解释为正则表达式模式。所以我将 hl.fl 指定为:

    hl.fl=bar_*|foo
    

    即使用| 而不是逗号。这对我来说非常有效。

    顺便说一句,我在互联网上没有找到这方面的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-27
      • 2018-03-07
      • 1970-01-01
      • 2015-11-27
      • 2014-11-23
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多