千家信息网

springboot 中怎么整合solr

发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,springboot 中怎么整合solr ,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、版本介绍:jdk1.8tomcat8spri
千家信息网最后更新 2024年11月17日springboot 中怎么整合solr

springboot 中怎么整合solr ,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、版本介绍:

jdk1.8
tomcat8
springboot 2.1.3RELEASE(这里有坑,详见下文)
solr 7.4.0 (没有选择最新的版本,是因为项目的boot版本是2.1.3,其对应的solr-solrj.jar版本是7.4.0,为避免出现不可预料不可抗拒不可解决的问题,谨慎选用与之一样版本)

二、solr服务器搭建

下载
  • 1.tomcat8的下载不赘述;

  • 2.solr下载: 进入solr官网 ,找历史版本下载v7.4.0的压缩包,事实上 solr archive 本人并没有访问成功,
    如果网友和我一样访问不了,那只能说明你的脸黑,而官网应该是瓦掉了,所以本人肯定是没有问题的,下面把从网上肆虐而来的一个资源分享一下,附带了一个ik分词器的压缩包,后面有用: 百度网盘 提取码:6mhk


解压
  • 1.解压solr至 D:\JAVA\solr\solr-7.4.0\(下文均以solr-7.4.0代替此全路径)

  • 2.解压tomcat至 D:\JAVA\solr\apache-tomcat-8.5.42(下文均以tomcat-8.5.42代替此全路径)


配置solrhome
  • 1.在路径D:\JAVA\solr\下新建文件夹solrhome(下文均以solrhome代替此全路径)

  • 2.在solrhome下新建logs文件夹(记下此路径:D:\JAVA\solr\solrhome\logs)

  • 3.复制文件夹solr-7.4.0\contrib和solr-7.4.0\dist至solrhome下

  • 4.复制solr-7.4.0\server\solr下所有文件至solrhome下

贴出具体代码如下:

                          
                                                                     data-config.xml                        
  • 7.在solrhome\new_core\conf下新建文件data-config.xml(文件名与上述xml配置保持一致),文件内容如下:

                                                                 
  • 8.修改conf\managed-schema

如果配置了ik分词器可以按此修改:


配置tomcat
  • 1.将solr-7.4.0\server\solr-webapp\下的webapp文件夹复制到tomcat-8.5.42\webapps 并且修改名称为solr

  • 2.在tomcat-8.5.42\webapps\solr\WEB-INF\下新建classes包,将solr-7.4.0\server\resources\log4j2.xml复制到classes包下

  • 3.将下图标注jar复制到tomcat-8.5.42\webapps\solr\WEB-INF\lib(数据库驱动包可以在自己的web项目里找,找到后也复制到该目录下)

修改D:\JAVA\solr\apache-tomcat-8.5.42\webapps\solr\WEB-INF\web.xml如下:

           solr/home              D:\JAVA\solr\solrhome       java.lang.String                    

修改tomcat端口号 ....conf\server.xml 为8888

    

修改D:\JAVA\solr\apache-tomcat-8.5.42\bin\catalina.bat(最后一行是新添加的)

if not "%JSSE_OPTS%" == "" goto gotJsseOptsset JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048":gotJsseOptsset "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"set "JAVA_OPTS=%JAVA_OPTS% -Dsolr.log.dir=D:\JAVA\solr\solrhome\logs"

ik分词器的集成

将ik分词器解压出来的两个jar放到tomcat-8.5.42\webapps\solr\WEB-INF\lib下,然后配置solrhome\new_core\conf\managed-schema 在文件最后添加:

                                                                                                           

三、solr体验

启动tomcat,访问 http://localhost:8888/solr/index.html#/

用ik解析中文语句,匹配测试如下

检索测试


三、springboot中使用solr

配置pom
                                   org.springframework.boot                        spring-boot-starter-data-solr                
配置yml
spring:  data:    solr:      host: http://127.0.0.1:8888/solr

注意:如果你使用的是springboot 2.1.3RELEASE,按照下述操作步骤走完,启动项目会报错,
提示: Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
据说是springboot 2.1.3RELEASE的一个bug,需要在yml中配置一下:

spring:  main:    allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册
编写一个demo,代码如下:

1.entity:

