如何设置SOLR的solr 高亮显示

1789人阅读
lucene(2)
打开SOLR的核心配置文件: solrconfig.xml
找到 standard request handler
写入以下XML配置代码:
[c-sharp]&
其中hl.fl是要高亮显示的字段,比如title,description等。重启,大功告成随便检索一个词,看看是不是结果后面多了一个尾巴?
&&&&& 像这样的:
[c-sharp]&
刚开始这种怪异的表现方式很不合我的胃口,为什么不把高亮标示直接标示到结果中呢? 另类~~~~有时间我会给SOLR动一次小手术,转变成适合我们国人使用的高亮~~~
高亮的配置
参数详细说明:
hl.fl: 用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么就会高亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用hl.requiredFieldMatch选项。hl.requireFieldMatch:&
如果置为true,除非该字段的查询结果不为空才会被高亮。它的默认值是false,意味着它可能匹配某个字段却高亮一个不同的字段。如果hl.fl使用了通配符,那么就要启用该参数。尽管如此,如果你的查询是all字段(可能是使用copy-field 指令),那么还是把它设为false,这样搜索结果能表明哪个字段的查询文本未被找到hl.usePhraseHighlighter:&
如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。hl.highlightMultiTerm&
如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。hl.snippets:&
这是highlighted片段的最大数。默认值为1,也几乎不会修改。如果某个特定的字段的该值被置为0(如f.allText.hl.snippets=0),这就表明该字段被禁用高亮了。你可能在hl.fl=*时会这么用。hl.fragsize:&
每个snippet返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。大字段时不会这么做。hl.mergeContiguous:&
如果被置为true,当snippet重叠时会merge起来。hl.maxAnalyzedChars:&
会搜索高亮的最大字符,默认值为51200,如果你想禁用,设为-1hl.alternateField:&
如果没有生成snippet(没有terms 匹配),那么使用另一个字段值作为返回。hl.maxAlternateFieldLength:&
如果hl.alternateField启用,则有时需要制定alternateField的最大字符长度,默认0是即没有限制。所以合理的值是应该为hl.snippets * hl.fragsize这样返回结果的大小就能保持一致。hl.formatter:一个提供可替换的formatting算法的扩展点。默认值是simple,这是目前仅有的选项。显然这不够用,你可以看看org.apache.solr.highlight.HtmlFormatter.java 和 solrconfig.xml中highlighting元素是如何配置的。&
注意在不论原文中被高亮了什么值的情况下,如预先已存在的em tags,也不会被转义,所以在有时会导致假的高亮。hl.fragmenter:&
这个是solr制定fragment算法的扩展点。gap是默认值。regex是另一种选项,这种选项指明highlight的边界由一个正则表达式确定。这是一种非典型的高级选项。为了知道默认设置和fragmenters (and formatters)是如何配置的,可以看看solrconfig.xml中的highlight段。&
regex 的fragmenter有如下选项:hl.regex.pattern:正则表达式的patternhl.regex.slop:这是hl.fragsize能变化以适应正则表达式的因子。默认值是0.6,意思是如果hl.fragsize=100那么fragment的大小会从40-160.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:106858次
积分:2051
积分:2051
排名:第16397名
原创:100篇
转载:49篇
(24)(1)(2)(5)(16)(2)(5)(11)(8)(37)(1)(14)(3)(19)4177人阅读
本文原创,转载请说明出处:http://ronxin999./blog/static//
solr 高亮显示是根据我们搜索的内容中,根据搜索的关键字,在内容中取一段摘要,类似百度,google搜索结果中出现关键字的一段描述。
首先要solr的高亮功能work,必须在搜索请求的URL里加上参数:hl=on,该参数只是告诉solr我要高亮查询。接下来就是其他的参数,下面主要说明重要的参数:
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-- ){
if( boundaryChars.contains( buffer.charAt( offset - 1 ) ) ) return offset;
// if we scanned up to the start of the text, return it, its a &boundary&
if (offset == 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高亮主要参数都结束完了,有些东西还真不知道怎么描述,语言组织还需有待提高啊。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:241569次
积分:2953
积分:2953
排名:第10250名
原创:43篇
转载:90篇
评论:16条
(2)(5)(17)(2)(3)(1)(2)(4)(3)(3)(3)(3)(2)(1)(1)(3)(2)(2)(1)(2)(1)(1)(1)(1)(3)(1)(2)(2)(5)(3)(6)(9)(2)(9)(3)(2)(1)(1)(1)(1)(5)(2)(1)(1)(1)(1)(3)(2)solr(17)
1. ----------------------------------------------描述
&&& & &我们经常使用搜索引擎,比如在baidu 搜索&spring&,会出现如下结果,结果中与关键字匹配的地方是红色显示与其他内容区别开来。
2.----------------------------------------------solr对高亮的支持
& & & & &solr 默认已经配置了highlight 组件。通常我出只需要这样请求,我还是从solr的管理页面截图吧!
3.----------------------------------------------参数说明
hl.fl: 用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么就会高亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用hl.requiredFieldMatch选项。&hl.requireFieldMatch: 如果置为true,除非用hl.fl指定了该字段,查询结果才会被高亮。它的默认值是false。hl.usePhraseHighlighter: 如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。hl.highlightMultiTerm :如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。hl.fragsize: 返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。
常用的就这几个:参数详细地址http://wiki.apache.org/solr/HighlightingParameters/
4.----------------------------------------------solrj对高亮的支持
Java代码&&
public&class&HighlightTest&{&&
&&&&public&static&void&main(String[]&args)&throws&SolrServerException&{&&
&&&&&&&&ServiceFacetory&facet=&ServiceFacetory.getInstance(&userManager&,&http://192.168.238.133:8080//solr&);&&
&&&&&&&&SolrSupport&s=&facet.getSolrSupport();&&
&&&&&&&&&&
&&&&&&&&HttpSolrServer&service=&s.getHttpSolrServer();&&
&&&&&&&&SolrQuery&query&=&new&SolrQuery();&&
&&&&&&&&query.setQuery(&color:黑色&);&&
&&&&&&&&query.setHighlight(true);&&&&&&&&&&&&&&&&&&
&&&&&&&&query.setHighlightFragsize(10);&&&&&&&&&&&&
&&&&&&&&query.setHighlightRequireFieldMatch(true);&&
&&&&&&&&query.setHighlightSimplePost(&&aa&&);&&&&&&
&&&&&&&&query.setHighlightSimplePre(&&/aa&&);&&&&&&
&&&&&&&&query.setParam(&hl.fl&,&&color&);&&&&&&&&
&&&&&&&&QueryResponse&req&=&service.query(query);&&
&&&&&&&&SolrDocumentList&list=&req.getResults();&&
&&&&&&&&Map&String,&Map&String,&List&String&&&&&map=req.getHighlighting();&&
&&&&&&&&for&(SolrDocument&doc&:&list)&{&&
&&&&&&&&&&&&System.out.println(map.get(doc.getFieldValue(&id&).toString()));&&
&&&&&&&&}&&
5.&----------------------------------------------使用高亮时需要注意的地方
& & & &&1.对于multiValued=true的字段不要设计高亮显示
& & & & 为什么?因为solr对于这个字段里面的多个值只会返回匹配高亮的那个值;如下:
& & & & 从上图中可以看出,remark字段是设计成multiValued=true,而且它里面有多个值,当我们查询“remark=黑色”时,下面的高亮确只返回了当前查询的值;这样如果把这个高亮部分在页面去展示就没有任何意义了!
& &&& &2.高亮时记得你的schema.xml文件中要配主键(&uniqueKey&id&/uniqueKey&)
& & 为什么?
& & 因为solr对高亮的设计是,高亮部分跟结果集部分是分开返回的,如果没有配主键,那么高亮部分返回的结果是这样的,如下图所示,可以看出高亮部分没有带主键,这个时候,你就与上面的结果集匹配不上,那么这样的高亮就没有任何意义,因为不能够确定高亮的是哪条记录。
&3.对于如下应用场景的解决方案
例如:solr里面有多个字段例如:title(标题)、context(内容),我想对这两个字段做检索,但是通过利用如下去实现,
&source=&&title&&&&&dest=&context_title&&&
&source=&&context&&&&dest=&context_title&&&
&,最后通过context_title这个字段做全文检索(玩过solr都知道如上这种配置,context_title字段就必须配置成multiValued=true),这个时候,对这样的字段去高亮就会出现问题
& &解决方案:直接查询title,context让这两列返回高亮,然后在代码里面让这两列进行拼接,问题解决!
6.----------------------------------------------下面是我们为solr高亮设计接口模型,及其实现:
& &因为solr的结果集跟高亮是分开返回的,而且高亮是不会排序的,所以我把我的接口设计成,将高亮部分替换结果集的部分,如下图所示
&例如:在地址栏请求
http://192.168.238.133/:8080/search/highlightPageQuery.htm?src={'core':'userManager',
& & 'pageNo':1,'pageSize':10,
& & &'params':['0color:黑色'],
& & &'columns':['id','color','remarks'],
& & &'highlighFields':['color','remark']
{&data&:[&&
&&&&{&id&:123,&remarks&:&黑色&黄色&蓝色&紫色&&,&color&:&&em&黑色&/em&&黄色&蓝色&紫色&&em&黑色&/em&&黄色&蓝色&紫色&&},&&
&&&&{&id&:212,&remarks&:&黑色&黄色&蓝色&紫色&&,&color&:&蓝色&绿色&白色&&em&黑色&/em&&黄色&蓝色&紫色&}],&&
&&pageNo&:1,&&
&&pageSize&:10,&&
&&totalRecords&:2&&
摘自/blog/2100461
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:88882次
积分:1561
积分:1561
排名:千里之外
原创:59篇
转载:65篇
(2)(3)(1)(5)(1)(5)(18)(6)(4)(5)(3)(1)(1)(2)(14)(34)(6)(8)(3)(1)(2)}

我要回帖

更多关于 solr管理页面设置高亮 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信