【转摘】短语查询时Solr高亮显示不完整

  • 作者: 凯哥Java(公众号:凯哥Java)
  • 工作小总结
  • 时间:2021-12-27 17:52
  • 2947人已阅读
简介 (2011-06-1101:11:49)使用SOLR的高亮显示,发现一个问题:显示不完整。比如,查询是:q="verygood"而返回的高亮是:...<em>very</em>实际的字段值是:...verygood...所以,正确的是:...<em>very</em><em>good</em>...分析:问

🔔🔔好消息!好消息!🔔🔔

 如果您需要注册ChatGPT,想要升级ChatGPT4。凯哥可以代注册ChatGPT账号代升级ChatGPT4

有需要的朋友👉:微信号 kaigejava2022

(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

TopTop