SpringBoot整合solr
相关配置
在application.properties中添加配置
spring.data.solr.host=http://localhost:8983/solr
也可写成
spring.data.solr.host=http://localhost:8983/solr/corename
但这样后期对solr的操作只能局限于一个core
添加maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
<version>2.4.4</version>
</dependency>
实体类DmsArticle
import com.alibaba.fastjson.JSONArray;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.apache.solr.client.solrj.beans.Field;
import java.io.Serializable;
@Document("dms_article")
public class DmsArticle implements Serializable {
@Id
@Field("_id")
@ApiModelProperty(value = "文章id")
private String id;
@Field("articleAuthor")
@ApiModelProperty(value = "文章作者")
private String articleAuthor;
@Field("bookname")
@ApiModelProperty(value = "书名")
private String bookname;
@Field("content")
@ApiModelProperty(value = "内容")
private String content;
@Field("imgurl")
@ApiModelProperty(value = "图片链接")
private String imgUrl;
@Field("page")
@ApiModelProperty(value = "页码")
private long page;
@Field("title")
@ApiModelProperty(value = "标题")
private String title;
@Field("XML")
@ApiModelProperty(value = "xml文档")
private String xml;
@Field("annotation")
@ApiModelProperty(value = "文章注解")
private String annotation;
@Field("dynasty")
@ApiModelProperty(value = "朝代")
private String dynasty;
@Field("notes")
@ApiModelProperty(value = "详细注解")
private JSONArray notes;
// getter and setter
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getArticleAuthor() {
return articleAuthor;
}
public void setArticleAuthor(String articleAuthor) {
this.articleAuthor = articleAuthor;
}
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getImgUrl() {
return imgUrl;
}
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
}
public long getPage() {
return page;
}
public void setPage(long page) {
this.page = page;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getXml() {
return xml;
}
public void setXml(String xml) {
this.xml = xml;
}
public String getAnnotation() {
return annotation;
}
public void setAnnotation(String annotation) {
this.annotation = annotation;
}
public String getDynasty() {
return dynasty;
}
public void setDynasty(String dynasty) {
this.dynasty = dynasty;
}
public JSONArray getNotes() {
return notes;
}
public void setNotes(JSONArray notes) {
this.notes = notes;
}
@Override
public String toString() {
return "Article{" +
"id='" + id + '\'' +
", articleAuthor='" + articleAuthor + '\'' +
", bookname='" + bookname + '\'' +
", content='" + content + '\'' +
", imgUrl='" + imgUrl + '\'' +
", page=" + page +
", title='" + title + '\'' +
", xml='" + xml + '\'' +
", annotation='" + annotation + '\'' +
", dynasty='" + dynasty + '\'' +
", notes=" + notes +
'}';
}
}
@Document注解属于JPA,是查询时把实体类和数据库集合对应起来
@Field注解属于solr,构建Java实体类和solr索引的映射
查询逻辑
SolrController
import cn.edu.sdu.sdudoc.service.SolrService;
import com.alibaba.fastjson.JSONArray;
import org.apache.solr.client.solrj.SolrServerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RestController
@RequestMapping("/solr")
public class SolrController {
@Autowired
private SolrService solrService;
@RequestMapping("/query_head")
@ResponseBody
public JSONArray queryHead(String corename,String field,String keyword) throws IOException, SolrServerException {
return solrService.queryHead(corename,field, keyword);
}
}
参数介绍:
corename:core名称
field:要搜索的solr索引字段
keyword:关键词
SolrService
import com.alibaba.fastjson.JSONArray;
import org.apache.solr.client.solrj.SolrServerException;
import java.io.IOException;
public interface SolrService {
JSONArray queryHead(String corename,String field,String keyword) throws SolrServerException, IOException;
}
SolrServiceImpl
import cn.edu.sdu.sdudoc.service.SolrService;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class SolrServiceImpl implements SolrService {
@Autowired
private SolrClient solrClient;
@Override
public JSONArray queryHead(String corename,String field, String keyword) throws SolrServerException, IOException {
System.out.println(field+":"+keyword);
SolrQuery solrQuery=new SolrQuery();
solrQuery.setQuery(field+":"+keyword);
QueryResponse queryResponse = solrClient.query(corename,solrQuery);
SolrDocumentList results = queryResponse.getResults();
JSONArray jsonArray = new JSONArray();
for (SolrDocument document:results) {
System.out.println(document);
jsonArray.add(document);
}
return jsonArray;
}
}
查询结果
访问这个接口http://localhost:8080/solr/query_head?corename=sms_article_head&field=title&keyword=%E6%98%A5
solr数据如下:
接口返回的数据为:
[{"dynasty":"唐","title":"春夜","bookname":"唐选","aid":"60612af5e1010000d8004e32","articleAuthor":"yyy","id":"089c018c-5a22-4907-a25c-e77a9452cf39","_version_":1697543669608873984},
{"dynasty":"唐","title":"春夜宴从弟桃花园序","bookname":"全唐文","aid":"60619492a60502155671db28","articleAuthor":"李白","id":"18de3a05-c766-4d70-a4b6-045b0007f12c","_version_":1697543669610971136}]
如此,我们的查询模块已经完成
插入逻辑
对于在linux端给solr插入mongoDB的数据,我使用了SolrClient和JPA
相关配置
如果mongoDB采取认证连接,必须确保登录的用户与所操作的数据库相关联
application.properties配置如下:
spring.data.mongodb.host=***.**.***.***
spring.data.mongodb.port=27017
spring.data.mongodb.username=***
spring.data.mongodb.password=***
spring.data.mongodb.database=***
pom依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
DataOutput
DataOutput负责从mongoDB数据库中取出数据,使用了JPA
import cn.edu.sdu.sdudoc.sdudocmbg.entity.DmsArticle;
import cn.edu.sdu.sdudoc.service.DmsArticleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class DataOutput {
@Autowired
private DmsArticleService dmsArticleService;
public List<DmsArticle> findAllDmsArticle(){
return dmsArticleService.findAll();
}
}
SolrInput
SolrInput负责把数据写入solr中
import cn.edu.sdu.sdudoc.sdudocmbg.entity.DmsArticle;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.List;
@Service
public class SolrInput {
@Autowired
public SolrClient solrClient;
@Autowired
public DataOutput dataOutput;
public void addDataDmsArticle() throws SolrServerException, IOException {
List<DmsArticle> l = dataOutput.findAllDmsArticle();
for(DmsArticle dmsArticle :l){
System.out.println(dmsArticle);
solrClient.addBean("dms_article",dmsArticle);
solrClient.commit("dms_article");
System.out.println("添加成功"+dmsArticle);
}
}
}
Test
@Test
public void addDataDmsArticle() throws SolrServerException, IOException {
solrInput.addDataDmsArticle();
}
发现数据已经成功导入
打包war包并部署
把项目打成war包,放到tomcat的webapps下就可以自动部署
pom.xml添加如下:
<packaging>war</packaging>
build标签下添加:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>cn.edu.sdu.sdudoc.SearchEngineApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
之后install
在install之前最好先clean一次,否则如果类被删除了,它仍然会被打包到war中,并在运行时报错
并且如果是多模块部署,模块间的引用要写在pom中,如:
<dependency>
<groupId>cn.edu.sdu</groupId>
<artifactId>sdudoc-mbg</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
把war包放到tomcat/webapps目录下会自动解压(如果不自动解压,就重启tomcat)
之后便可访问到
清空solr数据
插入XML如下:
<delete><query>*:*</query></delete>
<commit/>
执行即可清空solr数据