import org.apache.solr.client.solrj.beans.Field;import org.springframework.data.solr.core.mapping.SolrDocument;@SolrDocument(collection="new_core")public class SolrDemo {        @org.springframework.data.annotation.Id         private String id;                @Field("demoName")        private String name;                //省略getset}

2.dao:

import org.jeecg.modules.demo.test.entity.SolrDemo;import org.springframework.data.solr.repository.SolrCrudRepository;import org.springframework.stereotype.Repository;@Repositorypublic interface SolrDemoRepository extends SolrCrudRepository{}

3.service接口

import java.io.IOException;import java.util.List;import org.apache.solr.client.solrj.SolrServerException;import org.jeecg.modules.demo.test.entity.SolrDemo;public interface ISolrService {                void addDemo();                void updatedemo();                void deletedemo();                List queryList(String keyword)  throws SolrServerException, IOException;}

4.service实现类

import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Map;import javax.annotation.Resource;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.impl.HttpSolrClient;import org.apache.solr.client.solrj.response.QueryResponse;import org.apache.solr.common.SolrDocument;import org.apache.solr.common.SolrDocumentList;import org.jeecg.modules.demo.test.entity.SolrDemo;import org.jeecg.modules.demo.test.mapper.SolrDemoRepository;import org.jeecg.modules.demo.test.service.ISolrService;import org.springframework.stereotype.Service;@Servicepublic class SolrServiceImpl  implements ISolrService {                @Resource        private SolrDemoRepository solrDemoRepository;        @Override        public void addDemo() {        //正常情况应该在方法中定义参数将实体传进来,此处demo简单写                SolrDemo demo = new SolrDemo();                demo.setId("001");                demo.setName("俺们都是打酱油的哈哈破");                solrDemoRepository.save(demo);        }        @Override        public void updatedemo() {                SolrDemo demo = new SolrDemo();                demo.setId("001");                demo.setName("你在搞什么扫话题嘎嘎");                solrDemoRepository.save(demo);                        }        @Override        public void deletedemo() {                solrDemoRepository.deleteById("001");        }        @Override        public List queryList(String keyword) throws SolrServerException, IOException {        /*         * 这里有个坑爹的地方,正常情况可以直接在service里直接注入SolrClient,         * 但是因为yml中配置的地址是http://127.0.0.1:8888/solr/,导致注入的SolrClient执行下述查询会报错,         * 无奈只能这么玩了,若网友有好的解决方法,请在下方留言         * 或是调用SolrCrudRepository中的查询方法(我这里需要根据具体字段查询且分页,欢迎留言贴出示例代码)         * 个人猜测应该是springboot其进行了二次封装,根据实体上的注解实例化不同的SolrClient?         *         */                String solrUrl = "http://127.0.0.1:8888/solr/new_core";                SolrClient testSolrClient = new HttpSolrClient.Builder(solrUrl)                    .withConnectionTimeout(10000)                    .withSocketTimeout(60000)                    .build();                                SolrQuery query = new SolrQuery();                                //设置查询条件                query.setQuery("demoName:"+keyword);                                //按照时间排序       // query.addSort("create_time", SolrQuery.ORDER.desc);                        //开始页        query.setStart(0);        //一页显示多少条        query.setRows(50);                        //开启高亮                //query.setHighlight(true);                //设置高亮字段                //query.addHighlightField("demoName");                //前缀                //query.setHighlightSimplePre("");                //后缀                //query.setHighlightSimplePost("");                //执行查找                QueryResponse response = testSolrClient.query(query);                                SolrDocumentList results = response.getResults();                //获取查询到的数据总量                long numFound = results.getNumFound();                if(numFound <= 0) {                        //如果小于0,表示未查询到任何数据,返回null                        return null;                }else {                                        List list = new ArrayList();                        //遍历结果集                        for (SolrDocument doc : results) {                                //得到每条数据的map集合                                Map map = doc.getFieldValueMap();                                //添加到list                                for (String key : map.keySet()) {                                        System.out.println("KEY:"+key+",VALUE:"+map.get(key).toString());                                }                                SolrDemo demo = new SolrDemo();                                demo.setId(map.get("id").toString());                                demo.setName(map.get("demoName").toString());                                list.add(demo);                        }                        return list;                }        }                        }

controller层,就是直接写几个请求然后调用一下service即可,代码及后续测试结果就不贴出来了,请自行编写。

备注

1.solr文件说明

文件夹描述
contribsolr的一些插件,用于扩展solr的功能
dist该文件夹下包含build过程中产生的war和jar文件,以及相关的依赖文件
docsolr的文档
examplesolr官方提供的一些示例程序,简单介绍下面三个目录solr、multicore、webapps
solr该目录是一个包含了默认配置信息的Solr的Core目录
multicore该目录包含了在Solr的multicore中设置的多个Core目录
webapps该目录中包括一个solr.war,该war可作为solr的运行实例工程

2.清除索引文件 *:*

3.solrHome是solr运行的主目录,其下可以创建多个solrCore,solrCore单独对外提供一个搜索服务。

4.solr.install.dir表示solrCore的位置,需要根据实际jar包的位置更改jar包引用路径

5.solr.data.dir表示索引文件存储地址 默认solrCore/data,一开始没有,会自动创建,若要修改,找solrconfig.xml文件 ${solr.data.dir:}

5.ik分词器的集成(关于忽略词,近义词等等详细配置后续添加)

看完上述内容,你们掌握springboot 中怎么整合solr 的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

文件 配置 目录 文件夹 版本 路径 查询 方法 下文 代码 数据 问题 内容 项目 测试 整合 位置 地址 多个 字段 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 罗湖网络安全运维怎么选择 日志级别数据库不可用 网络技术及应用方向 软件开发文档包括什么内容 百度地图 行政级别数据库 开州区税务局网络安全工作 共筑网络安全与治理 初中网络安全为人民主题班会 泡泡云服务器搜索不到设备 学软件开发 累吗 第一章网络安全讲解 网络安全宣传月策划案 山东安卓软件开发靠谱吗 怎么删除各个网站大数据库 腾讯云服务器里面的代码如何下载 erp可以自己用数据库构建吗 数据库地区设计 星体中文名称 数据库 崇明区自动化软件开发解决方案 新九善互联网科技环保袋 2021年sci收录数据库动态 徐汇区如何软件开发不二之选 数据库使用什么协议存储数据 海外云服务器搭建梯子 程序设计基础中数据库和表的建立 软件开发 代码管理 瑞士苏黎世的网络安全专业怎么样 服务器系统如何安装 软件开发实用 工程网络软件开发
0