Solr使用DIH导入SQL数据时dow系列字段未被索引问题求助
问题原因与解决方案
核心触发原因
- dataconfig.xml的entity标签语法错误:你提供的entity配置没有正确闭合开始标签,
cacheImpl="SortedMapBackedCache"后缺少>,DIH解析配置时会直接忽略该非法entity,无法执行对应查询拉取dow字段数据。 - SQL语句逻辑错误:你使用了
MAX聚合函数,但没有添加GROUP BY tl_id分组逻辑,绝大多数数据库开启ONLY_FULL_GROUP_BY模式时会直接报错,即使执行成功也只会返回1行不确定的结果,无法和对应event_id匹配;同时dow_2、dow_5的列计算没有加MAX聚合,分组场景下返回值不可控。 - 子实体字段未关联:你配置的
cacheLookup="ticket.event_id"说明这是一个关联父实体ticket的子实体,子实体的查询字段默认不会自动写入父文档,没有显式映射的情况下dow系列字段不会进入最终索引。 - 其他隐性问题:包括字段名大小写不匹配、SQL执行报错未在日志中发现、导入后未触发commit、数据库返回的布尔值和Solr的boolean类型不兼容等。
解决步骤
第一步:修正dataconfig.xml配置
修正后的entity配置如下:
<entity name="slot_data_sunday" dataSource="dineout" onError="skip" query="SELECT tl_id AS event_id, MAX(CASE WHEN (dow = 0) THEN TRUE ELSE FALSE END) AS dow_0, MAX(CASE WHEN (dow = 1) THEN TRUE ELSE FALSE END) AS dow_1, MAX(CASE WHEN (dow = 2) THEN TRUE ELSE FALSE END) AS dow_2, MAX(CASE WHEN (dow = 3) THEN TRUE ELSE FALSE END) AS dow_3, MAX(CASE WHEN (dow = 4) THEN TRUE ELSE FALSE END) AS dow_4, MAX(CASE WHEN (dow = 5) THEN TRUE ELSE FALSE END) AS dow_5, MAX(CASE WHEN (dow = 6) THEN TRUE ELSE FALSE END) AS dow_6 FROM ndf_ticket_slots GROUP BY tl_id" cacheKey="event_id" cacheLookup="ticket.event_id" cacheImpl="SortedMapBackedCache"> <!-- 显式添加字段映射,避免自动匹配失效 --> <field column="dow_0" name="dow_0" /> <field column="dow_1" name="dow_1" /> <field column="dow_2" name="dow_2" /> <field column="dow_3" name="dow_3" /> <field column="dow_4" name="dow_4" /> <field column="dow_5" name="dow_5" /> <field column="dow_6" name="dow_6" /> </entity>
主要修改点:
- 闭合entity开始标签,补充缺失的
> - SQL添加
GROUP BY tl_id分组逻辑 - 给dow_2、dow_5补充
MAX聚合 - 显式添加field映射关系,明确关联查询返回列和Solr schema字段
第二步:验证SQL有效性
直接在你的dineout数据源对应的数据库中执行上述修正后的SQL,确认可以正常返回结果,且dow_0到dow_6列存在、值符合预期。
第三步:排查导入日志
执行全量导入时添加debug=true参数,或者直接查看Solr服务日志,确认没有SQL执行报错、字段匹配错误、数据源连接错误等异常。
第四步:确认索引提交
导入操作结束后显式调用Solr的commit接口,或者确认导入参数中携带commit=true,避免未提交的变更无法查询到。
内容的提问来源于stack exchange,提问作者Anshul Verma
相关产品推荐
相关产品推荐

