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以名字进行依赖注入了。
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。