Solr 高亮显示

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


搜索引擎:Elasticsearch、Solr、Lucene


 

 

	HighlightQuery query=new SimpleHighlightQuery();//HighlightQuery 是 Query 的子接口	
	//1.HighlightOptions:高亮选项
	//2.高亮域(高亮字段):要在"item_title"这一列上加高亮
	//3.链式编程:可以添加多个高亮域(高亮字段);
	//  比如:new HighlightOptions().addField("高亮域(高亮字段)").addField("高亮域(高亮字段)")	
	HighlightOptions highlightOptions=new HighlightOptions().addField("item_title");
	highlightOptions.setSimplePrefix("<em style='color:red'>");//高亮标签的前缀
	highlightOptions.setSimplePostfix("</em>"); //高亮标签的后缀

	//1.1 搜索关键字查询:searchMap.get("keywords") 获取的是搜索框中的搜索关键字
	//where子句:where item_keywords = 搜索关键字
	Criteria criteria=new Criteria("item_keywords").is(searchMap.get("keywords"));
	query.addCriteria(criteria);

 	//===================== 获取高亮结果集 ===========================
	//1.获取 高亮页对象HighlightPage<T>
	//2.TbItem.class:指的是把查询到的结果数据封装到TbItem类(商品SKU信息tb_item表)中
	HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class);

	
	// 1.高亮集合List<HighlightEntry<TbItem>> 即相当于封装了 页面中所有的每条实体数据。
	// 2.高亮集合List<HighlightEntry<TbItem>>中的 每个元素HighlightEntry<TbItem>对象 相当于 页面中所有的每条实体数据,
	//   而每条实体数据实际封装在 TbItem的JavaBean类中。  
	// 3.每个元素HighlightEntry<TbItem>对象 实际包含了两部分数据:
	//	1.JavaBean实体类 item = entry.getEntity():原生不带高亮标签的JavaBean实体数据
	//	2.List<Highlight> highlightList = entry.getHighlights():
	//		List<Highlight>可带有一个/多个高亮标签的字段(域)的值,
	//		而当前每条“封装在TbItem类中的”实体数据中都仅设置了一个带有高亮标签的"item_title"字段(域),
	//		即当前的List<Highlight>集合中只有一个 带有高亮标签的"item_title"字段(域)的值。
	//4.目的:最终都要把 每个“带有高亮标签的"item_title"字段(域)”的值 赋值到 对应的“原生不带高亮标签的”JavaBean实体数据中
	List<HighlightEntry<TbItem>> entryList = page.getHighlighted();	
	

	//1.遍历出 高亮集合List<HighlightEntry<TbItem>>中的 每个元素HighlightEntry<TbItem>对象
	//  相当于遍历出 页面中 每条“封装在TbItem类中”的实体数据,
	//  而页面中每条“封装在TbItem类中”的实体数据中都设置有一个高亮标签的"item_title"字段(域)
	//2.每个元素HighlightEntry<TbItem>对象 实际包含了两部分数据:
	//	1.JavaBean实体类 item = entry.getEntity():原生不带高亮标签的JavaBean实体数据
	//	2.List<Highlight> highlightList = entry.getHighlights():
	//		List<Highlight>可带有一个/多个高亮标签的字段(域),
	//		而当前每条“封装在TbItem类中的”实体数据中都仅设置了一个带有高亮标签的"item_title"字段(域),
	//		即当前的List<Highlight>集合中只有一个 带有高亮标签的"item_title"字段(域)。
	//3.目的:最终都要把 每个“带有高亮标签的"item_title"字段(域)”的值 赋值到 对应的“原生不带高亮标签的”JavaBean实体数据中
	for(HighlightEntry<TbItem> entry : entryList)
	{
		//List<Highlight>可带有一个/多个高亮标签的字段(域),
		//而当前每条“封装在TbItem类中的”实体数据中都仅设置了一个带有高亮标签的"item_title"字段(域),
		//即当前的List<Highlight>集合中只有一个 带有高亮标签的"item_title"字段(域)。
		List<Highlight> highlightList = entry.getHighlights();

		/*
		//当前的List<Highlight>集合中只有一个 带有高亮标签的"item_title"字段(域) 
		for(Highlight h:highlightList)
		{
			//1.如果高亮域(高字段)是复制域字段的话,那么因为复制域字段是可以映射关联多个域(字段)的,
			//  所以复制域字段是可以存储多值(multiValued=“true”),那么List<String>便即存储有“复制域字段所映射关联的”多个域(字段)的值。
			//2.如果高亮域(高字段)仅是一个单值的字段(域),即非复制域字段的话,那么List<String>便只存储有一个字段(域)的值。
			//3.而当前设置了高亮标签的"item_title"字段(域)并非是复制域字段,而是单值的字段(域),
			//  所以List<String>便只存储有一个"item_title"字段(域)的值。
			List<String> sns = h.getSnipplets(); 
			System.out.println(sns);				
		}
		*/

		//1.highlightList.size():当前的List<Highlight>集合中只有一个带有高亮标签的"item_title"字段(域)的值,所以size值为1
		//2.highlightList.get(0).getSnipplets().size():
		//	当前的List<Highlight>集合中只有一个带有高亮标签的"item_title"字段(域)的值,所以size值为1
		if(highlightList.size() > 0 &&  highlightList.get(0).getSnipplets().size() > 0)
		{
			//每个元素HighlightEntry<TbItem>对象 实际包含了两部分数据:
			//	1.JavaBean实体类 item = entry.getEntity():原生不带高亮标签的JavaBean实体数据
			//	2.List<Highlight> highlightList = entry.getHighlights():
			//		List<Highlight>可带有一个/多个高亮标签的字段(域)的值,
			//		而当前每条“封装在TbItem类中的”实体数据中都仅设置了一个带有高亮标签的"item_title"字段(域),
			//		即当前的List<Highlight>集合中只有一个 带有高亮标签的"item_title"字段(域)的值
			TbItem item = entry.getEntity();

			//1.目的:最终都要把 每个“带有高亮标签的"item_title"字段(域)”的值赋值到对应的“原生不带高亮标签的”JavaBean实体数据中
			//2.highlightList.get(0).getSnipplets().get(0): 
			//		1.//当前的List<Highlight>集合中只有一个 带有高亮标签的"item_title"字段(域)的 
			//		  List<Highlight> highlightList = entry.getHighlights();
			//		  //获取出List<Highlight>集合中第一个 带有高亮标签的"item_title"字段(域) 
			//		  Highlight h = highlightList.get(0)
 			//		2.//当前设置了高亮标签的"item_title"字段(域)并非是复制域字段,而是单值的字段(域),
			//  		  //所以List<String>便只存储有一个"item_title"字段(域)的值。
			//		  List<String> sns = h.getSnipplets(); 
			//		  //获取出List<String>集合中的第一个"item_title"字段(域)的值
			//		  String s = sns.get(0)
			item.setTitle(highlightList.get(0).getSnipplets().get(0));			
		}			
	}
		map.put("rows", page.getContent()); //获取所有的“设置上了高亮标签的”实体数据
		return map;

 

