当存在动态字段时,Solr突出显示不适用于多个字段hl.fl

时间:2017-12-07 08:37:53

标签: solr

我的索引中有一个动态文本字段token.replace('-', '+').replace('_', '/') ,并希望Solr返回该字段的突出显示。所以我跑的是:

bar_*

它按预期工作但是如果我向q=gold&hl=true&hl.fl=bar_* 添加更多字段,它就会停止工作。 E.g。

hl.fl

注意:

  • q=gold&hl=true&hl.fl=bar_*,foo bar_*字段位于索引/架构中,此处没有错误。
  • 只需重写请求fooq=gold&hl=true&hl.fl=bar_*&hl.fl=foo无效。
  • 我没有在Solr JIRA中发现任何有关该主题的错误。

有没有人知道如何咬这个。我看到的可能的解决方法是:

  1. 使用q=gold&hl=true&hl.fl=bar_* foo。但是这个不利于表现。
  2. 明确指定动态字段的所有可能字段名称。但我根本不喜欢这样。

3 个答案:

答案 0 :(得分:4)

我不知道使用什么版本,但是这似乎是以前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. 拨打电话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应该为其生成突出显示的代码段。

     

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

     

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

答案 1 :(得分:0)

尝试

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

答案 2 :(得分:0)

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

hl.fl=bar_*|foo

即。使用|代替逗号。这对我很有用。

顺便说一下,我在互联网上找不到这方面的文件。