实现搜索结果高亮功能solr

**

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

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

	<field name="item_goodsid" type="long" indexed="true" stored="true"/> 
 	<field name="item_title" type="text_ik" indexed="true" stored="true"/> 
 	<field name="item_price" type="double" indexed="true" stored="true"/> 
 	<field name="item_image" type="string" indexed="false" stored="true" /> 
 	<field name="item_category" type="string" indexed="true" stored="true" /> 
 	<field name="item_seller" type="text_ik" indexed="true" stored="true" /> 
 	<field name="item_brand" type="string" indexed="true" stored="true" /> 

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

<field 	name="item_keywords" 	type="text_ik" 	indexed="true" multiValued="true"/> 
<copyField source="item_title" dest="item_keywords"/> 
<copyField source="item_category" dest="item_keywords"/> 
<copyField source="item_seller" dest="item_keywords"/> 
<copyField source="item_brand" dest="item_keywords"/> 

3.动态域

<dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />  

4.配置pom.xml依赖

	<dependency> 
 	    <groupId>org.springframework.data</groupId> 
 	    <artifactId>spring-data-solr</artifactId> 
 	    <version>1.5.5.RELEASE</version> 
 	</dependency>  

5.配置 applicationContext-solr.xml 文件

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
 	xmlns:context="http://www.springframework.org/schema/context" 
 	xmlns:solr="http://www.springframework.org/schema/data/solr" 
 	xsi:schemaLocation="http://www.springframework.org/schema/data/solr  
    	http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd  	 	http://www.springframework.org/schema/beans  
 	 	http://www.springframework.org/schema/beans/spring-beans.xsd 
 	 	http://www.springframework.org/schema/context  
 	 	http://www.springframework.org/schema/context/spring-context.xsd"> 
 	<!-- solr服务器地址 --> 
 	<solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" /> 
 	<!-- solr模板,使用solr模板可对索引库进行CRUD的操作 --> 
 	<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate"> 
 	 	<constructor-arg ref="solrServer" /> 
 	</bean> 
</beans> 

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("<em style='color:red' >"); // 设置高亮域前缀
		highlightOptions.setSimplePostfix("</em>"); // 高亮后缀
		
		query.setHighlightOptions(highlightOptions); //为查询对象设置高亮选项

		// 按照关键字查询
		Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
		query.addCriteria(criteria);
		//根据查询对象返回一个高亮页对象(原生内容)
		HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class);
		
		// 高亮入口集合
		List<HighlightEntry<TbItem>> highlightList = page.getHighlighted();
		
		for (HighlightEntry<TbItem> 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 内容

<!-- 显示HTML内容 -->
		 		<div class="attr" ng-bind-html="item.title | trustHtml">
		 			<em>{{item.title}}</em>
	   	    	</div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值