elastic / elasticsearch-java

Official Elasticsearch Java Client
Apache License 2.0
394 stars 226 forks source link

Snowball token filter with default language breaks `indices.get()` #826

Open fabriziofortino opened 1 month ago

fabriziofortino commented 1 month ago

Java API client version

8.13.4

Java version

17

Elasticsearch Version

8.13.4

Problem description

I have an index using an analyzer that contains a snowball token filter without specifying the language. This should default to English.

  "snowball_4": {
    "type": "snowball"
  }

indices.get() request fails with the following Exception:

Exception in thread "main" co.elastic.clients.transport.TransportException: node: https://es-host/, status: 200, [es/indices.get] Failed to decode response
        at co.elastic.clients.transport.ElasticsearchTransportBase.decodeTransportResponse(ElasticsearchTransportBase.java:404)
        at co.elastic.clients.transport.ElasticsearchTransportBase.getApiResponse(ElasticsearchTransportBase.java:363)
        at co.elastic.clients.transport.ElasticsearchTransportBase.performRequest(ElasticsearchTransportBase.java:147)
        at co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient.get(ElasticsearchIndicesClient.java:965)
        at co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient.get(ElasticsearchIndicesClient.java:981)
Caused by: co.elastic.clients.json.JsonpMappingException: Error deserializing co.elastic.clients.elasticsearch._types.analysis.TokenFilterDefinition: co.elastic.clients.util.MissingRequiredPropertyException: Missing required property 'SnowballTokenFilter.language' (JSON path: ['my-index'].settings.index.analysis.filter.snowball_4) (line no=1, column no=13286, offset=-1)
        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:218)
        at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:148)
        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:75)
        at co.elastic.clients.json.UnionDeserializer.deserialize(UnionDeserializer.java:304)
        at co.elastic.clients.json.UnionDeserializer.deserialize(UnionDeserializer.java:259)
        at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43)
        at co.elastic.clients.json.JsonpDeserializerBase$StringMapDeserializer.deserialize(JsonpDeserializerBase.java:349)
        at co.elastic.clients.json.JsonpDeserializerBase$StringMapDeserializer.deserialize(JsonpDeserializerBase.java:333)
        at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:77)
        at co.elastic.clients.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:78)
        at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:192)
        at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:148)
        at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:77)
        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:78)
        at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:192)
        at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:148)
        at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:77)
        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:78)
        at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:192)
        at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:148)
        at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:77)
        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:78)
        at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:192)
        at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:148)
        at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:77)
        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.JsonpDeserializerBase$StringMapDeserializer.deserialize(JsonpDeserializerBase.java:349)
        at co.elastic.clients.json.JsonpDeserializerBase$StringMapDeserializer.deserialize(JsonpDeserializerBase.java:333)
        at co.elastic.clients.elasticsearch.indices.GetIndexResponse.lambda$createGetIndexResponseDeserializer$0(GetIndexResponse.java:184)
        at co.elastic.clients.json.JsonpDeserializer$3.deserialize(JsonpDeserializer.java:136)
        at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:77)
        at co.elastic.clients.transport.ElasticsearchTransportBase.decodeTransportResponse(ElasticsearchTransportBase.java:399)
        ... 16 more
Caused by: co.elastic.clients.util.MissingRequiredPropertyException: Missing required property 'SnowballTokenFilter.language'
        at co.elastic.clients.util.ApiTypeHelper.requireNonNull(ApiTypeHelper.java:76)
        at co.elastic.clients.elasticsearch._types.analysis.SnowballTokenFilter.<init>(SnowballTokenFilter.java:66)
        at co.elastic.clients.elasticsearch._types.analysis.SnowballTokenFilter.<init>(SnowballTokenFilter.java:58)
        at co.elastic.clients.elasticsearch._types.analysis.SnowballTokenFilter$Builder.build(SnowballTokenFilter.java:131)
        at co.elastic.clients.elasticsearch._types.analysis.SnowballTokenFilter$Builder.build(SnowballTokenFilter.java:104)
        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:78)
        at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:209)
        ... 56 more
l-trotta commented 1 month ago

Hello, thank you for reporting this! Yes the language field should be optional, we'll fix this in the API specification used to produce the Java code and then regenerate the client.