Solr Data Handler导入后文档丢失及ID前缀处理问题求助
Solr 8.7.0 Data Handler MySQLi导入数据时实体文档被覆盖的问题解决
问题背景
我部署了Solr 8.7.0,用Data Handler插件通过MySQLi连接导入数据,配置了author、source、copy、tune四个实体,遇到了两个头疼的问题:
- 全量导入时日志显示成功添加/更新2357条文档(和四类实体总数完全一致),但查询结果里只返回1938条
tune实体的文档,其他三类实体的文档全没了; - 单独逐个导入实体时,每次导入
tune之后,之前导入的其他实体文档就被覆盖了,全程日志连个报错都没有,排查起来特别费劲。
问题根因
折腾了半天终于搞明白,是跨实体的ID重复冲突搞的鬼:不同实体对应的数据库表中,存在数值相同的id字段值,而Solr默认用数据库的id作为自身唯一主键字段id。当后续导入的实体文档id和已存在的文档id重复时,Solr会直接覆盖原有文档——这就解释了全量导入后只剩tune实体(因为它是最后导入的),单独导入时也会覆盖之前文档的现象。
中间尝试的踩坑过程
一开始我想的是给不同实体的ID加前缀避免重复,比如把tune实体的Solr id设置成CONCAT('tune_', id)。结果新问题又来了:关联查询里用${tune.id}的时候,这个值带了前缀,和其他实体关联的原始数据库id不匹配,直接导致关联查询失效。
我试过用REPLACE函数把前缀去掉,也试过用变量传递原始ID,但要么语法报错,要么逻辑不生效,这条路走不通。
最终可行的解决方法
最后我换了个思路,在tune实体的查询语句里同时保留两个ID相关字段:
- 把带前缀的ID作为Solr的
id字段,彻底解决跨实体ID重复覆盖的问题; - 把数据库原始的
id保存为一个新的自定义字段,比如this_tune_id,专门用来做关联查询。
示例的查询语句大概是这样:
SELECT CONCAT('tune_', id) AS id, id AS this_tune_id, title, content FROM tune
之后在关联查询中,改用${tune.this_tune_id}来关联其他实体的原始id,既解决了ID重复覆盖的核心问题,又保证了关联查询能正常运行,完美解决了我的困境。
内容的提问来源于stack exchange,提问作者HBMCS
相关产品推荐
相关产品推荐

