Spring Data Solr
1.什么是spring data solr?
Solr是一个开源搜索平台,用于构建搜索应用程序。简单的来说就是作为一个搜索引擎使用。
2.solr的安装(本地安装,远程安装同)
1)解压一个tomcat,用于运行solr项目
2)下载一个solr,然后解压
3)把 solr 下的dist目录中solr的war文件部署到tomcat\webapps下,把war的名字改为solr
4)启动tomcat,把war解压
5)把solr下example/lib/ext 目录下的所有的 jar 包复制到 solr 的工程WEB-INF/lib中
6)创建一个 solrhome。把solr 下的/example/solr 目录到D盘改名为solrhome
7)需要修改 solr 工程的 web.xml
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>d:\solrhome</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
8)启动 Tomcat,在浏览器输入http://localhost:8080/solr,看到如下页面说明solr已安装成功
9)选择仓库,进行查询
3.中文分析器IK Analyzer
IK Analyzer 是一个开源的,基于java 语言开发的轻量级的中文分词工具。
IK Analyzer配置:
1)把IKAnalyzer2012FF_u1.jar 添加到 solr 工程的 lib 目录下
2)创建WEB-INF/classes文件夹,把扩展词典mydict.dic、停用词词典ext_stopword.dic、配置文件IKAnalyzer.cfg.xml放到 solr 工程的WEB-INF/classes 目录下。
3)修改 solrhome\collection1\conf\schema.xml 文件,在文件的尾部配置一个 FieldType。
<fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>
4.域
域相当于数据库的表字段。
域的常用属性:
name:指定域的名称 type:指定域的类型 indexed:是否索引,当需要根据此字段查询时为true stored:是否存储,设置存储后才能查询此字段 required:是否必须 multiValued:是否多值
1)字段域
将实体类中要保存到solr索引库的属性进行映射配置,与索引库的字段进行一一对应
<field name="item_id" type="int" indexed="true" stored="true"/>
2)复制域
复制域的作用在于将某一个Field中的数据复制到另一个域中,进行匹配查询
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> <copyField source="item_name" dest="item_keywords"/>
3)动态域
需要动态扩充字段时,要使用动态域
<dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />
5.spring data solr入门
1)创建maven工程,名为springdata-solr,在pom.xml中引入依赖
<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>
2)在src/main/resources下创建spring目录,目录下新建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>
3)创建类User并创建对应的数据库,填充一些信息
package com.entity; public class MyUser { private int id; private String name; private String password; private String phone; private String url; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }
4)配置@Field 注解
如果实体属性与配置文件定义的域名称不一致,需要在注解中指定域名称
//@Field()里面的字段需要和solrhome的schema.xml 中域的name相同 @Fieldprivate int id; @Field("item_name") private String name; @Field("item_password") private String password; @Field("item_phone") private String phone; @Field("item_url") private String url;
5)在solrhome\collection1\conf\schema.xm配置文件中添加字段,添加后重启tomcat服务器
<field name="item_name" type="text_ik" indexed="true" stored="true"/> <field name="item_password" type="string" indexed="true" stored="true"/>
<field name="item_phone" type="string" indexed="false" stored="true" /> <field name="item_url" type="string" indexed="false" stored="true" /> <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> <copyField source="item_name" dest="item_keywords"/> <copyField source="item_password" dest="item_keywords"/> <copyField source="item_phone" dest="item_keywords"/> <copyField source="item_url" dest="item_keywords"/>
6)创建测试类SolrTest
package com.test; 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 java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/applicationContext-solr.xml") public class SolrTest { @Autowired private SolrTemplate solrTemplate; //在此写操作,这些操作只是对solr的仓库的 }
7)添加操作(在测试类中编写,下同)
@Test public void add(){ //把数据添加到solr中 MyUser myUser=new MyUser(); myUser.setId(1); myUser.setName("测试名"); myUser.setPassword("1234"); myUser.setUrl("baidu.com"); solrTemplate.saveBean(myUser); solrTemplate.commit(); }
当执行后,在页面进行查询,会看到数据已经添加到solr仓库中了
8)按主键查询
@Test public void findById(){ //按主键查询 MyUser id = solrTemplate.getById(1, MyUser.class); System.out.println(id);//会把对应id的信息查询出来 }
9)按主键删除
@Test public void deleteById(){ //按主键删除 solrTemplate.deleteById("1"); solrTemplate.commit(); }
10)删除全部
@Test public void deleteAll(){ //删除全部 Query query=new SimpleQuery("*:*"); solrTemplate.delete(query); solrTemplate.commit(); }
11)批量导入数据
//批量导入数据 @Test public void addList(){ List<MyUser> list=new ArrayList<MyUser>(); for (int i = 0; i < 100; i++) { MyUser myUser=new MyUser(); myUser.setId(1+i); myUser.setName("测试名"+i); myUser.setPassword("1234"+i); myUser.setUrl("baidu.com"+i); list.add(myUser); } //saveBeans添加list集合 solrTemplate.saveBeans(list); solrTemplate.commit(); }
12)分页查询
@Test public void findPage(){ //分页查询 Query query=new SimpleQuery("*:*"); //设置起始索引 query.setOffset(10); //设置每页显示的条数 query.setRows(20); ScoredPage<MyUser> pages = solrTemplate.queryForPage(query, MyUser.class); //获取总记录数 System.out.println("总记录数:"+pages.getTotalElements()); //获取总页数 System.out.println("总页数:"+pages.getTotalPages()); //获取分页数据 List<MyUser> list = pages.getContent(); for (MyUser item : list) { System.out.println(item.getName()+" "+item.getUrl()); } }
13)有条件分页查询
@Test public void findPageMutil(){ //有条件分页查询 Query query=new SimpleQuery("*:*"); Criteria criteria=new Criteria("item_keywords"); //contains包含(参数不可拆分),is是相等(参数可拆分) criteria.is("试名"); query.addCriteria(criteria); //设置起始索引 query.setOffset(10); //设置每页显示的条数 query.setRows(20); ScoredPage<MyUser> pages = solrTemplate.queryForPage(query, MyUser.class); //获取总记录数 System.out.println("总记录数:"+pages.getTotalElements()); //获取总页数 System.out.println("总页数:"+pages.getTotalPages()); //获取分页数据 List<MyUser> list = pages.getContent(); for (MyUser item : list) { System.out.println(item.getName()+" "+item.getUrl()); } }