springboot整合solr

Posted 求知若渴的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot整合solr相关的知识,希望对你有一定的参考价值。

springboot整合solr

搭建solr服务器 solr就相当于是一个数据库

第一步:创建一个空的文件夹testsolr,为了方便管理tomcat、solr以及solr的数据源管理;
技术图片

第二步、安装下载Tomcat8.5.9、solr8.1.1,并创建一个空的文件夹solrHome(solr 数据源)
solr8.1.1下载地址https://lucene.apache.org/solr/guide/8_1/installing-solr.html 一般下载zip格式就行
第三步:把solr-8.1.1安装包中的server→solr-webApp→webApp下的文件拷贝一份到apache-tomcat-8.5.9→webApp下创建的solr文件夹中:
技术图片
技术图片
第四步:将solr-8.1.1安装包中的server→ext 文件夹下的jar、server文件夹下的jar文件、拷贝到tomcat→webApp→solr→WEB_INF→lib文件夹中(网上很多教程一般只会拷贝server→ext 文件夹下的jar但是启动tomcat并访问时会报404。个人建议全拷)
技术图片
第五步:配置apache-tomcat-8.5.9→webApp→solr→WEB_INF下的web.xm
1、添加配置(指定solr数据源的位置):

  <!--配置solr 数据源-->
	<env-entry>  
         <env-entry-name>solr/home</env-entry-name>  
         <env-entry-value>D:	estsolrsolrHome</env-entry-value>  
         <env-entry-type>java.lang.String</env-entry-type>  
    </env-entry>

2、注释一下配置(目的是防止tomcat 403问题)

 <!-- Get rid of error message -->
 <!-- <security-constraint>
    <web-resource-collection>
      <web-resource-name>Disable TRACE</web-resource-name>
      <url-pattern>/</url-pattern>
      <http-method>TRACE</http-method>
    </web-resource-collection>
    <auth-constraint/>
  </security-constraint>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Enable everything but TRACE</web-resource-name>
      <url-pattern>/</url-pattern>
      <http-method-omission>TRACE</http-method-omission>
    </web-resource-collection>
  </security-constraint>-->

第六步:把solr-8.1.1安装包中的server→resources文件下的配置文件拷贝到apache-tomcat-8.0.47→webApp→solr→WEB_INF→classes文件夹下(如果没有classes文件夹,请先创建)
技术图片
技术图片
需要分别修改log4j2的两个配置文件,需要把所有${sys:solr.log.dir}修改为自己的指定的真是路径。
技术图片
${sys:solr.log.dir}本机存放solr日志的文件夹
第七步:启动tomcat,访问 http://localhost:8080/solr/index.html验证是否配置成功。
完了有可能报404是因为jar不全
技术图片
Solr server lib 和ext的jar都需要拷到tomcat solr web-inf lib下面
**

sorl搭建成功操作solrweb端

**

第一步创建solrCore
目前solrHome目录是空的,我们创建一个空文件夹core1,这个就是我们的一个域(相当于项目对应的库),然后把solr-8.1.1/server/solr/configsets/sample_techproducts_configs/conf/ 这个文件复制到solrHome/core1中。
技术图片
技术图片
把solr5.5/server/solr/solr.xml复制到solrHome目录下。
第二步在solr的管理控制台界面,添加一个core1
技术图片
这下就创建成功了一个域core1 请注意我打码的部分,需要先执行第一步创建solrCore操作,否则的话,会无法创建solr core,也就是会有错误信息,这是solr的一个bug,但是至今没有修复
第三步 准备好ik分词器的jar包,可以自己编译,也可以下载我生成的。
然后把它复制到tomcat/webapp/solr/WEB-INF/lib里面。(千万不要复制到tomcat/lib中,这样会找不到lucene的类)
打开solrHome/core1/conf/managed-schema文件,在最下方,追加如下配置

<fieldType name="text_ik" class="solr.TextField">
    <analyzer type="index" useSmart="false"
        class="org.wltea.analyzer.lucene.IKAnalyzer" />
    <analyzer type="query" useSmart="true"
        class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>

启动tomcat,即可看到text_ik分词
技术图片
中文分词器安装成功

