在项目开发过程中为了提高查询效率和降低数据库的压力,因此此时就将查询量大的数据放到solr中,查询从solr中执行,不走数据库,但是数据库数据修改后怎么办呢。除了在程序中根据业务需求去操作solrJ实现索引同步外,也可以通过solr连接数据库,实现数据的定时同步,保证数据的一致性,具体使用方法根据业务需求选择。
项目中使用solrJ根据业务需求操作solr APl可以参考下另一篇博客:https://blog.csdn.net/qq_37138756/article/details/80828950
第一步:在solrHome\core\conf(core为我创建的solr库)目录下添加data-config.xml配置文件并编辑内容,这个文件和schema.xml在同一级目录:
data-config.xml配置文件并编辑内容:
<dataConfig>
<!--数据源-->
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/testmaven"
user="root"
password="root"
/>
<!--索引库中的文档-->
<document>
<entity name="user" pk="id"
query="select * from user u"
deltaQuery="select id from user where createTime >'${dih.last_index_time}'"
deltaImportQuery="select * from user where id='${dih.delta.id}">
<!--
query查询是指查询出表里所有的符合条件的数据
deltaQuery的意思是,查询出所有经过修改的记录的ID,可能是修改操作,添加操作,删除操作产生的
deletedPkQuery此操作只查询那些数据库里伪删除的数据的ID(如delYn标识为1的数据)solr通过它来删除索引里面对应的数据
deltaImportQuery查询是获取以上两步的ID,然后把其全部数据获取,根据获取的数据对索引库进行更新操作,可能是删除,添加,修改
-->
<!-- field 数据库 与 solr域做映射 -->
<!-- 每一个field映射着数据库中列与文档中的域,column是数据库列,name是solr的域(必须是在managed-schema文件中配置过的域才行) -->
<field column="id" name="id"/>
<field column="name" name="name"/>
<field column="password" name="password"/>
<field column="age" name="age"/>
</entity>
</document>
</dataConfig>
需要注意的是:
因为我简单搭建了一个实例,所以没有逻辑删除键,如果需要逻辑删除的话,可以通过deletedPkQuery来进行查询 例:
第二步:在solrHome\core\conf目录下的solrconfig.xml配置文件中引入data-config.xml文件。将下面的内容放到solrconfig.xml即可:
<requestHandler name="/dataimport" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
第三步:在solrHome下新建一个conf文件夹,创建一个dataimport.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,我这里是我自定义的core
syncCores=core
# solr server name or IP address
# [defaults to localhost if empty]
# 这个一般都是localhost不会变
server=localhost
# solr server port
# [defaults to 80 if empty]
# 安装solr的tomcat端口,如果你使用的是默认的端口,就不用改了,否则你懂的
port=8085
# application name/context
# [defaults to current ServletContextListener's context (app) name]
# 这里默认不改
webapp=solr
# URL params [mandatory]
# remainder of URL
# 这里要改成下面的形式
params=/dataimport?command=delta-import&clean=false&commit=true
# schedule interval
# [defaults to 30 if empty]
# 这里是设置定时任务的,单位是分钟,也就是多长时间你检测一次数据同步,根据项目需求修改
# 开始测试的时候为了方便看到效果,时间可以设置短一点,我这是60秒
interval=1
# 重做索引的时间间隔,单位分钟,默认7200,即5天;
# 为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=7200
# 重做索引的参数
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
# 重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
# 两种格式:2012-04-11 03:10:00 或者 03:10:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=03:10:00
第四步:需要引入jar包将solr-dataimportscheduler-1.0.jar , solr-dataimporthandler-5.0.0-.jar, solr-dataimporthandler-extras-5.0.0-.jar
放到Tomcat目录下webapps\solr\WEB-INF\lib的目录下面
百度网盘:链接:https://pan.baidu.com/s/1G_fsGlK8ut8ihF1vpek1rQ 密码:zko6
(刚开始使用apache-solr-dataimportscheduler用到的版本是1.1.1,因为版本不支持,不能使用,在启动tomcat的时候会报错,后来替换为1.0版本的jar以后可以使用。solr-dataimporthandler-5.0.0-.jar,solr-dataimporthandler-extras-5.0.0-.jar 包,需要和版本对应)
引入jar后,在Tomcat目录下webapps\solr\WEB-INF目录下的web.xml文件的servlet标签上添加下面的子标签。:
<listener>
<listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>
</listener>
注意:org.apache.solr.handler.dataimport.scheduler.ApplicationListener后千万不要有空格
配置完成以后,重启solr,在数据库中对数据进行操作的时候,如果索引库中发生了变化,说明配置完成