**
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>