高亮显示咋搜索中使用的比较多,比较常用的有三种使用方式,如果要对某filed做高亮显示,必须对该field设置stored=true.

  第一种是普通的高亮显示Highlighter,根据查询的docIdSet,获取Documents,并获取当前document的需要高亮的field的value,根据query的term和field的value做匹配算法。

  第二种快速高亮显示FastVectorHighligher,效率比普通的高亮显示要高,需要定义termvector(占用空间和IO),包括position和offset,根据query term的termvector到field value 中做快速的定位标记,进而实现快速的高亮显示。

  第三种在solr外部做高亮显示,由于高亮显示需要对field设置为store=true,所以对于单点数据量比较大并且该字段比较大的话,会消耗大量的IO操作,那么可以把该字段存储在另外的地方,比如Hbase,在外部做高亮显示匹配。

示例:

solr 高亮显示 java solr 高亮显示 多列_字段

  参数说明:

    hl.fl:用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该字段未被给出,那么就不  会高亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可以使用*号高亮显示所有字段。如果你使用了通配符,那么要考虑启用 hl.requiredFieldMatch选项。

    hl.requireFieldMatch:如果设置为true,除非用hl.fl指定了该字段,查询结果才会被高亮。他的默认值是false

    hl.usePhraseHighlighter:如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。

    hl.highligheMultiTerm:如果使用通配符和模糊搜索,那么与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighter腰围true。

    hl.fragsize:返回的最大字符数。默认是100,如果为0,那么该字段不会被fragmented且整个字段的值会被返回。

              常用的就这几个:参数详细地址http://wiki.apache.org/solr/HighlightingParameters/

  代码:

  

SolrQuery query = new SolrQuery();
  query.setQuery(queryString);
  query.setHighlight(true);//开启高亮功能
  query.addHighlightField("title");//高亮字段
  query.setHighlightSimplePre("<font color='red'>");//渲染标签
  query.setHighlightSimplePost("</font>");//渲染标签 
  query.setStart((pageNum-1)*pageSize);
  query.setRows(pageSize);
  QueryResponse response = null;
  try {
          response = server.query(query);
  } catch (Exception e) {
          e.printStackTrace();
          return null;
  }  SolrDocumentList lists = response.getResults();//查询结果集
  List<ProductBO> items = new ArrayList<ProductBO>();//对象结果集
  String tmpId = "";
  Map<String,Map<String,List<String>>>highlightMap=response.getHighlighting();
    for (SolrDocument solrDocument : lists) {
               ProductBO at = new ProductBO();
               tmpId = solrDocument.getFieldValue("id").toString();
               at.setId(tmpId);
               at.setTitle(solrDocument.getFieldValue("title").toString());
               List<String> titleList = highlightMap.get(tmpId).get("title");
               if(titleList != null && titleList.size() > 0){
                         at.setTitle(titleList.get(0));//获取并设置高亮的字段title
                }else{
                       at.setTitle(solrDocument.getFieldValue("title").toString());
              }
              System.out.println(at.getSubMajor_s() + " | " + at.getTitle());
  }