Solr从MongoDB增量导入失败求助(全量导入正常)
解决MongoDB到Solr增量导入失效的问题
结合你的文档结构和配置,我帮你梳理几个最可能导致增量导入失效的原因和对应的解决方案:
1. deltaImportQuery的_id类型不匹配问题
你的文档里_id是MongoDB的ObjectId类型,但当前配置的deltaImportQuery直接用字符串匹配:
deltaImportQuery="{'_id':'${dataimporter.delta._id}'}"
MongoDB中ObjectId字段无法和字符串直接匹配,这条查询根本查不到对应文档。你需要把查询语句改成用ObjectId()包裹变量:
deltaImportQuery="{'_id': ObjectId('${dataimporter.delta._id}')}"
2. deltaQuery的时间格式或语法问题
先确认两个关键点:
- 你的MongoDB中
updateDate是Date类型,不是字符串类型。可以在MongoDB shell中执行db.user.find({updateDate: {$type: 9}})验证(类型9对应Date),如果是字符串类型,日期比较会按字符串规则执行,完全不符合预期。 - 确保
${dih.last_index_time}的输出格式和updateDate的ISO8601格式完全一致(比如2016-01-05T09:47:18.511Z)。你可以手动在MongoDB中测试deltaQuery,把变量替换成上次全量导入的时间,看是否能查到更新的文档:
db.user.find({'updateDate': {$gt: ISODate('2016-01-01T00:00:00.000Z')}})
如果手动查询能返回数据,再检查Solr配置中的deltaQuery语法,确保符号和空格正确:
deltaQuery="{'updateDate': {'$gt': {'$date': '${dih.last_index_time}'}}}"
3. 检查Solr的last_index_time是否正确记录
Solr会把上次导入的时间存在conf/dataimport.properties文件里的dih.last_index_time字段。你可以打开这个文件,确认:
- 这个时间值确实是上次全量/增量导入的时间
- 时间格式和你的
updateDate完全一致(带Z后缀,毫秒精确)
如果这个值没有被正确更新,deltaQuery会一直查不到新数据。
4. 通过日志排查具体执行情况
在Solr Admin的Dataimport页面,开启Debug模式执行增量导入,然后查看Solr的日志(比如solr.log),你能看到实际执行的deltaQuery和deltaImportQuery语句:
- 确认deltaQuery返回了符合条件的文档ID
- 确认deltaImportQuery正确获取到了对应文档
如果日志里显示deltaQuery返回0条数据,那就是时间匹配或字段类型的问题;如果deltaQuery有返回但deltaImportQuery没拿到数据,那就是_id匹配的问题。
内容的提问来源于stack exchange,提问作者rahulchauhan
相关产品推荐
相关产品推荐

