Apache Solr全量导入仅获取半数MySQL视图记录问题咨询
Solr全量导入记录数少于MySQL视图计数的可能原因
以下是该类无报错缺数问题的高频触发原因,按排查优先级排序:
- 唯一键重复导致文档被覆盖
这是占比最高的诱因。Solr写入时如果配置的uniqueKey(唯一主键字段)从视图中取到的值存在重复,后读取的记录会直接覆盖先写入的同ID文档,整个写入过程不会抛出任何错误。你可以直接在MySQL中对视图执行count(distinct 你配置的Solr唯一键字段)统计,如果结果刚好等于Solr侧最终索引的56428条,即可定位是该问题——通常是视图的多表关联逻辑存在缺陷,导致本应唯一的主键出现重复值。 - 跨会话数据快照不一致
如果你在phpMyAdmin执行count(*)统计和触发Solr全量导入的时间点存在间隔,且视图依赖的底层表在间隔期内发生过删除、更新操作,两个独立数据库会话的事务隔离机制会导致读取到的数据集不一致。MySQL InnoDB引擎默认的REPEATABLE READ隔离级别下,每个会话启动时会拿到独立的数据快照,两个会话的统计结果本来就可能存在差异。你可以先核对两个操作的时间差,同时检查Solr JDBC连接串中是否配置了自定义事务隔离级别的参数。 - JDBC流读取结果集被静默截断
你设置batchSize=-1的目的是让MySQL JDBC驱动逐行流式返回结果,避免全量数据加载到内存导致OOM,但多数MySQL JDBC驱动版本中,该参数必须搭配连接串配置useCursorFetch=true才能正常生效,配置不匹配时可能出现结果集读取到一半就被驱动判定为读取结束的问题,且不会抛出SQL异常。此外还要检查JDBC连接的socketTimeout配置、Solr侧的数据导入超时配置,如果读取中途数据库连接被静默回收,Solr的数据导入处理器会默认数据已全部拉取完成,不会打印错误日志。 - 视图逻辑存在非确定性或隐式匹配问题
检查视图的创建语句:如果用到了RAND()、NOW()、会话用户变量这类非确定性函数,不同会话执行视图查询本身就可能返回不同的结果集;如果视图是多表关联结构,要检查联表条件字段的字符集、排序规则是否一致,隐式类型转换会导致部分关联结果丢失,另外一对多关联未做去重处理也可能导致不同执行场景下返回行数存在差异。你可以使用和Solr JDBC配置完全相同的数据库账号、连接参数,在命令行拉取视图全量数据做计数,和phpMyAdmin的统计结果做对比,先排除数据库侧返回结果不一致的问题。 - DIH配置存在隐式过滤/跳过逻辑
检查Solr数据导入处理器(DIH)的配置文件,确认查询实体(entity)节点下没有残留的全量查询过滤条件,同时检查配置的转换器(transformer)逻辑——如果写了字段为空就跳过当前行、或者不符合特定规则就丢弃记录的逻辑,执行时不会打印任何错误提示,只会默默跳过符合跳过规则的记录。
内容的提问来源于stack exchange,提问作者Swissdude
相关产品推荐
相关产品推荐

