创新实训(9)——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数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来看看小兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值