欢迎投稿

今日深度:

Solr 高亮显示,

Solr 高亮显示,


搜索引擎:Elasticsearch、Solr、Lucene

  • ELK中的ES:Elasticsearch
  • SolrCloud 的搭建、使用
  • Solr 高亮显示
  • Spring Data Solr 使用
  • Solr的安装与配置
  • Solr 原理、API 使用
  • Lucene 原理、API使用
  • 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以名字进行依赖注入了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

www.htsjk.Com true http://www.htsjk.com/solr/38768.html NewsArticle Solr 高亮显示, 搜索引擎:Elasticsearch、Solr、Lucene ELK中的ES:Elasticsearch SolrCloud 的搭建、使用 Solr 高亮显示 Spring Data Solr 使用 Solr的安装与配置 Solr 原理、API 使用 Lucene 原理、API使用 L...
相关文章
    暂无相关文章
评论暂时关闭