es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El cliente de Elasticsearch para Java ha dejado de admitir valores de tipo de consulta personalizados, como enum.

Parece que hay una regresión/cambio en el cliente de Elasticsearch para Java, dejó de admitir valores de tipo de consulta personalizados, como enum:

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

El ejemplo anterior produjo una cadena de consulta JSON con el cliente de Java 6.8.14, pero genera la siguiente excepción con la versión 7.15.2, ¿alguna solución alternativa?

java.lang.IllegalArgumentException: no se puede escribir el tipo [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)
Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que con el cliente de Elasticsearch en java 7.15.2, los valores personalizados de los enums no son compatibles en TermsQueryBuilder. Sin embargo, hay algunas soluciones disponibles para superar esta limitación:

    1. Usar valores de texto en lugar de valores de enum: Puedes definir tus valores de enum como cadenas de texto y utilizarlos en el TermsQueryBuilder. Por ejemplo:
    String query = QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("status",
        List.of("ACTIVE", "UNDER_TEST"))).toString();
    
    1. Usar una consulta de Script: Otra forma de manejar esto es utilizando una consulta de Script. Puedes definir tu lógica de consulta personalizada en un script y pasarlo al ScriptQueryBuilder. Por ejemplo:
    String script = """
        params._source.status == 'ACTIVE' || params._source.status == 'UNDER_TEST'
    """;
    
    String query = QueryBuilders.boolQuery().must(QueryBuilders.scriptQuery(
        new Script(script, Script.DEFAULT_SCRIPT_TYPE, null, null))).toString();
    

    Estos son solo un par de ejemplos de cómo solucionar el problema/cambio en el cliente de Elasticsearch en java. Sin embargo, dependiendo de tu caso de uso, puede haber otras soluciones viables.

Comments are closed.