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="560px;height: 34px" type="text" ng-keyup="enterEvent($event)">
</div>
<div style="float:left;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)