问题描述
在弹性搜索中插入带有“/”的字段值时出现异常
代码:
String id = "/EACVBSDSFASFA";
IndexRequest indexRequest = new IndexRequest(INDEX,TYPE,id).source(objectsMap);
IndexResponse indexResponse = restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);
异常:
Path part [/EACVBSDSFASFA] Couldn't be encoded: java.lang.IllegalArgumentException
java.lang.IllegalArgumentException: Path part [/EACVBSDSFASFA] Couldn't be encoded
at org.elasticsearch.client.RequestConverters$EndpointBuilder.encodePart(RequestConverters.java:1142)
at org.elasticsearch.client.RequestConverters$EndpointBuilder.addpathPart(RequestConverters.java:1104)
at org.elasticsearch.client.RequestConverters.endpoint(RequestConverters.java:704)
at org.elasticsearch.client.RequestConverters.index(RequestConverters.java:309)
at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1761)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1735)
at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1697)
at org.elasticsearch.client.RestHighLevelClient.index(RestHighLevelClient.java:929)
at
.....
.....
Caused by: java.net.URISyntaxException: Illegal character in port number at index 30:
解决方法
问题不是因为字段,而是因为您使用 /
作为 ID 的一部分。
我猜这是一个限制,以防止必须对 ID 进行编码的资源,例如http://localhost:9200/index/_type/%2FEACVBSDSFASFA,注意 /
-> %2F
转换。
在任何情况下 - 首选网址安全 ID,例如:
- 增量 ID
- GUID
- 如果您想使用 base64 ID,请使用它的 base64url 版本 - https://en.wikipedia.org/wiki/Base64#URL_applications 其中
+
、=
、/
替换为 URI 安全字符。立>