使用Lettuce Mod执行FT.SEARCH时的Null值处理与键值错位问题求助
Redis JSON + Lettuce Mod FT.SEARCH 键值对错位问题(Null值处理异常)
问题场景
在Redis JSON中使用Lettuce Mod实现FT.SEARCH命令,原始查询语句:
FT.SEARCH idx:accountproject '@siteId:[1 1] @status:{A} @premises:{ON}' RETURN 9 id accountId siteId addressAddress1 addressAddress2 addressCity addressStateProvince addressPostalCode addressCountry LIMIT 0 1
原生Redis返回结果(正常)
1) "4391" 2) "accpro:100" 3) 1) "id" 2) "100" 3) "accountId" 4) "500" 5) "siteId" 6) "1" 7) "addressAddress1" 8) "6******" 9) "addressAddress2" 10) "null" 11) "addressCity" 12) "F******" 13) "addressStateProvince" 14) "FL" 15) "addressPostalCode" 16) "33351" 17) "addressCountry" 18) "null"
Lettuce执行返回结果(异常)
键值对出现错位,例如addressAddress2的值被错误映射为addressCity:
{id=100, accountId=500, siteId=1, addressAddress1=6*****, addressAddress2=addressCity, F********=addressStateProvince, FL=addressPostalCode, 33351=addressCountry}
问题原因
经排查,该异常由Lettuce库对Null值的处理逻辑缺陷导致。
客户端配置
final RedisURIBuilder uriBuilder = new RedisURIBuilder() .host(host) .port(port) .password(password); RedisModulesClient redisModulesClient = RedisModulesClient.create(uriBuilder.build()); redisModulesClient.setOptions( ClientOptions.builder() .timeoutOptions( TimeoutOptions.builder().timeoutCommands(true).fixedTimeout(commandTimeOut).build()) .protocolVersion(ProtocolVersion.RESP2) .socketOptions(SocketOptions.builder().connectTimeout(connectionTimeOut).build()) .build());
Redis索引定义
FT.CREATE idx:accountproject ON JSON PREFIX 1 accpro: SCHEMA $.id AS id TAG $.accountId AS accountId NUMERIC SORTABLE $.siteId AS siteId NUMERIC SORTABLE $.status AS status TAG SORTABLE $.premises AS premises TAG SORTABLE $.accountType AS accountType TAG SORTABLE $.location.coordinates AS locationCoordinates NUMERIC $.location.type AS locationType TAG $.address.address1 AS addressAddress1 TAG $.address.address2 AS addressAddress2 TAG $.address.city AS addressCity TAG $.address.stateProvince AS addressStateProvince TAG $.address.postalCode AS addressPostalCode TAG $.address.country AS addressCountry TAG
使用版本
- Lettuce mod:4.1.0
- Lettuce core:6.3.2.RELEASE
解决方案
- 升级Lettuce Mod版本:优先升级到修复该Null值处理问题的最新稳定版,官方已记录该问题并可能在后续版本修复。
- 规避Null值字段:若无法升级,可临时调整查询语句,排除包含Null值的字段;或确保Redis中对应字段存储非Null值。
- 手动解析响应:绕过Lettuce的自动映射逻辑,手动遍历原始响应数组,按顺序匹配键值对,遇到"null"值时正确赋值。
内容的提问来源于stack exchange,提问作者JBourne
相关产品推荐
相关产品推荐

