分享

solr4.8 高亮查询和配置


问题导读:
1.solr如何实现高亮?
2.solr高亮参数该如何配置?
3.solr使用高亮时需要注意的地方?







1.描述
我们经常使用搜索引擎,比如在baidu 搜索 spring ,会出现如下结果,结果中与关键字匹配的地方是红色显示与其他内容区别开来。

1.png

2.solr对高亮的支持
solr 默认已经配置了highlight 组件。通常我出只需要这样请求,我还是从solr的管理页面截图吧!

2.png


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.solr对高亮的支持
  1. public class HighlightTest {  
  2.     public static void main(String[] args) throws SolrServerException {  
  3.         ServiceFacetory facet= ServiceFacetory.getInstance("userManager","http://192.168.238.133:8080//solr");  
  4.         SolrSupport s= facet.getSolrSupport();  
  5.         //这里就是得到HttpSolrServer,你也可以自己封装  
  6.         HttpSolrServer service= s.getHttpSolrServer();  
  7.         SolrQuery query = new SolrQuery();  
  8.         query.setQuery("color:黑色");  
  9.         query.setHighlight(true);                //开启高亮  
  10.         query.setHighlightFragsize(10);          //返回的字符个数  
  11.         query.setHighlightRequireFieldMatch(true);  
  12.         query.setHighlightSimplePost("<aa>");    //前缀  
  13.         query.setHighlightSimplePre("</aa>");    //后缀  
  14.         query.setParam("hl.fl", "color");      //高亮字段  
  15.         QueryResponse req = service.query(query);  
  16.         SolrDocumentList list= req.getResults();  
  17.         Map<String, Map<String, List<String>>>  map=req.getHighlighting();  
  18.         for (SolrDocument doc : list) {  
  19.             System.out.println(map.get(doc.getFieldValue("id").toString()));  
  20.         }  
  21.     }  
  22.       
  23.       
  24. }  
复制代码







5. 使用高亮时需要注意的地方


        1.对于multiValued=true的字段不要设计高亮显示
        为什么?因为solr对于这个字段里面的多个值只会返回匹配高亮的那个值;如下:
19c25fae-4902-3fff-8cc1-baebebdce296.png
        从上图中可以看出,remark字段是设计成multiValued=true,而且它里面有多个值,当我们查询“remark=黑色”时,下面的高亮确只返回了当前查询的值;这样如果把这个高亮部分在页面去展示就没有任何意义了!

       2.高亮时记得你的schema.xml文件中要配主键(<uniqueKey>id</uniqueKey>)
    为什么?
    因为solr对高亮的设计是,高亮部分跟结果集部分是分开返回的,如果没有配主键,那么高亮部分返回的结果是这样的,如下图所示,可以看出高亮部分没有带主键,这个时候,你就与上面的结果集匹配不上,那么这样的高亮就没有任何意义,因为不能够确定高亮的是哪条记录。

4.png

3.对于如下应用场景的解决方案
例如:solr里面有多个字段例如:title(标题)、context(内容),我想对这两个字段做检索,但是通过利用如下去实现,
  1. <copyField source=" title "   dest="context_title"/>  
  2. <copyField source=" context"   dest="context_title"/>  
复制代码






,最后通过context_title这个字段做全文检索(玩过solr都知道如上这种配置,context_title字段就必须配置成multiValued=true),这个时候,对这样的字段去高亮就会出现问题
   解决方案:直接查询title,context让这两列返回高亮,然后在代码里面让这两列进行拼接,问题解决!

6.下面是我们为solr高亮设计接口模型,及其实现:
   因为solr的结果集跟高亮是分开返回的,而且高亮是不会排序的,所以我把我的接口设计成,将高亮部分替换结果集的部分,如下图所示

5.png
例如:在地址栏请求
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']
}

那么返回
  1. {"data":[  
  2.     {"id":123,"remarks":"黑色 黄色 蓝色 紫色 ","color":"<em>黑色</em> 黄色 蓝色 紫色 <em>黑色</em> 黄色 蓝色 紫色 "},  
  3.     {"id":212,"remarks":"黑色 黄色 蓝色 紫色 ","color":"蓝色 绿色 白色 <em>黑色</em> 黄色 蓝色 紫色"}],  
  4. "pageNo":1,  
  5. "pageSize":10,  
  6. "totalRecords":2  
  7. }  
复制代码






出处:http://eksliang.iteye.com/blog/2100461

已有(2)人评论

跳转到指定楼层
ljlinux2012 发表于 2017-3-2 00:11:52
ddddddddddddd
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条