本文原创,转载请说明出处: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的默认值为.,!?
hl.boundaryScanner参数我们不指定值时,按上面的算法计算高亮摘要信息,但solr还提供了一种算法,即breakIterator,我们在请求参数中添加&hl.boundaryScanner=breakIterator时生效,这是solr通过java jdk的BreakIterator来计算分界符的。他相关的参数为,hl.bs.type,这个是主要的参数,决定BreakIterator怎么划分界定符,值有:CHARACTER, WORD, SENTENCE and LINE,SENTENCE 是按句子来划分,即你高亮摘要信息是一个完整的句子,而不会被截断。
希望通过这篇博文,让您更加理解solr 高亮的原理,共同进步。有不对之处,还请指教。
好了,主要solr高亮主要参数都结束完了,有些东西还真不知道怎么描述,语言组织还需有待提高啊。