第四步配置自定义字段域 这个相当于数据库中的字段

	<!--自定义字段域-->
    <field name="typeName"  type="string" indexed="true" stored="true"  multiValued="false"/>
	<field name="docName"  type="text_ik" indexed="true" stored="true"  multiValued="false"/>
	<field name="introduction"  type="text_ik" indexed="true" stored="true"  multiValued="false"/>
	<field name="keyPackage"  type="text_ik" indexed="true" stored="true"  multiValued="false"/>
	<field name="uploadBy"  type="text_ik" indexed="true" stored="true"  multiValued="false"/>
	<field name="uploadTime"  type="text_ik" indexed="true" stored="true"  multiValued="false"/>
	<field name="downloadNumber"  type="plong" indexed="true" stored="true"  multiValued="false"/>
	<field name="writeDate"  type="pdate" indexed="true" stored="true"  multiValued="false"/>
	<field name="jh"  type="text_ik" indexed="true" stored="true"  multiValued="false"/>
	<!--复制域(solr的搜索优化功能,将多个字段域复制到一个域里面,提高查询的效率)-->
	<field name="doc_keywords"  type="text_ik" indexed="true" stored="false"  multiValued="true"/>
	<copyField source="typeName"  dest="doc_keywords"/>
	<copyField source="docName"  dest="doc_keywords"/>
	<copyField source="introduction"  dest="doc_keywords"/>
	<copyField source="keyPackage"  dest="doc_keywords"/>
	<copyField source="uploadBy"  dest="doc_keywords"/>
	<copyField source="uploadTime"  dest="doc_keywords"/>
	<copyField source="downloadNumber"  dest="doc_keywords"/>
	<copyField source="author"  dest="doc_keywords"/>
	<copyField source="writeDate"  dest="doc_keywords"/>
	<copyField source="jh"  dest="doc_keywords"/>

增删改
添加数据
技术图片
根据id删除
技术图片

根据条件删除 左边时域 右边时字段域
技术图片
solr查询
技术图片

条件查询
技术图片

solr复制域的查询
技术图片

设置高亮
技术图片

创建springboot项目

**
第一步创建字段域对应的实体 SearchResult

package com.shiwen.yitihui.domain;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.ForeignKey;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
* @author wangjie:
* @version 创建时间:2019年8月20日 下午4:48:41
* @Description 类描述:solr查询实体
*/

@Entity
@Table(name="B_DOCUMENT_FILE")
public class SearchResult extends AbstractEntity {
	
	private static final long serialVersionUID = -8052339972799799652L;
	
	@ManyToOne
	@JoinColumn(name="docType")
	private DocType  docType;
	
	@Column(name="doc_name")
	private String  docName;
	
	@Column(name="introduction")
	private String  introduction;
	
	@Column(name="key_package")
	private String  keyPackage;
	
	@Column(name="upload_by")
	private String  uploadBy;
	
	private Date uploadTime = new Date();
	
	@Column(name="download_number")
	private Long downloadNumber;
	
	@Column(name="author")
	private String  author;
	
	private Date writeDate;
	
	@Column(name="jh")
	private String  jh;

	public DocType getDocType() {
		return docType;
	}

	public void setDocType(DocType docType) {
		this.docType = docType;
	}

	public String getDocName() {
		return docName;
	}

	public void setDocName(String docName) {
		this.docName = docName;
	}

	public String getIntroduction() {
		return introduction;
	}

	public void setIntroduction(String introduction) {
		this.introduction = introduction;
	}

	public String getKeyPackage() {
		return keyPackage;
	}

	public void setKeyPackage(String keyPackage) {
		this.keyPackage = keyPackage;
	}

	public String getUploadBy() {
		return uploadBy;
	}

	public void setUploadBy(String uploadBy) {
		this.uploadBy = uploadBy;
	}

	public Date getUploadTime() {
		return uploadTime;
	}

	public void setUploadTime(Date uploadTime) {
		this.uploadTime = uploadTime;
	}

	public Long getDownloadNumber() {
		return downloadNumber;
	}

