Spring Data Solr 就是为了方便 solr 的开发研制的一个框架,其底层是对 SolrJ(官方 API)的封装
一、环境搭建
第一步:创建 Maven 项目(springdatasolrDemo 打包方式为 jar 类型)
第二步:pom.xml 文件中引入项目相关的依赖:
1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.data</groupId> 4 <artifactId>spring-data-solr</artifactId> 5 <version>1.5.5.RELEASE</version> 6 </dependency> 7 <dependency> 8 <groupId>org.springframework</groupId> 9 <artifactId>spring-test</artifactId> 10 <version>4.2.4.RELEASE</version> 11 </dependency> 12 <dependency> 13 <groupId>junit</groupId> 14 <artifactId>junit</artifactId> 15 <version>4.9</version> 16 </dependency> 17 </dependencies>
第三步:在 src/main/resources 目录下添加 applicationContext-solr.xml 配置文件,配置 Solr 服务器的地址。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:solr="http://www.springframework.org/schema/data/solr" 6 xsi:schemaLocation="http://www.springframework.org/schema/data/solr 7 http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd 8 http://www.springframework.org/schema/beans 9 http://www.springframework.org/schema/beans/spring-beans.xsd 10 http://www.springframework.org/schema/context 11 http://www.springframework.org/schema/context/spring-context.xsd"> 12 13 <!-- solr服务器地址 --> 14 <solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" /> 15 16 17 <!-- solr模板,使用solr模板可对索引库进行CRUD的操作 --> 18 <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate"> 19 <constructor-arg ref="solrServer" /> 20 </bean> 21 </beans>
第四步:构建与 Solr 中配置的 Field 对应的实体类字段(@Filed 注解:如果属性与配置文件定义的域名名称不一致,需要在注解中指定域名的名称),简单举两种例子:
1 @Field 2 private Long id; 3 4 @Field("item_title") 5 private String title; 6 7 //动态域设置方式 8 @Dynamic 9 @Field("item_spec_*") 10 private Map<String, String> specMap;
二、Solr 数据添加与修改
创建测试类:solrTemplate.saveBean(item) 及 solrTemplate.commit() 方法进行数据的增加和修改(只要主键 id 相同 Solr 会自动进行修改,不会添加相同的主键内容,这一点与数据库相同)
1 package springdatasolrDemo; 2 3 import java.math.BigDecimal; 4 5 import org.junit.Test; 6 import org.junit.runner.RunWith; 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.data.solr.core.SolrTemplate; 9 import org.springframework.test.context.ContextConfiguration; 10 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11 12 import com.itcast.demo.TbItem; 13 14 @RunWith(SpringJUnit4ClassRunner.class) 15 @ContextConfiguration(locations="classpath:applicationContext-solr.xml") 16 public class SolrTest { 17 18 @Autowired 19 private SolrTemplate solrTemplate; 20 21 @Test 22 public void add() { 23 TbItem item=new TbItem(); 24 item.setId(1L); 25 item.setBrand("华为"); 26 item.setCategory("手机"); 27 item.setGoodsId(1L); 28 item.setSeller("华为2号专卖店"); 29 item.setTitle("华为Mate9"); 30 item.setPrice(new BigDecimal(2000)); 31 //直接传入我们创建的带有@Field 的实体类 32 solrTemplate.saveBean(item); 33 //Solr 是支持事务的 因此需要条用 commit 进行提交 34 solrTemplate.commit(); 35 } 36 }
效果图展示:
三、根据主键进行查询和删除
1 //根据主键进行查询和删除 2 @Test 3 public void findById() { 4 //传入 ID 和 返回值类型 5 TbItem item = solrTemplate.getById("1", TbItem.class); 6 //输出结果:华为Mate9 7 System.out.println(item.getTitle()); 8 } 9 10 @Test 11 public void deleteById() { 12 //会自动转化为 Long 类型 13 solrTemplate.deleteById("1"); 14 solrTemplate.commit(); 15 }
四、分页查询
Solr 页面上就可以进行分页查询:start(起点),rows(每页记录数),程序中只需要调用 solrTemplate.queryForPage(query, TbItem.class) 将 start 与 rows 封装仅 query 对象的 offset 与 rows 属性中即可
1 @Test 2 public void findByPage() { 3 //创建查询对象(属性:条件) 4 Query query = new SimpleQuery("*:*"); 5 //开始值 与 每页记录数 6 query.setOffset(20); 7 query.setRows(20); 8 //调用 Solr 服务器进行查询 9 ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class); 10 System.out.println("总记录数:"+page.getTotalElements()); 11 List<TbItem> list = page.getContent(); 12 showList(list); 13 } 14 //显示记录数据 15 private void showList(List<TbItem> list){ 16 for(TbItem item:list){ 17 System.out.println(item.getTitle() +item.getPrice()); 18 } 19 }
五、条件查询
Criteria 用于对条件的封装
1 @Test 2 public void testPageQueryMutil(){ 3 Query query=new SimpleQuery("*:*"); 4 Criteria criteria=new Criteria("item_title").contains("2"); 5 criteria=criteria.and("item_title").contains("5"); 6 query.addCriteria(criteria); 7 //query.setOffset(20);//开始索引(默认0) 8 //query.setRows(20);//每页记录数(默认10) 9 ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class); 10 System.out.println("总记录数:"+page.getTotalElements()); 11 List<TbItem> list = page.getContent(); 12 showList(list); 13 }
六、删除全部记录
1 @Test 2 public void testDeleteAll(){ 3 Query query=new SimpleQuery("*:*"); 4 solrTemplate.delete(query); 5 solrTemplate.commit(); 6 }