Hi,
Since we have a large Java Client codebase, our migration to 8.x Java Client would take time and as intermediary solution, we are constrained to use Elasticsearch 7.17.x client in combination with 8.10.0 server
I am trying to get Elasticsearch 7.17 Java RestHighLevelClient to talk to Elasticsearch 8.10.0 Server. As recommended by the document, I am using the setApiCompatibility(true)
- https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-compatibility.html
Below is the code which I tried testing using
Client Libraries version 7.17.0
Server Version 8.10.0
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RestHighLevelClientBuilder;
import org.elasticsearch.xcontent.XContentType;
import java.io.IOException;
public class TestESPutMapping {
public static void main(String[] args) {
RestClient client1 = RestClient.builder(new HttpHost("localhost", 9200, "http")).build();
RestHighLevelClient client = new RestHighLevelClientBuilder(client1).setApiCompatibilityMode(true).build();
try {
String indexName = "elasticsearch-sql_test_index_account";
// Create mapping JSON
String dataMapping = "{\n" +
" \"properties\": {\n" +
" \"gender\": {\n" +
" \"type\": \"text\"\n" +
" }," +
" \"address\": {\n" +
" \"type\": \"text\"\n" +
" }," +
" \"state\": {\n" +
" \"type\": \"text\"\n" +
" }" +
" }"+
" }";
// Create put mapping request
PutMappingRequest putMappingRequest = new PutMappingRequest(indexName)
.source(dataMapping, XContentType.JSON).type("_doc");
// Update mapping
AcknowledgedResponse putMappingResponse = client.indices().putMapping(putMappingRequest, RequestOptions.DEFAULT);
boolean acknowledged = putMappingResponse.isAcknowledged();
System.out.println("Mapping update acknowledged: " + acknowledged);
} catch (IOException e) {
e.printStackTrace();
}
}
}
With above code,
- if I remove
.type("_doc")
inPutMappingRequest
, I get below exception
Exception in thread "main" org.elasticsearch.action.ActionRequestValidationException: Validation Failed: 1: mapping type is missing;
at org.elasticsearch.action.ValidateActions.addValidationError(ValidateActions.java:15)
at org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest.validate(PutMappingRequest.java:118)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:2133)
at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:2105)
at org.elasticsearch.client.IndicesClient.putMapping(IndicesClient.java:490)
at org.nlpcn.es4sql.TestESPutMapping.main(TestESPutMapping.java:43)
- With same code if I retain
.type("_doc")
, I get below exception
Exception in thread "main" ElasticsearchStatusException[Elasticsearch exception [type=mapper_parsing_exception, reason=Failed to parse mapping: Root mapping definition has unsupported parameters: [address : {type=text}] [gender : {type=text}] [state : {type=text}]]]; nested: ElasticsearchException[Elasticsearch exception [type=mapper_parsing_exception, reason=Root mapping definition has unsupported parameters: [address : {type=text}] [gender : {type=text}] [state : {type=text}]]];
at org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:178)
at org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:2484)
at org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:2461)
at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:2184)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:2137)
at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:2105)
at org.elasticsearch.client.IndicesClient.putMapping(IndicesClient.java:490)
at org.nlpcn.es4sql.TestESPutMapping.main(TestESPutMapping.java:43)
Suppressed: org.elasticsearch.client.ResponseException: method [PUT], host [http://localhost:9200], URI [/elasticsearch-sql_test_index_account/_mapping/_doc?master_timeout=30s&include_type_name=true&timeout=30s], status line [HTTP/1.1 400 Bad Request]
Warnings: [[types removal] Specifying types in put mapping request is deprecated. Use typeless api instead]
Clarifications :
- Is
.type("_doc")
mandatory in above code - What is wrong with above simple mapping ? (formatted json as below to declutter escape chars)
{
"properties": {
"gender": {
"type": "text"
},
"address": {
"type": "text"
},
"state": {
"type": "text"
}
}
}
Kindly let me know if I am missing something grossly.
Regards
Muthu