Search code examples
elasticsearch-7elasticsearch-java-api

Elasticsearch java client stopped supporting custom query type values, such as enum


Looks like there is a regression\change in Elasticsearch java client, it stopped supporting custom query type values, such as enum:

String query = QueryBuilders.boolQuery().
                must(QueryBuilders.termsQuery("status", 
                List.of(MyEnumStatus.ACTIVE, MyEnumStatus.UNDER_TEST))).toString();

The above example produced a json string query with java client 6.8.14 but gives below exception with 7.15.2, any workaround?

java.lang.IllegalArgumentException: can not write type [class ...$MyEnumStatus]
    at org.elasticsearch.common.io.stream.StreamOutput.writeGenericValue(StreamOutput.java:845)
    at org.elasticsearch.common.io.stream.StreamOutput.lambda$static$12(StreamOutput.java:699)
    at org.elasticsearch.common.io.stream.StreamOutput.writeGenericValue(StreamOutput.java:843)
    at org.elasticsearch.index.query.TermsQueryBuilder$Values.serialize(TermsQueryBuilder.java:435)
    at org.elasticsearch.index.query.TermsQueryBuilder$BinaryValues.<init>(TermsQueryBuilder.java:495)
    at org.elasticsearch.index.query.TermsQueryBuilder$BinaryValues.<init>(TermsQueryBuilder.java:485)
    at org.elasticsearch.index.query.TermsQueryBuilder.<init>(TermsQueryBuilder.java:161)
    at org.elasticsearch.index.query.QueryBuilders.termsQuery(QueryBuilders.java:590)

Solution

  • As per my understanding, it is JSON serialization issue. You can add toString() method to both the ENUM and it will resolve issue.

    String query = QueryBuilders.boolQuery().
                    must(QueryBuilders.termsQuery("status", 
                    List.of(MyEnumStatus.ACTIVE.toString(), MyEnumStatus.UNDER_TEST.toString()))).toString();