Closed
Description
Java API client version
7.17.4
Java version
1.8.0_332
Elasticsearch Version
7.17.4
Problem description
We have index mappings stored as JSON files and have successfully used RestHighLevelClient
like this:
CreateIndexRequest request = new CreateIndexRequest("test")
.source(mappingJson, XContentType.JSON);
client.indices().create(request, RequestOptions.DEFAULT);
We're now trying to migrate away from RestHighLevelClient
to something like this:
client.indices()
.create(
createIndexBuilder -> createIndexBuilder
.index("test")
.withJson(new ByteArrayInputStream(mappingJson.getBytes(StandardCharsets.UTF_8)))
);
But with the JSON below, we get an exception like this:
Caused by:
co.elastic.clients.json.JsonpMappingException: Error deserializing co.elastic.clients.elasticsearch._types.analysis.TokenFilterDefinition: co.elastic.clients.util.MissingRequiredPropertyException: Missing required property 'LimitTokenCountTokenFilter.consumeAllTokens' (JSON path: settings.index.analysis.filter.one_token_limit) (line no=1, column no=10226, offset=10225)
at co.elastic.clients.json.JsonpMappingException.from0(JsonpMappingException.java:134)
at co.elastic.clients.json.JsonpMappingException.from(JsonpMappingException.java:121)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:206)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:136)
at co.elastic.clients.json.BuildFunctionDeserializer.deserialize(BuildFunctionDeserializer.java:53)
at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:48)
at co.elastic.clients.json.UnionDeserializer$SingleMemberHandler.deserialize(UnionDeserializer.java:74)
at co.elastic.clients.json.UnionDeserializer.deserialize(UnionDeserializer.java:291)
at co.elastic.clients.json.UnionDeserializer.deserialize(UnionDeserializer.java:258)
at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43)
at co.elastic.clients.json.JsonpDeserializerBase$StringMapDeserializer.deserialize(JsonpDeserializerBase.java:347)
at co.elastic.clients.json.JsonpDeserializerBase$StringMapDeserializer.deserialize(JsonpDeserializerBase.java:331)
at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:75)
at co.elastic.clients.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:71)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:180)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:136)
at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:75)
at co.elastic.clients.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:79)
at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43)
at co.elastic.clients.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:71)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:180)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:136)
at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:75)
at co.elastic.clients.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:79)
at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43)
at co.elastic.clients.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:71)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:180)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:136)
at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:75)
at co.elastic.clients.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:79)
at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43)
at co.elastic.clients.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:71)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:180)
at co.elastic.clients.util.WithJsonObjectBuilderBase.withJson(WithJsonObjectBuilderBase.java:66)
at co.elastic.clients.json.WithJson.withJson(WithJson.java:43)
at test.ElasticsearchMappingUtil.lambda$createIndices$5(ElasticsearchMappingUtil.java:121)
at co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesAsyncClient.create(ElasticsearchIndicesAsyncClient.java:284)
at test.ElasticsearchMappingUtil.createIndices(ElasticsearchMappingUtil.java:118)
... 2 more
Caused by:
co.elastic.clients.util.MissingRequiredPropertyException: Missing required property 'LimitTokenCountTokenFilter.consumeAllTokens'
at co.elastic.clients.util.ApiTypeHelper.requireNonNull(ApiTypeHelper.java:76)
at co.elastic.clients.elasticsearch._types.analysis.LimitTokenCountTokenFilter.<init>(LimitTokenCountTokenFilter.java:58)
at co.elastic.clients.elasticsearch._types.analysis.LimitTokenCountTokenFilter.<init>(LimitTokenCountTokenFilter.java:48)
at co.elastic.clients.elasticsearch._types.analysis.LimitTokenCountTokenFilter$Builder.build(LimitTokenCountTokenFilter.java:144)
at co.elastic.clients.elasticsearch._types.analysis.LimitTokenCountTokenFilter$Builder.build(LimitTokenCountTokenFilter.java:107)
at co.elastic.clients.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:80)
at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43)
at co.elastic.clients.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:71)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:197)
... 38 more
Even though the documentation on https://www.elastic.co/guide/en/elasticsearch/reference/7.17/analysis-limit-token-count-tokenfilter.html#analysis-limit-token-count-tokenfilter-configure-parms states that consume_all_tokens
is optional. It works fine if "consume_all_tokens": false
is added to the one_token_limit
filter.
This is a stripped down mapping JSON that fails:
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
}
},
"dynamic_templates": [
{
"metadata_title_en": {
"path_match": "metadata.en.title",
"mapping": {
"type": "text",
"fields": {
"first_word": {
"type": "text",
"fielddata": true,
"analyzer": "first_word",
"search_analyzer": "standard"
}
}
}
}
}
]
},
"settings": {
"index": {
"analysis": {
"analyzer": {
"first_word": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"one_token_limit"
]
}
},
"normalizer": {
"lowercase": {
"type": "custom",
"filter": [
"lowercase"
]
}
},
"filter": {
"one_token_limit": {
"type": "limit",
"max_token_count": 1
}
}
}
}
}
}