我的索引中有一个动态文本字段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=foo
或q=gold&hl=true&hl.fl=bar_* foo
重写请求无济于事。 - 我在Solr Jira中没有在该主题上找到任何错误。
有人知道如何遇到这个问题吗?我看到的可能的解决方法是:
- 使用
hl.fl=*
。但这对性能不利。 - 明确指定我的动态字段的所有可能字段名称。但是我一点都不喜欢。
我不知道使用了哪个版本,但是这似乎是以前的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来源中的斑点,我们可以追踪此行为:
- solr调用
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 指定要突出显示的字段列表。接受塞尔应该生成突出显示的片段的逗号或空间限制的字段列表。
*(星号)的通配符可用于匹配字段地球,例如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中没有发现有关此文件的文档。