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:\testsolr\solrHome</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)