solr7集群 springboot_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下

5.在solrhome下新建new_core文件夹,

6.将solr-7.4.0\server\solr\configsets_default\conf文件夹复制到new_core下

7.修改solrhome\new_core\conf\solrconfig.xml文件:

贴出具体代码如下:

data-config.xml

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

type="JdbcDataSource"

driver="com.mysql.jdbc.Driver"

url="jdbc:mysql://localhost:3306/dbname?useSSL=true&serverTimezone=UTC"

user="username"

password="password" />

query="SELECT id,name FROM demo">

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

connectionTimeout="20000"

redirectPort="8443" />

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

if not "%JSSE_OPTS%" == "" goto gotJsseOpts

set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"

:gotJsseOpts

set "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体验

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

导入数据库demo表的数据

检索测试

三、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;

@Repository

public 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;

@Service

public 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文件说明

文件夹

描述

contrib

solr的一些插件,用于扩展solr的功能

dist

该文件夹下包含build过程中产生的war和jar文件,以及相关的依赖文件

doc

solr的文档

example

solr官方提供的一些示例程序,简单介绍下面三个目录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分词器的集成(关于忽略词,近义词等等详细配置后续添加)

你可能感兴趣的:(solr7集群,springboot)