项目场景:

今天在用java写代码查ES中数据的时候,出现了下面提示的错误,我排查了一会才发现问题

控制台提示

ElasticsearchStatusException[Elasticsearch exception [type=mapper_parsing_exception, reason=failed to parse field [location] of type [geo_point]]

]; nested: ElasticsearchException[Elasticsearch exception [type=parse_exception, reason=unsupported symbol [.] in geohash [30.871729121.81959]]]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=unsupported symbol [.] in geohash [30.871729121.81959]]];

at org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:176)

at org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:2011)

at org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:1988)

at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1745)

at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1702)

at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1672)

at org.elasticsearch.client.RestHighLevelClient.index(RestHighLevelClient.java:1029)

at com.woniu.EsDemoApplicationTests.insertDoc(EsDemoApplicationTests.java:115)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at

at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)

at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)

at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)

at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)

at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

Suppressed: org.elasticsearch.client.ResponseException: method [PUT], host [http://120.48.46.177:9200], URI [/hotel/_doc/45870?timeout=1m], status line [HTTP/1.1 400 Bad Request]

Warnings: [Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.16/security-minimal-setup.html to enable security.]

{"error":{"root_cause":[{"type":"parse_exception","reason":"unsupported symbol [.] in geohash [30.871729121.81959]"}],"type":"mapper_parsing_exception","reason":"failed to parse field [location] of type [geo_point]","caused_by":{"type":"parse_exception","reason":"unsupported symbol [.] in geohash [30.871729121.81959]","caused_by":{"type":"illegal_argument_exception","reason":"unsupported symbol [.] in geohash [30.871729121.81959]"}}},"status":400}

at org.elasticsearch.client.RestClient.convertResponse(RestClient.java:326)

at org.elasticsearch.client.RestClient.performRequest(RestClient.java:296)

at org.elasticsearch.client.RestClient.performRequest(RestClient.java:270)

at org.elasticsearch.client.RestHighLevelClient.performClientRequest(RestHighLevelClient.java:2082)

at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1732)

... 71 more

Caused by: ElasticsearchException[Elasticsearch exception [type=parse_exception, reason=unsupported symbol [.] in geohash [30.871729121.81959]]]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=unsupported symbol [.] in geohash [30.871729121.81959]]];

at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:485)

at org.elasticsearch.ElasticsearchException.fromXContent(ElasticsearchException.java:396)

at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:426)

at org.elasticsearch.ElasticsearchException.failureFromXContent(ElasticsearchException.java:592)

at org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:168)

... 74 more

Caused by: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=unsupported symbol [.] in geohash [30.871729121.81959]]]

at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:485)

at org.elasticsearch.ElasticsearchException.fromXContent(ElasticsearchException.java:396)

at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:426)

原因分析:

ES中地理坐标属性location的数据结构是(纬度,经度),而我在进行字符串拼接的时候后了中间的逗号,导致插入数据错误。下面就是上面那一段代码真正有用的部分。

真正错误原因:

{"error":{"root_cause":[{"type":"parse_exception","reason":"unsupported symbol [.] in

geohash [30.871729121.81959]"}],"type":"mapper_parsing_exception","reason":"failed to parse

field [location] of type [geo_point]","caused_by":{"type":"parse_exception","reason":"unsupported symbol [.] in geohash

[30.871729121.81959]","caused_by":

{"type":"illegal_argument_exception","reason":"unsupported symbol [.] in geohash

[30.871729121.81959]"}}},"status":400}

错误写法:

this.location = hotel.getLatitude()+hotel.getLongitude();

正确写法: 

this.location = hotel.getLatitude()+","+hotel.getLongitude();

解决方案:

字符串拼接前要多检查,并且(纬度,经度)这个顺序不能颠倒,不然可能会导致地理位置错误。

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: