一、版本介绍:
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分词器的集成(关于忽略词,近义词等等详细配置后续添加)