文章目录
Spring Data Solr
Spring Data Solr简介
Spring Data Solr就是为了方便Solr的开发所研制的一个框架,其底层是对SolrJ(官方API)的封装
Spring Data Solr入门案例
1.环境搭建(思路)
- 引入依赖
- spring-data-solr
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>1.5.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
</dependencies>
- 创建applicationContext-solr.xml
- 配置solr服务器地址
- 配置solrTemplate
<?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>
- 在实体类的属性上配置与solr域的映射
- 使用@Field注解
- 使用@Field注解
2. 案例
- 增加和修改
增加和修改使用的是一个方法,当id在solr里面不存在,添加,当id存在,修改
package cn.itcast.test;
import java.math.BigDecimal;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import cn.itcast.pojo.TbItem;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-solr.xml")
public class testDemo1 {
@Autowired
private SolrTemplate solrTemplate;
/**
* 增加和修改
*/
@Test
public void add(){
TbItem tbItem = new TbItem();
tbItem.setId(1L);
tbItem.setTitle("华为MATE10");
tbItem.setCategory("手机");
tbItem.setBrand("华为");
tbItem.setSeller("华为旗舰店");
tbItem.setGoodsId(10L);
tbItem.setPrice(new BigDecimal(3000.01));
solrTemplate.saveBean(tbItem);
solrTemplate.commit();
}
- 通过主键查询
TbItem item = solrTemplate.getById(“1”,TbItem.class);
参数一:要查询数据的主键
参数二:返回对象的class
/**
* 通过主键查询
*/
@Test
public void findById(){
//传入要查询的主键ID,以及返回对象的class
TbItem item = solrTemplate.getById("1",TbItem.class);
System.out.println(item.getTitle());
}
- 通过主键删除
传入一个主键
注意:删除以后要进行commit()
/**
* 通过主键删除
*/
@Test
public void deleById(){
solrTemplate.deleteById("1");
solrTemplate.commit();
}
- 批量插入数据
solrTemplate.saveBeans(list);方法,传入一个list集合
/**
* 批量插入数据
*/
@Test
public void addList(){
List list = new ArrayList();
for(int i = 0;i < 100;i++){
TbItem tbItem = new TbItem();
tbItem.setId(i+1L);
tbItem.setTitle("华为MATE"+i);
tbItem.setCategory("手机");
tbItem.setBrand("华为"+i);
tbItem.setSeller("华为旗舰店");
tbItem.setGoodsId(10L);
tbItem.setPrice(new BigDecimal(3000.01));
list.add(tbItem);
}
solrTemplate.saveBeans(list);
solrTemplate.commit();
}
- 分页查询
/**
* 分页查询
*/
@Test
public void findByPage(){
//*:*:代表查询任意列的任意值
Query query=new SimpleQuery("*:*");
//设置分页的开始索引
query.setOffset(10);
//设置每页查询的数据数
query.setRows(20);
/**
* 分页查询需要两个参数
* 参数一:查询条件
* 参数二:返回对象的class
*/
ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
//获得查询到的数据
List<TbItem> list = page.getContent();
for (TbItem tbItem : list) {
System.out.println("title"+tbItem.getTitle());
}
System.out.println("总记录数"+page.getTotalElements());
System.out.println("总页数"+page.getTotalPages());
}
- 条件查询
/**
* 条件查询
*/
@Test
public void findByMutil(){
//*:*:代表查询任意列的任意值
Query query=new SimpleQuery("*:*");
//创建一个Criteria,在构造方法里设置要查询的字段名称,后面设置条件:contains(表示包含)
Criteria criteria=new Criteria("item_category").contains("手机");
//设置多个条件:必须用criteria=criteria.and(字段名称).条件
criteria=criteria.and("item_brand").contains("2");
query.addCriteria(criteria);
/**
* 分页查询需要两个参数
* 参数一:查询条件
* 参数二:返回对象的class
*/
ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
//获得查询到的数据
List<TbItem> list = page.getContent();
for (TbItem tbItem : list) {
System.out.println("title"+tbItem.getTitle());
}
System.out.println("总记录数"+page.getTotalElements());
System.out.println("总页数"+page.getTotalPages());
}
- 删除所有数据
/**
* 删除所有数据
*/
@Test
public void deleAll(){
//设置删除条件
Query query=new SimpleQuery("*:*");
//执行删除
solrTemplate.delete(query);
//提交删除
solrTemplate.commit();
}
SpringDataSolr域的与字段对应的配置
- 普通域存储
在实体类上添加注解
- 动态域存储
spring-data-solr搜索数据并将关键字高亮显示
-
示例
-
后端代码编写
@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);
for(HighlightEntry<TbItem> h: page.getHighlighted()){//循环高亮入口集合
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));//设置高亮的结果
System.out.println(h.getHighlights().get(0).getSnipplets().get(0));
}
}
//将查询结果存储到Map集合并返回
map.put("rows", page.getContent());
return map;
}
- 这时我们在前端取数据时会发现取出数据里面的HTML代码并没有被解析,而是原样进行了输出
这是因为AngularJS的安全策略,angularJS为了防止html攻击采取的安全机制。这时我们需要使用$sce服务的trustAsHtml方法将该数据转成信任的html代码