Spring Data Solr
Spring Data Solr 介绍
虽然支持任何编程语言的能力具有很大的市场价值,你可能感兴趣的问题是:我如何将Solr的应用集成到Spring中?可以,Spring Data Solr就是为了方便Solr的开发所研制的一个框架,其底层是对SolrJ(官方API)的封装。
Spring Data Solr 入门demo
1、引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>demo</groupId>
<artifactId>springdatasolr</artifactId>
<version>1.0-SNAPSHOT</version>
<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>
</project>
2、编写配置文件(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服务器地址,其实这里是配置HttpSolr的bean,只是框架对其进行了封装-->
<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>
3、编写实体类,并使用注解配置对应的业务域,只需要配置存在的业务域,如果属性名和业务域名相同,可以省略名称
@Field
private Long id;
@Field("item_title")
private String title;
private String sellPoint;
@Field("item_price")
private BigDecimal price;
private Integer stockCount;
private Integer num;
private String barcode;
@Field("item_image")
private String image;
private Long categoryid;
private String status;
private Date createTime;
private Date updateTime;
private String itemSn;
private BigDecimal costPirce;
private BigDecimal marketPrice;
private String isDefault;
@Field("item_goodsid")
private Long goodsId;
private String sellerId;
private String cartThumbnail;
@Field("item_category")
private String category;
@Field("item_brand")
private String brand;
private String spec;
@Field("item_seller")
private String seller;
4、操作Solr索引库相关代码
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.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.Query;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.core.query.result.ScoredPage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import pojo.TbItem;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 测试
* Author xushuai
* Description
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-solr.xml")
public class TestTmplate {
@Autowired
private SolrTemplate solrTemplate;
/**
* 增加、修改索引
* 在solr中操作存在ID的数据时,即为修改。ID不存在,即为增加
*/
@Test
public void testSaveAndUpdate() {
TbItem item = new TbItem();
item.setId(1L);
item.setTitle("小米 Note");
item.setCategory("手机");
item.setBrand("小米");
item.setPrice(new BigDecimal("1599"));
item.setImage("http://192.168.25.133/group1/M00/00/00/wKgZhVtKCTuABB_0AADHZlg52Gw369.jpg");
item.setGoodsId(149187842867981L);
item.setSeller("xiaomi");
// 保存对象到索引库
solrTemplate.saveBean(item);
// 注意提交
solrTemplate.commit();
}
/**
* 批量插入
*/
@Test
public void testAddList() {
List<TbItem> list = new ArrayList<TbItem>();
for (int i = 0; i < 100; i++) {
TbItem item = new TbItem();
item.setId(1L + i);
item.setTitle("小米 Note" + i);
item.setCategory("手机");
item.setBrand("小米");
item.setPrice(new BigDecimal("1599"));
item.setImage("http://192.168.25.133/group1/M00/00/00/wKgZhVtKCTuABB_0AADHZlg52Gw369.jpg");
item.setGoodsId(149187842867981L);
item.setSeller("xiaomi");
list.add(item);
}
// 保存对象到索引库
solrTemplate.saveBeans(list);
// 注意提交
solrTemplate.commit();
}
/**
* 按ID查询索引
*/
@Test
public void testGetById() {
// 获取指定ID的索引(ID为索引库中的ID,在这里特指item对象的id)
TbItem item = solrTemplate.getById(1L, TbItem.class);
System.out.println(item);
}
/**
* 删除指定ID的索引
*/
@Test
public void testDeleteById() {
// 删除指定ID的索引
solrTemplate.deleteById("1");
}
/**
* 删除全部索引
*/
@Test
public void testDeleteAll() {
Query query = new SimpleQuery("*:*");
solrTemplate.delete(query);
solrTemplate.commit();
}
/**
* 分页查询
*/
@Test
public void testFindByPage() {
// 创建查询条件对象,参数为 查询条件表达式
Query query = new SimpleQuery("*:*");
/*
* 设置分页参数
* setOffset(Integer):从第几条记录开始,默认为0
* setRows(Integer):显示记录数,默认为10
*/
query.setOffset(10);
query.setRows(10);
// 执行查询
ScoredPage<TbItem> info = solrTemplate.queryForPage(query, TbItem.class);
// 从查询结果中,获取相关信息
// 获取总页数
int totalPages = info.getTotalPages();
System.out.println("总页数:" + totalPages);
// 获取总记录
long totalElements = info.getTotalElements();
System.out.println("总记录数:" + totalElements);
List<TbItem> content = info.getContent();// 获取数据集
// 打印输出list
showList(content);
}
/**
* 复杂条件查询
* 使用Criteria,构造并设置查询条件,然后将其赋值给查询对象
*/
@Test
public void testFindByCriteria() {
// 创建查询对象,参数为 查询条件表达式
Query query = new SimpleQuery("*:*");
// 创建查询条件对象,使用业务域构造
Criteria criteria = new Criteria("item_title");
criteria.contains("1");
query.addCriteria(criteria);
// 执行查询,注意:如果不指定分页参数:默认从第一页开始,每页显示10条记录
ScoredPage<TbItem> info = solrTemplate.queryForPage(query, TbItem.class);
// 从查询结果中,获取相关信息
// 获取总页数
int totalPages = info.getTotalPages();
System.out.println("总页数:" + totalPages);
// 获取总记录
long totalElements = info.getTotalElements();
System.out.println("总记录数:" + totalElements);
List<TbItem> content = info.getContent();// 获取数据集
// 打印输出list
showList(content);
}
/**
* 打印输出list集合中的数据
*
* @param list 数据集
*/
private void showList(List<TbItem> list) {
for (TbItem item : list) {
System.out.println(item.getTitle());
}
}
}