Elasticsearch rest client查询中文失效
环境
elasticsearch 7.8.0
jdk 1.8
elasticsearch-rest-client-sniffer 7.0.0
问题
url:
GET /some_index/_search?from=0&size=10
body:
{
"query": {
"bool": {
"must": [
{
"range": {
"@timestamp": {
"from": "2020-09-07T12:26:03.109Z",
"to": "2020-09-07T13:26:03.109Z"
}
}
},
{
"match": {
"field1.keyword": "some_name"
}
},
{
"query_string": {
"query": "*成功*",
"fields": [
"field2.*"
]
}
}
]
}
}
}
即从some_index中查询出10条数据,这些数据满足:
- 时间在2020-09-07T12:26:03.109Z到2020-09-07T13:26:03.109Z之间
- field1不分词精确匹配some_name
- field2是一个对象,里面有很多字段,这些字段中任意一个字段包含“成功”这两个汉字
在postman、head、kibana等工具中查询都能有正确结果,但是使用java rest client查询出的结果却和直接访问rest api的结果不一致。
排查
-
打开debug日志,查看rest client调用rest api的日志,然后和post man以及kibana对比,发现有一处不一致
项目 postman kibana java rest client method GET GET GET url /some_index/_search… /some_index/_search… /some_index/_search… content-type application/json application/json plain/text -
问题很明显,content-type不一致,检查java代码:
Response response = restClient.performRequest(httpMethodName, url, new HashMap<>(4), new StringEntity(queryJsonString), new BasicHeader("Content-Type", "application/json"));
debug到performRequest方法内部,经过一次转换后,header并没有生效,反而是直接使用了StringEntity的默认Content-Type,StringEntity的默认Content-Type=text/plain。
解决
Response response = restClient.performRequest(
httpMethodName,
url,
new HashMap<>(4),
new StringEntity(queryJsonString, ContentType.APPLICATION_JSON));
重新访问,问题解决。