我的索引中有一个动态文本字段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_*
字段位于索引/架构中,此处没有错误。foo
或q=gold&hl=true&hl.fl=bar_*&hl.fl=foo
无效。有没有人知道如何咬这个。我看到的可能的解决方法是:
q=gold&hl=true&hl.fl=bar_* foo
。但是这个不利于表现。答案 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的源代码中有一些斑点,我们可以在其中跟踪此行为:
org.apache.solr.highlight.SolrHighlighter#getHighlightFields
,
分隔的值或此处的空格:
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);
}
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
即。使用|
代替逗号。这对我很有用。
顺便说一下,我在互联网上找不到这方面的文件。