高亮显示咋搜索中使用的比较多,比较常用的有三种使用方式,如果要对某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,在外部做高亮显示匹配。
示例:
参数说明:
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());
}