Skip to content

CreateIndexRequest with raw JSON and "limit token count token filter" fails if optional parameter is missing #313

Closed
@slovdahl

Description

@slovdahl

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
                    }
                }
            }
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Area: SpecificationRelated to the API spec used to generate client code

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions