实现搜索结果高亮功能solr

**

1.solr域的常用属性: (在schem.xml中设置)

**
• name:指定域的名称
• type:指定域的类型
• indexed:是否索引
• stored:是否存储
• required:是否必须
• multiValued:是否多值

	 
 	 
 	 
 	 
 	 
 	 
 	 

2.复制域的作用在于将某一个 Field 中的数据复制到另一个域中

 
 
 
 
 

3.动态域

  

4.配置pom.xml依赖

	 
 	    org.springframework.data 
 	    spring-data-solr 
 	    1.5.5.RELEASE 
 	  

5.配置 applicationContext-solr.xml 文件

 
 
 	 
 	 
 	 
 	 
 	 	 
 	 
 

6.修改使用的实体类的属性,添加@Field注解标识 **如果属性与配置文件定义的域名称不一致,需要在注解中指定域名称。

public class TbItem implements Serializable{ 
 
 	@Field 
    private Long id; 
 
 	@Field("item_title") 
    private String title; 
 	     
    @Field("item_price") 
private BigDecimal price;  
    @Field("item_image") 
    private String image; 
 
    @Field("item_goodsid") 
    private Long goodsId; 
 
    @Field("item_category") 
    private String category; 
 
    @Field("item_brand") 
    private String brand; 
 
    @Field("item_seller") 
private String seller; ....... 
} 

7.在实现搜索服务层实现高亮块添加


@Service(timeout = 5000)
public class ItemSearchServiceImpl implements ItemSearchService {

	@Autowired
	private SolrTemplate solrTemplate;

	/**
	 * 根据输入的数据进行查询
	 */
	@Override
	public Map Search(Map searchMap) {

		Map map = new HashMap<>();
 
		HighlightQuery query = new SimpleHighlightQuery(); // 创建高亮对象
		//设置高亮选项
		HighlightOptions highlightOptions = new HighlightOptions().addField("item_title");//高亮域
		highlightOptions.setSimplePrefix(""); // 设置高亮域前缀
		highlightOptions.setSimplePostfix(""); // 高亮后缀
		
		query.setHighlightOptions(highlightOptions); //为查询对象设置高亮选项

		// 按照关键字查询
		Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
		query.addCriteria(criteria);
		//根据查询对象返回一个高亮页对象(原生内容)
		HighlightPage page = solrTemplate.queryForHighlightPage(query, TbItem.class);
		
		// 高亮入口集合
		List> highlightList = page.getHighlighted();
		
		for (HighlightEntry h : highlightList) {
			TbItem item = h.getEntity();// 获取原实体类
		 //判断是否存在高亮元素
			if (h.getHighlights().size() > 0 && h.getHighlights().get(0).getSnipplets().size() > 0) {
				
				item.setTitle(h.getHighlights().get(0).getSnipplets().get(0));// 设置高亮结果
			}
		}
		map.put("rows", page.getContent());
		return map;
	}

}

8.测试后发现高亮显示的 html 代码原样输出,这是 angularJS 为了防止 html 攻击采取的安全机制。我们如何在页面上显示 html 的结果呢?我们会用到$sce 服务的 trustAsHtml 方法来实现转换。

8.1 修改 base.js


var app = angular.module('pinyougou', []);//定义模块


app.filter("trustHtml",["$sce",function($sce){
	
	return function(data){ //传入参数是被过滤的内容
		
		return $sce.trustAsHtml(data); //返回是过滤后的内容(信任HTML的转换)
	}
}]);


8.2在显示HTML标签处添加ng-bind-html 指令用于显示 html 内容


		 		
{{item.title}}

你可能感兴趣的:(笔记)