solr的基本使用
数据库数据导入
1.jar包准备
1.1准备mysql连接驱动包,mysql-connector-java-5.1.44-bin.jar这个jar包的使用率是特别高的直接从项目中拷贝一个,或者从maven 本地仓库获取都可以
1.2 找到solr-dataimporthandler-7.5.0.jar和solr-dataimporthandler-extras-7.5.0.jar 。这2个jar在solr安装目录下有solr-7.5.0\dist
1.3把这3个jar包复制到solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib 目录下,这其实是一个标准的web项目目录。
2.配置文件准备
新建一个db-data-config.xml文件到E:\solr7.5\solr-7.5.0\server\solr\new_core 这个文件是数据库连接池配置文件里面配置,我们需要配置自己的数据库地址和查询sql。
你也可以去E:\solr7.5\solr-7.5.0\example\example-DIH\solr\db\conf下拷贝那个过来修改
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/db_blogs?characterEncoding=UTF-8" user="root" password="root" />
<document>
<!-- pk="ID" 这个很有必要,因为其中的增量索引查询主键ID时需要 -->
<!-- dataSource="mydb" 这个引用名字是引用上面数据源的名字 -->
<!-- name="myinfo" 这个名字必须唯一,存在多个实体时 -->
<!-- query="select * from myinfo WHERE isdelete=0 query查询是指
查询出表里所有的符合条件的数据,因为笔者测试的有删除业务,所以
where 后面有一个限定条件isdelete=0,意思为查询未被删除的数据
(注意这个query查询只对第一次全量导入有作用,对增量导入不起作用)
-->
<!--
deltaQuery="select productId from product where modifyTime > '${dataimporter.last_index_time}'"
deltaQuery的意思是,查询出所有经过修改的记录的ID
可能是修改操作,添加操作,删除操作产生的
(此查询只对增量导入起作用,而且只能返回ID值)
-->
<!--
deletedPkQuery="select productId from product where isdelete=-1"
此操作值查询那些数据库里伪删除的数据的ID(即isdelete标识为-1的数据)
solr通过它来删除索引里面对应的数据
(此查询只对增量导入起作用,而且只能返回ID值)
-->
<!--
deltaImportQuery="select * from product where productId = '${dih.delta.productId}'"
次查询是获取以上两步的ID,然后把其全部数据获取,根据获取的数据
对索引库进行更新操作,可能是删除,添加,修改
(此查询只对增量导入起作用,可以返回多个字段的值,一般情况下,都是返回所有字段的列)
-->
<entity name="t_article" query="select * from t_article" pk="id">
<field column="id" name="id" />
<field column="title" name="title" />
<field column="content" name="content" />
<field column="summary" name="summary" />
<field column="crawlerDate" name="crawlerDate" />
<field column="clickHit" name="clickHit" />
<field column="typeId" name="typeId" />
<field column="tags" name="tags" />
<field column="orUrl" name="orUrl" />
<field column="state" name="state" />
<field column="releaseDate" name="releaseDate" />
</entity>
</document>
</dataConfig>
dataSource-->数据库连接,用户名密码配置
entity-->sql定义
field-->字段定义,column对应数据库字段,name对应solr的索引字段名
然后在solrconfig.xml中加入大概在680行左右的位置
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">db-data-config.xml</str>
</lst>
</requestHandler>
2.2managed-schema文件的修改(在solr5.5以前是叫schema.Xml的)
修改E:\solr7.5\solr-7.5.0\server\solr\new_core\conf下的managed-schema配置文件在这里添加你的数据库字段
关于这个配置文件的详细解释大家可以去看我的博客https://blog.youkuaiyun.com/yjt520557/article/details/85258444
其实也可以直接在文件managed-schema中添加字段不过容易报错所以不推荐而且需要重启生效
2.2控制界面添加
http://localhost:8983/solr/#/new_core/schema
在这里你需要注意id是它本来就配置好的
如果你的表主键id不是叫id,那么你定义的field需要指定required="true",并把默认的id的required="true"属性去掉,
并把<uniqueKey>id</uniqueKey>修改成你的主键id值(这个你需要去文件夹E:\solr7.5\solr-7.5.0\server\solr\new_core\conf下修改),否则数据导入不进去。
添加好之后在Analysis中可以看到,在你的managed-schema文件中也有对应的字段了你可以通过Files查看也可以到
E:\solr7.5\solr-7.5.0\server\solr\new_core\conf下查看
这种操作不需要重启就可以生效,推荐一下
其实也可以直接在文件中managed-schema添加字段不过容易报错所以不推荐而且需要重启生效
3.数据库导入
点击Entity,我们发现有我们配置的t_article,勾选中
最后勾选Auto-Refresh Status,点击Excute,
右边会显示执行结果
进入到Query菜单,执行查询,如图所示,结果如下:
这与我们的数据库数据是对应的
solr中的索引字段名取决于你在managed-schema中如何配置定义。
配置的时候注意一下资源消耗
4.数据清空
进入solr主页,进入Documents模块,如图所示,选择XML类型
输入<delete><query>*:*</query></delete><commit/>
点击Submit Document,结果如下:
此时再去查询,就看到数据都已经清空。
5.增量更新索引
我们有了数据导入,那数据库变化了怎么同步数据?难道每次手动点一点?
答案当然是NO,所以接下来,我们一起了解下如何配置增量更新索引。
增量更新索引,顾名思义就是在原有的数据基础上进行索引更新,不会对已有的数据再进行一次索引。
5.1准备jar包
天下没有免费的jar包这个jar包也不好找本来想让你们也积分下载的想想不太好
https://pan.baidu.com/s/1rUcIYsiQrOyHbXem0jkNjQ 提取码6hts给我点个赞就好了
把apache-solr-dataimportscheduler-1.4.Jar这个jar包放到
E:\solr7.5\solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib下
5.2修改web配置
E:\solr7.5\solr-7.5.0\server\solr-webapp\webapp\WEB-INF
打开web.xml文件,增加监听器配置
<listener>
<listener-class>
org.apache.solr.handler.dataimport.scheduler.ApplicationListener
</listener-class>
</listener>
5.3增加dataimport.properties配置
在这里大家一定要注意目录结构不要放错了位置;
E:\solr7.5\solr-7.5.0\server\solr目录下新建一个conf文件夹
然后在conf目录下,新建dataimport.properties 文件。
文件内容如下
#################################################
# #
# dataimport scheduler properties #
# #
#################################################
# to sync or not to sync
# 1 - active; anything else - inactive
syncEnabled=1
# which cores to schedule
# in a multi-core environment you can decide which cores you want syncronized
# leave empty or comment it out if using single-core deployment
# 修改成你所使用的core
syncCores=new_core
# solr server name or IP address
# [defaults to localhost if empty]
server=localhost
# solr server port
# [defaults to 80 if empty]
# 安装solr的端口
port=8983
# application name/context
# [defaults to current ServletContextListener's context (app) name]
webapp=solr
# URL params [mandatory]
# remainder of URL
# 这里改成下面的形式,solr同步数据时请求的链接
params=/dataimport?command=full-import&clean=false&commit=true
# schedule interval
# number of minutes between two runs
# [defaults to 30 if empty]
#这里是设置定时任务的,单位是分钟,也就是多长时间你检测一次数据同步,根据项目需求修改
# 开始测试的时候为了方便看到效果,时间可以设置短一点
interval=1
# 重做索引的时间间隔,单位分钟,默认7200,即5天;
# 为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=7200
# 重做索引的参数
reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true
# 重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
# 两种格式:2012-04-11 01:00:00 或者 01:00:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=01:00:00
5.4.修改db-data-config.xml配置
修改为:
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/db_blogs?characterEncoding=UTF-8" user="root" password="root" />
<document>
<entity name="t_article" query="select * from t_article"
deltaImportQuery="select * from t_article where id='${dataimporter.delta.id}'"
deltaQuery="select * from t_article where `releaseDate` > '${dataimporter.last_index_time}'"
pk="id"
>
<field column="id" name="id" />
<field column="title" name="title" />
<field column="content" name="content" />
<field column="summary" name="summary" />
<field column="crawlerDate" name="crawlerDate" />
<field column="clickHit" name="clickHit" />
<field column="typeId" name="typeId" />
<field column="tags" name="tags" />
<field column="orUrl" name="orUrl" />
<field column="state" name="state" />
<field column="releaseDate" name="releaseDate" />
</entity>
</document>
</dataConfig>
<!-- 下面分别来介绍属性(如有错误,欢迎指出) -->
<!-- pk="ID" 这个很有必要,因为其中的增量索引查询主键ID时需要 -->
<!-- dataSource="mydb" 这个引用名字是引用上面数据源的名字 -->
<!-- name="myinfo" 这个名字必须唯一,存在多个实体时 -->
<!-- query="select * from myinfo WHERE isdelete=0 query查询是指
查询出表里所有的符合条件的数据,因为笔者测试的有删除业务,所以
where 后面有一个限定条件isdelete=0,意思为查询未被删除的数据
(注意这个query查询只对第一次全量导入有作用,对增量导入不起作用)
-->
<!--
deltaQuery="select productId from product where modifyTime > '${dataimporter.last_index_time}'"
deltaQuery的意思是,查询出所有经过修改的记录的ID
可能是修改操作,添加操作,删除操作产生的
(此查询只对增量导入起作用,而且只能返回ID值)
-->
<!--
deletedPkQuery="select productId from product where isdelete=-1"
此操作值查询那些数据库里伪删除的数据的ID(即isdelete标识为-1的数据)
solr通过它来删除索引里面对应的数据
(此查询只对增量导入起作用,而且只能返回ID值)
-->
<!--
deltaImportQuery="select * from product where productId = '${dih.delta.productId}'"
次查询是获取以上两步的ID,然后把其全部数据获取,根据获取的数据
对索引库进行更新操作,可能是删除,添加,修改
(此查询只对增量导入起作用,可以返回多个字段的值,一般情况下,都是返回所有字段的列)
-->
在这里我的releaseDates是:
${dataimporter.delta.id}指的就是主键如果主键不为id的话就写成你最开始配置的那个<uniqueKey>id</uniqueKey>的值
${dataimporter.last_index_time} 固定写法,更新的判断条件,上一次的修改时间需要大于上一次索引的更新时间
这个参数会自动更新在E:\solr7.5\solr-7.5.0\server\solr\new_core\conf 下的dataimport.properties文件中
这个文件长这样,了解一下:
5.5重启验证
由于之前清除了数据再去重新建立一次索引,把clean勾选上只要不是第一次都选上
这是开始查的数据去数据库修改一下
数据库修改
然后等待一分钟再查询
6.ik中文分词器
6.1下载ik分词器jar包
https://pan.baidu.com/s/1h2NuHAqWsWGP-Q_HKgHZbg
提取码y6dx
把ik-analyzer-solr5-5.x.jar 放到
E:\solr7.5\solr-7.5.0\server\solr-webapp\webapp\WEB-INF\lib文件夹下
现在的是7.多的jar 包了我没有积分下载不到所以使用的这个
6.2修改managed-schema文件
修改E:\solr7.5\solr-7.5.0\server\solr\new_core\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>
如果在你的分词器的配置中query的时候userSmart为false那么在查询的时候这个列就不会显示
name="text_ik",分词器名称,在后面的filed定义的时候,可以直接引用。
将,type定义为"text_ik",则代表该字段将进行分词索引这里我们给title引用为
6.3检查配置
进入solr主页,进入Analysis,输入一段汉字,选择text_ik,点击分析可以看到如下结果:
我们可以看到分词器配置成功了
查询测试
结果:
我们可以看到有明显的分词效果
到这里solr的服务器端搭建就完成了