「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」
1、前言
在上一篇的分享中(Solr应用总结(一) - 掘金 (juejin.cn)),我为大家介绍了solr的安装以及core的创建,本篇就继续分享下如何向solr中全/增量同步数据。
2、全量更新
首先,我们可以通过solr控制台,选中对应的core -> dataimport -> full-import -> 选中commit即可。成功后即返回:
可以看到新增/更新了两个文档,删除的文档这里有4360个,其实并没有从solr里删掉这么多,这是数据库里符合删除条件的数据。
"responseHeader":{
"status":0,
"QTime":4},
"initArgs":[
"defaults",[
"config","dataConfig.xml"]],
"command":"delta-import",
"status":"idle",
"importResponse":"",
"statusMessages":{
"Total Requests made to DataSource":"4",
//数据库中所有检索的数据
"Total Rows Fetched":"4364",
"Total Documents Processed":"2",
"Total Documents Skipped":"0",
"Delta Dump started":"2022-02-14 02:48:10",
"Identifying Delta":"2022-02-14 02:48:10",
"Deltas Obtained":"2022-02-14 02:48:10",
"Building documents":"2022-02-14 02:48:10",
"Total Changed Documents":"2",
"":"Indexing completed. Added/Updated: 2 documents. Deleted 4360 documents.",
"Committed":"2022-02-14 02:48:10",
"Time taken":"0:0:0.132"}}
除了上述方式,也可以通过访问solr的API来完成:
curl http://127.0.0.1:8983/solr/test_core/dataimport?command=full-import&clean=false&commit=true
3、增量更新
在正式的线上环境,用全量更新肯定是不现实的,因为数据量逐渐增大,solr重建索引的时间也会逐渐增大,使用增量更新需要索引的数据就很有必要,那么下面就为大家介绍下具体实现:
1、增量更新需要更改dataConfig中的数据查询SQL
<dataConfig>
<dataSource
driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://192.168.1.192;DatabaseName=test"
user="test" password="test"/>
<document>
<entity name="creator_search" query="select hyh_common_info_id, nickname, type, photo_url from common_info where check_state = 1" deltaImportQuery = "select common_info_id, nickname, type, photo_url from common_info where common_info_id = '${dataimporter.delta.common_info_id}'"
deltaQuery = "SELECT common_info_id FROM common_info where check_time > '${dataimporter.last_index_time}' and check_state = 1"
deletedPkQuery = "SELECT common_info_id FROM common_info where check_state != 1">
<field name="common_info_id" column="common_info_id" />
<field name="nickname" column="nickname" />
<field name="type" column="type"/>
<field name="photo_url" column="photo_url"/>
</entity>
</document>
</dataConfig>
这里增加了deltaImportQuery、deltaQuery、deletedPkQuery三个属性;
deltaImportQuery中的SQL查询出来的是需要更新(增、删、改)到solr的数据,根据指定的主键当作查询条件。${dataimporter.delta.common_info_id}指的是deltaQuery与deletedPkQuery返回的数据。
deltaQuery中就是查询需要增加、更新的数据的主键,这里数据库表中一定要有一个时间列,这样可以区分solr中的数据是否最新的。${dataimporter.last_index_time}指的是该core最后一次更新时间。
deletedPkQuery中就是那些需要从solr中删除的数据,比如说原来有一篇文章被下架了,对应的也要在solr中删除掉。
最后,配置完上述必要信息后,就可以通过crontabde形式定时执行了,当然也可以更改solr的web.xml配置文件增加监听来定时执行。我这里就一台服务器,就先这样了(PS:定时任务执行完后,可以在Query里查询下所有数据,验证是否更新成功,一般没成功的都是SQL语句有问题,可以在solr/server/log中查看对应日志解决)。
#编辑定时任务
crontab -e
#添加定时任务
#每天凌晨1点更新作者信息
00 1 * * * curl http://127.0.0.1:8983/solr/test_core/dataimport?command=delta-import&clean=false&commit=true
linux中的cron表达式与Java中的还不太一样,大家可以参考这个网站(crontab执行时间计算 - 在线工具 (tool.lu)),来确认表达式是否正确。好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