1.问题:之所以没有对高亮标签进行加载,而是直接字符串直接输出在页面中的原因:是因为Angular为了防止html攻击,所以只会把html代码当做字符串显示
2.解决:
	1.第一步:$sce服务 为 Angular的信任策略,其中有一个方法trustAsHtml,用于把字符串的html代码转换为可以在页面中渲染并加载html代码。
	2.第二步:把$sce服务定义为一个过滤器,实现该“把字符串的html代码转换为可以在页面中渲染并加载html代码”的功能。
		  $sce作用之一:便可以把带有高亮标签的字符串的html代码 转换为 可以在页面中渲染并加载在页面中显示高亮的html代码。
	  	  代码如下:
			// 定义模块:
			var app = angular.module("pinyougou",[]);
			/*把$sce服务定义为过滤器:
				字符串形式的'$sce':表示以名字进行依赖注入,因为JS是弱类型语言,所以需要定义一个字符串以名字进行依赖注入
			*/
			app.filter('trustHtml',['$sce',function($sce)
			{
				//1.function(data):传入的data为没有被Angular信任的字符串形式的html代码
				//2.把带有高亮标签的字符串的html代码传入并让Angular信任 
    				return function(data)
				{
					//返回值:通过了Angular信任的字符串形式的html代码,那么该字符串形式的html代码便可以在页面中渲染并加载显示
					//此处返回的即是通过了Angular信任的带有高亮标签的字符串的html代码,那么便可以在页面中渲染并高亮显示
        				return $sce.trustAsHtml(data);
    				}
			}]);

	3.第三步:使用过滤器“ng-bind-html指令”用于显示html内容。竖线“|”:表示调用“过滤器”。
	  	  代码如下:<div class="attr" ng-bind-html="item.title | trustHtml"></div>

1.通过JS压缩和JS加密两个步骤之后:发生了两种变化
	1.JS压缩:所有空格消失
	2.JS加密:function(形参名)中的“形参名”改了名字,
		  那么便无法知道改变后的“形参名”对应的是原来定义的哪个变量。
2.此处的function($http)经过JS加密后,变成了function(a)

1.写法一(推荐):app.service('xxService',['$http','$sce',function($http,$sce){}]);
  JS加密后:app.service('xxService',['$http','$sce',function($a,$b){}]);
  写法一的优点:当通过JS加密后,即使function函数中的“形参名”改变了之后,
		仍然可以通过字符串的'$http'和'$sce'以名字进行依赖注入,并按形参列表中的顺序对形参进行赋值;
		又因为JS是弱类型的,所以无法以类型进行依赖注入。 

2.写法二:app.service('xxService',function($http,$sce){});
  JS加密后:app.service('xxService',function($a,$b{});
  写法二的缺点:本身是可以根据形参列表中的$http和$sce以名字进行依赖注入的,
		但当通过JS加密后,function函数中的“形参名”改变了之后,
		便无法根据形参列表中的$http和$sce以名字进行依赖注入了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

あずにゃん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值