搜索中两种高亮显示方式


以下提供常见两种方式处理搜索时高亮显示。目前鉴于商麦系统中大量字段没有保存。solr返回ID。所以建议采用第一种方式处理。

处理方式为通过velocity模板工具注入工具类,提供静态方法。进行解析。达到高亮显示。

注意:高亮显示的分词器最好喝solr分词器一致


1、搜索词之后进行高亮显示。使用lucene处理高亮显示词

/**

* 用户分词高亮
* 在content中查找keyword的字符串,若发现则加上高亮显示的标签。
* @param content 源内容。
* @param keyword 搜索关键字。
* @return 经过对关键字高亮显示的结果。
*/
    public static String highLightHtmlForSearch(String content, String keyword ){
    //检查参数。
if(StringUtils.isEmpty(content) || StringUtils.isEmpty(keyword))
return(content);
try {
long start = System.currentTimeMillis();
keyword = escapeSpecChar(keyword);
content = escapeSpecChar(content);
Query query = new QueryParser(Version.LUCENE_34, "fullText", new IKAnalyzer()).parse(keyword);
QueryScorer scorer = new QueryScorer(query);
Fragmenter fragment = new SimpleSpanFragmenter(scorer, HIGHLIGHT_SIZE);
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<em>", "</em>");
Highlighter highlighter = new Highlighter(formatter,scorer);
highlighter.setTextFragmenter(fragment);
highlighter.setMaxDocCharsToAnalyze(HIGHLIGHT_SIZE);
String str = highlighter.getBestFragment(new IKAnalyzer(), "fullText", content);//IKanalyzer分词器

if(!StringUtils.isBlank(str)){//如果存在关键字片段则处理
removeEmInHref(content);
content = HtmlUtils.htmlUnescape(removeEmInHref(str));
}
long time = System.currentTimeMillis()-start;
System.out.println(time);
if(content.contains("\\"))
content = content.replaceAll("\\\\", "");
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidTokenOffsetsException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
    }


/**

* @Title: removeEmInHref 
* @Description:去掉href里面em
* @param @param content
* @param @return 设定文件 
* @return String 返回类型 
* @throws 
* @date 2012-11-30 下午08:26:53
*/
public static String  removeEmInHref(String content){
   String returnstr ="";
   if(StringUtils.isBlank(content)){
    return content;
   }
Document doc = Jsoup.parseBodyFragment(content);
Elements links=doc.getElementsByTag("a");
if(null!=links&&links.size()>0){
  for (Element link : links) {
 String linkHref = link.attr("href");
 if(!StringUtils.isEmpty(linkHref)){
 String ss =linkHref.replace("<em>", "").replace("</em>", "");
 link.attr("href", ss);
 }
}
  returnstr = doc.getElementsByTag("body").toString().replace("<body>", "").replace("</body>", "");
}else{
returnstr = content;
}
return returnstr.replaceAll("\n", "");

}


2、solrconfig.xml配置。一下配置是solrconfig.xml自带的。如果有的话就不用配置

(1)、solr文件configSolr配置

      <!-- Configure the standard formatter -->
      <formatter name="html" 
                 default="true"
                 class="solr.highlight.HtmlFormatter">
        <lst name="defaults">
          <str name="hl.simple.pre"><![CDATA[<em>]]></str>
          <str name="hl.simple.post"><![CDATA[</em>]]></str>
        </lst>
      </formatter>

solr效果图如下



(2)。客户端解析solr高亮显示

private final static String URL = "http://localhost:5080/solr";
private CommonsHttpSolrServer server = null;

@Before
public void init() {
try {
server = new CommonsHttpSolrServer(URL);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}

@Test
public void testLight() {
try {
//查询对象
SolrQuery query = new SolrQuery("name:apache solr");
//设置启用高亮,如果返回文本较长可加大setHighlightSnippets变量值比如设置为100.
query.setHighlight(true).setHighlightSnippets(100);
//设置合并
query.setParam("hl.mergeContiguous", true);
//设置高亮字段
query.setParam("hl.fl", "name,title");


QueryResponse res = server.query(query); 


//获取高亮集合
Map<String,Map<String,List<String>>> hl = res.getHighlighting();
SolrDocumentList list = res.getResults(); 


System.out.println("高亮结果集:"+hl);
//循环匹配高亮集合
for(SolrDocument sd : list){
List<String> list_t = hl.get(sd.getFieldValue("id")).get("name");
if(list_t != null){
String temp = list_t.get(0);
  System.out.println("高亮返回为:"  + temp);

}
} catch (SolrServerException e) {
e.printStackTrace();
}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值