You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

解决方案

  1. 升级Lettuce Mod版本:优先升级到修复该Null值处理问题的最新稳定版,官方已记录该问题并可能在后续版本修复。
  2. 规避Null值字段:若无法升级,可临时调整查询语句,排除包含Null值的字段;或确保Redis中对应字段存储非Null值。
  3. 手动解析响应:绕过Lettuce的自动映射逻辑,手动遍历原始响应数组,按顺序匹配键值对,遇到"null"值时正确赋值。

内容的提问来源于stack exchange,提问作者JBourne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 13:17:05