之前按照公司要求,为了提高搜索的准确性、广泛性以及用户体验,研究了一下Solr技术并添加到了自己的项目中。在网上看了好多博客的文章,根据前辈的经验得到了很多指点,但是也跳了不少坑。今天回顾老代码,决定做一下笔记,自己码一篇文章,希望能够帮到奋斗在一线的开发人员。想必各位看官既然能翻到这篇文章,一定是已经对Solr有所了解,所以这里不再阐述,直接上干货,搭建Solr环境并将创建的Solr工程。
一、首先列出来搭建Solr服务器所需要的基本工具
1、基本环境 :JDK1.8(solr7.4默认jdk1.8+);
2、框架 :SpringBoot(内置集成Tomcat};
3、开发工具:IDEA;
4、管理工程:Gradle;
5、全文搜索引擎Solr:solr7.4;
附:
(1)、Solr-7.4.0安装包的百度网盘下载地址:https://pan.baidu.com/s/1uetXcon7BDw1QAIYfurLew 提取码:u8px
(2)、Solr-7.4.0安装包的官网下载地址:http://lucene.apache.org/solr/downloads.html
注:在进行接下来的工作之前,一定要确保你的jdk环境以及开发配置可以正常运作。
二、开始搭建Solr服务器
1、首先将下载的solr-7.4.0.zip进行解压,随便一个文件夹都可以,最好是有意义、易于自己后期查找的文件夹,此处本人就解压到了当前文件夹。最好不要是解压到中文名的文件夹,后期95%会出错。
2、在solr7.4/server/solr下创建一个core
3、将solr7.4/dist目录下的solr-dataimporthandler-7.4.0.jar、
solr-dataimporthandler-extras-7.4.0.jar和mysql-connector-java-8.0.11.jar(这个自己弄)复制到/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/lib下
4、将solr-7.4.0/server/solr/configsets/_default下的conf文件复制一份到你新建的core目录下
5、在solr7.4/server/solr/zhanhong_core下创建一个data,data和你复制过来的conf同级
6、在solr7.4/server/solr/zhanhong_core/conf/创建data-config.xml,里面写上如下代码(自己按需求更改mysql相关和document标签下的数据库对应字段)
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource name="source1" type="JdbcDataSource"
driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/live?useSSL=true&serverTimezone=UTC"
user="root"
password="root" />
<document>
<entity name="recharge_record" dataSource="source1" pk="id"
query="SELECT * FROM recharge_record">
<field column='id' name='id' />
<field column='uid' name='uid' />
<field column='tradeNo' name='tradeNo' />
<field column='productId' name='productId' />
<field column='money' name='money' />
<field column='payType' name='payType' />
<field column='payStatus' name='payStatus' />
<field column='remark' name='remark' />
<field column='createTime' name='createTime' />
<field column='confirmTime' name='confirmTime' />
</entity>
</document>
</dataConfig>
7、修改solr7.4/server/solr/zhanhong_core/conf/下的solrconfig.xml,在
标签上添加
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
结果如下图:
8、修改solrconfig.xml下的如图
9、在solr7.4/server/solr/zhanhong_core/conf/下的managed-schema文件中添加data-config.xml里面所添加的字段
10、win+r启动cmd,进入solr7.4/bin目录下执行solr start -p 8080(执行solr start,默认是8983端口),solr stop -all停止solr运行
11、进入浏览器输入localhost:8080,就会进入solr管理界面
①:点击Core Admin
②:上图所述步骤完成后点击Core Selector的一个下拉框,就可以看到红色框中的东西
③:点击Dataimport,完成红框中操作,如果使用solrj代码实现,此操作可忽略
12、使用solrj,打开idea创建gradle工程,添加solrj7.4jar
org.apache.solr:solr-solrj:7.4.0
三、代码来一波
①:controller层代码如下
@Controller
public class solrj {
@Autowired
SolrjService solrjService;
private static final String solrUrl = "http://localhost:8080/solr/zhanhong_core";
//创建solrClient同时指定超时时间,不指定走默认配置
private static HttpSolrClient client = new HttpSolrClient.Builder(solrUrl)
.withConnectionTimeout(10000)
.withSocketTimeout(60000).build();
@RequestMapping("/query")
@ResponseBody
public List<Object> querySolr() throws Exception {
//封装查询参数
SolrQuery query = new SolrQuery("*:*");
//添加回显内容
query.addField("id");
query.addField("tradeNo");
query.addField("productId");
query.addField("money");
query.addField("payType");
query.addField("payStatus");
query.addField("remark");
query.addField("createTime");
query.addField("confirmTime");
query.setRows(20);
//执行查询返回QueryResponse
QueryResponse response = client.query(query);
//获取doc文档
SolrDocumentList documents = response.getResults();
List<Object> list = new ArrayList<>();
for (SolrDocument solrDocument : documents) {
list.add(solrDocument);
}
client.close();
return list;
}
@RequestMapping("/add")
public void solrAdd() throws Exception {
//创建文档doc
List<RechargeRecord> list = solrjService.solrAdd();
for (RechargeRecord rechargeRecord:list) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id",rechargeRecord.getId() );
doc.addField("uid",rechargeRecord.getUid() );
doc.addField("tradeNo",rechargeRecord.getTradeNo() );
doc.addField("productId",rechargeRecord.getProductId());
doc.addField("money",rechargeRecord.getMoney() );
doc.addField("payType",(rechargeRecord.getPayType()==1?"支付宝":(rechargeRecord.getPayType()==2?"微信":(rechargeRecord.getPayType()==3?"银联":"出现问题,请稍后"))) );
doc.addField("payStatus",(rechargeRecord.getPayStatus()==1?"未支付":(rechargeRecord.getPayStatus()==2?"支付成功":(rechargeRecord.getPayStatus()==3?"支付失败":"出现问题,请稍后"))) );
doc.addField("remark",rechargeRecord.getRemark() );
doc.addField("createTime",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( rechargeRecord.getCreateTime()));
doc.addField("confirmTime",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(rechargeRecord.getConfirmTime()));
//添加到client
UpdateResponse updateResponse = client.add(doc);
}
//索引文档必须commit
client.commit();
//client.close();
}
@RequestMapping("/delete")
public void solrDelete()throws Exception{
//1:通过id删除
//client.deleteById("63");
//2:通过文档存在id list删除
SolrQuery query = new SolrQuery("id:*");
query.addField("id");
QueryResponse response = client.query(query);
SolrDocumentList documents = response.getResults();
List<String> ids = new ArrayList<>();
for (SolrDocument solrDocument:documents) {
ids.add(solrDocument.get("id").toString());
}
client.deleteById(ids);
//3:通过查询信息删除
/*client.deleteByQuery("id:63");*/
client.commit();
client.close();
}
}
②:service和mapper层代码只进行简单查询就不写了。
③:点击Query,结果如下
四、总结
1、关于Solr服务器的搭建,以及导入数据、简单的查询,本文已经介绍完了。目前依然在研究这个东西,在以后的文章中会陆续更新关于Solr的技术点,也希望各位能够多多指点,共同进步。
2、Solr服务器搭建过程的难点、繁琐点:各个目录下的jar包的移动,以及各个目录下的各种xml文件的配置,最主要的是各层级目录要关联正确,大家多练习几次,相信都可以熟练地进行搭建部署!
3、关于Solr集群搭建后续这边会慢慢给大家完善!!!
案例代码:https://gitee.com/fansha/solr.git
参考:https://www.cnblogs.com/frankdeng/p/9615856.html