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

使用Java Client时如何阻止ElasticSearch为文档添加转义字符

Elasticsearch Java Client 8.11 阻止双引号转义问题解决

问题描述

数据库返回的数组格式字符串为 ["Texas", "Texas", "Sidebet City"],使用以下代码将crawlingEntry对象插入Elasticsearch:

br.operations(op -> op
        .index(idx -> idx
                .index(tableName)
                .id(crawlingEntry.geturl_id())
                .document(crawlingEntry)
        )
);

插入后在Elasticsearch索引中得到的结果却带有转义字符:"[\"Texas\", \"Texas\", \"Sidebet City\"]"。注意crawlingEntry对象中的字符串本身是正常无转义的。

解决办法

问题核心是数据库返回的不是真正的Java数组/集合,而是JSON格式的字符串,Java Client会把它当成普通字符串处理,自然会转义双引号。解决思路是把这个JSON字符串解析成对应的数据结构,再存入ES:

方法一:解析JSON字符串为Java集合(推荐)

  1. 先将数据库返回的JSON字符串解析成List<String>类型(以Jackson为例):
ObjectMapper objectMapper = new ObjectMapper();
// dbReturnedString 是数据库返回的JSON格式字符串
List<String> targetList = objectMapper.readValue(dbReturnedString, new TypeReference<List<String>>() {});
  1. 修改crawlingEntry实体类,将对应字段的类型从String改为List<String>,并设置解析后的集合:
// 实体类中的字段定义
private List<String> locations;

// 赋值
crawlingEntry.setLocations(targetList);
  1. 再用原代码插入文档,此时Java Client会把List<String>序列化为Elasticsearch的数组类型,最终索引中的结果就是正常的数组结构,不会有转义字符。

方法二:手动构建JSON节点插入

如果不想修改实体类字段类型,可以直接构建JSON节点插入,绕过实体类的自动序列化:

ObjectMapper objectMapper = new ObjectMapper();
// 将crawlingEntry转为JSON字符串后,修改对应字段的值
String rawJson = objectMapper.writeValueAsString(crawlingEntry);
JsonNode jsonNode = objectMapper.readTree(rawJson);
// 替换目标字段为解析后的数组节点
JsonNode arrayNode = objectMapper.readTree(dbReturnedString);
ObjectNode objectNode = (ObjectNode) jsonNode;
objectNode.set("targetFieldName", arrayNode);

// 使用json方法插入节点
br.operations(op -> op
        .index(idx -> idx
                .index(tableName)
                .id(crawlingEntry.geturl_id())
                .json(objectNode)
        )
);

内容的提问来源于stack exchange,提问作者Jan Peters-Anders

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:47:03