使用代码实现Solr数据操作
一、前言
Solr的操作方式主要有三种:
1、使用Solrj进行操作,适合JavaSE程序开发。
2、使用spring-data-solr进行操作,适合SSM程序开发。
3、使用springboot插件spring-boot-starter-data-solr进行操作,适合springboot程序开发。
二、使用Solrj开发代码
1、引入Maven支持
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>8.2.0</version> </dependency>
2、编写对Solr进行增删改查的代码。示例如下:
import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import java.io.IOException; /** * Created by David on 2019/9/6. */ public class TestSolr { private static final String solrUrl = "http://localhost:8983/solr/articles"; //添加信息&修改信息 public void addSolr() throws SolrServerException, IOException { HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl) .withConnectionTimeout(10000) .withSocketTimeout(60000) .build(); SolrInputDocument document = new SolrInputDocument(); // 注意:id的域不能少 document.addField("id", "10"); document.addField("title", "基于java的面向对象编程"); solrClient.add(document); solrClient.commit(); } //删除信息 public void delSolr() throws IOException, SolrServerException { HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl) .withConnectionTimeout(10000) .withSocketTimeout(60000) .build(); solrClient.deleteById("10");//删除 solrClient.commit();//提交 } //查询信息 public void searchSolr() throws IOException, SolrServerException { HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl) .withConnectionTimeout(10000) .withSocketTimeout(60000) .build(); SolrQuery query = new SolrQuery(); query.set("q", "name:编程"); // 调用server的查询方法,查询索引库 QueryResponse response = solrClient.query(query); // 查询结果 SolrDocumentList results = response.getResults(); // 查询结果总数 long cnt = results.getNumFound(); System.out.println("查询结果总数:" + cnt); for (SolrDocument solrDocument : results) { System.out.println(solrDocument.get("id")); System.out.println(solrDocument.get("title")); } } }
三、使用spring-data-solr开发代码
1、引入Maven支持,不同版本的spring-data-solr操作代码不一致,此文用最新的4.0版本。
注意:spring-data-solr-4.0版本对应的spring版本为5.1.9,springMVC的版本要与之相同,否则会报错误。
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-solr</artifactId> <version>4.0.10.RELEASE</version> </dependency>
2、编写POJO,其中@Id为主键标识,@Indexed为Solr中Field填充项标识。早期的spring-data-solrs和solrj使用的注解为:@Field
@SolrDocument(solrCoreName = "articles") public class Articles implements Serializable { @Id @Indexed private int id; @Indexed private String title; private String content; @Indexed private Date createDate; }
3、编写spring配置文件spring-solr.xml,注意地址只引用到http://localhost:8983/solr,因为项目中可能需要多个Collection。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- solr服务器地址 --> <bean id="solrClientFactory" class="org.springframework.data.solr.server.support.HttpSolrClientFactoryBean"> <property name="url" value="http://localhost:8983/solr"/> <property name="timeout" value="5000"/> <property name="maxConnections" value="100"/> </bean> <!-- solr模板 --> <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate"> <constructor-arg index="0" ref="solrClientFactory"/> </bean> </beans>
4、controller代码,注意操作的时候需要指定Collection。
import org.apache.solr.client.solrj.response.UpdateResponse; import org.lanqiao.entity.Articles; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; 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.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.Date; import java.util.List; import java.util.Optional; /** * Created by David on 2019/9/7. */ @Controller public class ArticlesController { @Autowired private SolrTemplate solrTemplate; @RequestMapping("/save") @ResponseBody public String save() { Articles articles = new Articles(); articles.setId(11); articles.setTitle("山东济南商城"); articles.setCreateDate(new Date()); solrTemplate.saveBean("articles",articles); solrTemplate.commit("articles"); return "success save !"; } @RequestMapping("/get") @ResponseBody public Articles selectById() { Optional<Articles> optional = solrTemplate.getById("articles", 1, Articles.class); return optional.get();//optional jdk1.8+ 解决空指针问题。 } @RequestMapping("/del") @ResponseBody public int delById() { UpdateResponse updateResponse = solrTemplate.deleteByIds("articles","11"); return updateResponse.getStatus();//0 表示成功 } @RequestMapping("/select") @ResponseBody public List<Articles> select() { // 查询所有 Query query = new SimpleQuery(); // 设置条件 Criteria criteria = new Criteria("title").is("吉林"); query.addCriteria(criteria); //设置分页 query.setOffset(0l); //开始索引(默认0) query.setRows(2); //每页记录数(默认10) //设置排序规则 Sort sort = new Sort(Sort.Direction.ASC, "createDate"); query.addSort(sort); //查询 ScoredPage<Articles> pages = solrTemplate.queryForPage("articles", query, Articles.class); System.out.println("pages.getTotalElements() = " + pages.getTotalElements()); List<Articles> content = pages.getContent(); return content; } }
SpringMVC部分的知识点此处就不详细描述,程序清单如下:
三、springboot插件开发
Springboot插件默认是使用Solrj的SolrClient对象实现Solr操作。参见博客:https://www.jianshu.com/p/05a161add1a6
笔者认为spring-data-solr的 SolrTemplate 更适合进行开发,所以此处重点讲如何将默认的Solrj改成spring-data-solr。
1、引入Maven支持
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-solr</artifactId> </dependency>
引入后可以看到其即支持Solrj同时也支持spring-data-solr实现Solr的操作。
2、配置application.properties文件,使用spring-data-solr-4.0版本只配置到根路径。
# solr配置 spring.data.solr.host=http://localhost:8983/solr
3、编写config文件,将Solrj的SolrClinet封装为spring-data-solr的SolrTemplate。
import org.apache.solr.client.solrj.SolrClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.solr.core.SolrTemplate; @Configuration public class MySolrConfig { @Autowired SolrClient solrClient; @Bean public SolrTemplate getSolrTemplate() { return new SolrTemplate(solrClient); } }
这样就可以使用SolrTemplate对象来操作Solr了,controller中的方法和entity中的对象都不用改变,同上面的代码。
程序清单:
POJO代码:
controller代码:
参考文章:
https://blog.csdn.net/likemebee/article/details/78469002
https://www.jianshu.com/p/05a161add1a6
https://blog.csdn.net/zhuzg2005/article/details/89598925