Spring Data Solr

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注解
      在这里插入图片描述
2. 案例
  1. 增加和修改

增加和修改使用的是一个方法,当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();
	}
  1. 通过主键查询

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());
	}
  1. 通过主键删除

传入一个主键
注意:删除以后要进行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代码

在这里插入图片描述

spring-data-solr进行分类查询

在这里插入图片描述

spring-data-solr进行过滤查询

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值