【转摘】短语查询时Solr高亮显示不完整
- 工作小总结
- 时间:2021-12-27 17:52
- 3489人已阅读
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
(2011-06-11 01:11:49)
使用SOLR的高亮显示,发现一个问题:显示不完整。
比如,查询是:q="very good"
而返回的高亮是:...<em>very</em>
实际的字段值是:...very good...
所以,正确的是:...<em>very</em> <em>good</em>...
分析:问题应该在于预留的高亮显示字符数太少,导致被截断。
解决:增大字符数。
具体方案如下,有两个。
1. 直接增大字符数
可以使用传入参数的方式来增大字符数,如:hl.fragsize=120【默认是100】
但是这种方式并不能治本,因为总是能够找到一个超过限制的案例,使显示不完整。
2. 返回多个字符串,然后合并
使用参数:hl.snippets=2&hl.mergeContiguous=true
这是针对SOLR高亮的原理来使用的。高亮时,实际上是处理了两个循环:
for(String textValue : 每行的值) {// 比如Field类型是multiValue的
i++
for(String 待高亮的值 : 分割的关键词数组) {// 比如q="very good"
本次高亮行[0...J]=doProcess(待高亮的值)
}
高亮行[0...I,0...J]=本次高亮行
}
最终得到一个大数组,数组元素个数=(I+1)*(J+1)。
SOLR为了简化处理,设置了一个参数hl.snippets【默认=1】来控制每层循环中保留的最大个数。
同时,由于内层循环处理的是一个值的不同分割,为了更方便显示,用参数hl.mergeContiguous来控制是否合并在一起。
这个方案也有个问题,那就是当只想保留一个高亮行时,就会出现显示不完整的错误。其实这个问题比较好解决。当hl.mergeContiguous=true的时候,内层循环会进行合并,最终只会出来一行数据。所以,改进如下:
for(String textValue : 每行的值) {// 比如Field类型是multiValue的
i++
if(hl.mergeContiguous && hl.snippets==1) maxNumFrag=3
for(String 待高亮的值 : 分割的关键词数组) {// 比如q="very good"
本次高亮行[j++]=doProcess(待高亮的值)
}
高亮行=合并高亮行(本次高亮行[j])
}
http://blog.sina.com.cn/s/blog_539d361e0100rofl.html