	public void setDownloadNumber(Long downloadNumber) {
		this.downloadNumber = downloadNumber;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public Date getWriteDate() {
		return writeDate;
	}

	public void setWriteDate(Date writeDate) {
		this.writeDate = writeDate;
	}

	public String getJh() {
		return jh;
	}

	public void setJh(String jh) {
		this.jh = jh;
	}
}

第二部创建solr搜索的接口

public interface SearchSolrService {
	
	public List<SearchResult> getList();
	
	public List<SearchResult> getListBySearchKey(String searchKey,Integer page, Integer row);

}

第三步pom文件添加solr依赖

<!-- solr -->
		<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-solr</artifactId>
		</dependency>

第三步实现SearchService接口
发现solr引擎查询,需要有数据才能查,因此需要将数据库中的数据放入到solr引擎中(及solr初始化)

spring:
  application:
    name: solr
  data:
    solr:
      host: http://127.0.0.1:8080/solr/core1

第四步solr的增删改
(1) solr的增加技术图片
删除solr
技术图片
solr初始化

	/**
	 * solr初始化
	 */
	@RequestMapping("/init")
	public void initDocument() {
		// 查询数据库的信息
		List<SearchResult> searchResults = searchSolrService.getList();
		for (SearchResult result : searchResults) {
			// 创建solr文档对象
			SolrInputDocument docunment = new SolrInputDocument();
			docunment.addField("id", result.getId());
			docunment.addField("docType", result.getDocType());
			docunment.addField("docName", result.getDocName());
			docunment.addField("introduction", result.getIntroduction());
			docunment.addField("keyPackage", result.getKeyPackage());
			docunment.addField("uploadBy", result.getUploadBy());
			docunment.addField("uploadTime", result.getUploadTime());
			docunment.addField("downloadNumber", result.getDownloadNumber());
			docunment.addField("author", result.getAuthor());
			docunment.addField("writeDate", result.getWriteDate());
			docunment.addField("jh", result.getJh());
			// 添加solr文档对象到solr服务引擎中
			try {
				solrClient.add(docunment);
				solrClient.commit();
			} catch (SolrServerException | IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

solr查询

	/**
	 * solr查询
	 */
	@RequestMapping("/getList")
	public Map<String, Object> queryAllSolr(@RequestParam String value) throws IOException, SolrServerException {
		Map<String, Object> mp = new HashMap<String, Object>();
		try {
			ModifiableSolrParams params =new ModifiableSolrParams();
			if(value == null || value.equals(null)) {
				//params.add("q", "*:*");
				params.add("q","id:* or docName:* or introduction:* or keyPackage:* or uploadTime:* or author:* or author_s:*");
			}else {
				//params.add("q", "*:*"+value);
				//params.add("q","*:*"+value+"*");
				params.add("q","id:*"+value+"* or docName:*"+value+"* or introduction:*"+value+"* or keyPackage:*"+value+"* or uploadTime:*"+value+"* or author:*"+value+"* or author_s:*"+value+"*");
			}
            params.add("start","0");
            params.add("rows","100");
            QueryResponse query = solrClient.query(params);
            mp.put("list", query.getResults());
        }catch (Exception e){
            e.printStackTrace();
        }
		return mp;
 
	}

查询对应的前段页面

<!-- 使用solr进行全文索引 -->
<div class="panel panel-default">
    <div class="panel-heading">
        <form class="form-horizontal">
            <div style="float:left;">
                <input ng-model="searchContent" class="form-control ng-pristine ng-untouched ng-valid ng-empty"
                    style="width:560px;height: 34px" type="text" ng-keyup="enterEvent($event)">
            </div>
            <div style="float:left;width:50px;"><span class="input-group-addon"
                    style="border-color: #1e293d; background-color: #1e293d;height: 34px" ng-click="solrSearch()">搜索</span>
            </div>
        </form>
    </div>
</div>
``
对应请求后台的js这个是使用anglarjs写的
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190822105208386.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDA2MjM4NA==,size_16,color_FFFFFF,t_70)

以上是关于springboot整合solr的主要内容,如果未能解决你的问题,请参考以下文章

08 springboot整合solr

springboot整合solr

SpringBoot整合Spring Data Solr

SpringBoot2.x 整合Solr6.x

SpringBoot:Mybatis整合PostgreSQL

SpringBoot整合多个RabbitMQ