solr Highlighter (高亮)显示分析

本文原创,转载请说明出处:http://ronxin999.blog.163.com/blog/static/42217920201292951457295/

solr 高亮显示是根据我们搜索的内容中,根据搜索的关键字,在内容中取一段摘要,类似百度,google搜索结果中出现关键字的一段描述。

首先要solr的高亮功能work,必须在搜索请求的URL里加上参数:hl=on,该参数只是告诉solr我要高亮查询。接下来就是其他的参数,下面主要说明重要的参数:

hl.fl  

hl.fl是说明你要关键字的摘要在那个field中取,我们一般是content字段。

hl.useFastVectorHighlighter

该参数很重要,如果你不看代码,是很难发现他的好处,默认是false,即文本段的划分是按每50个字符来划分,然后在这个50个字符中取关键字相关的摘要,摘要长度为100,参考后面的参数(hf.fragsize),如果我们在参数中指定值为true,那么SOLR
会根据关键词的在文本中的偏移量来计算摘要信息,前提是你的field要加上 termPositions="true" termOffsets="true"这两项。

hl.snippets

hl.snippets参数是返回高亮摘要的段数,因为我们的文本一般都比较长,含有搜索关键字的地方有多处,如果hl.snippets的值大于1的话,会返回多个摘要信息,即文本中含有关键字的几段话,默认值为1,返回含关键字最多的一段描述。solr会对多个段进行排序。

hl.fragsize

hl.fragsize参数是摘要信息的长度。默认值是100,这个长度是出现关键字的位置向前移6个字符,再往后100个字符,取这一段文本。

hl.boundaryScanner  hl.bs.maxScan  hl.bs.chars

boundaryScanner是边界扫描,就是怎么取我们高亮摘要信息的起始位置和结束位置,这个是我们摘要信息的关键,因为我们模式高亮摘要的开始和结束可能是某句话中截段的。上面这三个参数需要放在一起来说明,因为后两个是在我们没有给hl.boundaryScanner设定值,即默认值时才会有效,对应的class为:SimpleBoundaryScanner,上面讲了hl.fragsize参数,

SimpleBoundaryScanner会根据hl.fragsize参数决定的关键字的起始偏移量和结束偏移量,重新计算摘要的起始偏移量,首先说开始偏移量,源码如下:


public int findStartOffset(StringBuilder buffer, int start) { // avoid illegal start offset if( start > buffer.length() || start < 1 ) return start;

//maxScan是hl.bs.maxScan的值,它是说明从关键字出现的位置往前6个字符开始向前,在maxScan个字符内找是否出 现一个

//一个由参数hl.bs.chars指定的分界符。即从这里作为摘要的起始偏移。 如果往前maxScan个字符内没有发现指定的字符,

//则按起始便宜为start,即关键词往前的6个字符。

int offset, count = maxScan; for( offset = start; offset > 0 && count > 0; count-- ){ // found? if( boundaryChars.contains( buffer.charAt( offset - 1 ) ) ) return offset; offset--; } // if we scanned up to the start of the text, return it, its a "boundary" if (offset == 0) { return 0; } // not found return start; }

结束便宜量和计算起始偏移量是一样的,只不过是从关键词的位置往后100个字符的位置往后找分隔符,maxScan的默认值为10,hl.sc.chars的默认值为.,!? &#9;&#10;&#13;

hl.boundaryScanner参数我们不指定值时,按上面的算法计算高亮摘要信息,但solr还提供了一种算法,即breakIterator,我们在请求参数中添加&hl.boundaryScanner=breakIterator时生效,这是solr通过java jdk的BreakIterator来计算分界符的。他相关的参数为,hl.bs.type,这个是主要的参数,决定BreakIterator怎么划分界定符,值有:CHARACTER, WORD, SENTENCE and LINE,SENTENCE 是按句子来划分,即你高亮摘要信息是一个完整的句子,而不会被截断。

希望通过这篇博文,让您更加理解solr 高亮的原理,共同进步。有不对之处,还请指教。

好了,主要solr高亮主要参数都结束完了,有些东西还真不知道怎么描述,语言组织还需有待提高啊。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值