Search code examples
elasticsearchelasticsearch-dsl

issues while converting ES query to java Code


i am trying to convert below ES query which is working in console to Java Code

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "ID.keyword": "1234457654"
          }
        },
        {
          "bool": {
            "should": [
              {"match": {
                "stepName.keyword": "STEP1"
              }},
              {"match": {
                "stepName.keyword": "STEP2"
              }}
            ]
            
          }
        }
      ]
    }
  }
}

Java code which i tried

QueryBuilder qb = QueryBuilders.boolQuery().
must(QueryBuilders.matchQuery("ID.keyword", transformedDataDTO.getID()).operator(Operator.AND)).
should(QueryBuilders.matchQuery("stepName.keyword", transformedDataDTO.getStepName()))
   .should(QueryBuilders.matchQuery("stepName.keyword", MigrationStatusEnum.getPreviousData(transformedDataDTO.getStepName())));

instead of returning data matching to step1 or step2 it returns all the data

Please suggest what is missing in above java code or how to fix it.


Solution

  • I would suggest a different approach since you're doing an exact match on stepName.keyword, why not using terms (which has implicit OR semantics), and your query simply becomes:

    {
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "ID.keyword": "1234457654"
              }
            },
            {
              "terms": {
                "stepName.keyword": [
                  "STEP1",
                  "STEP2"
                ]
              }
            }
          ]
        }
      }
    }
    

    Translated to Java:

    QueryBuilder qb = QueryBuilders.boolQuery()
       .filter(QueryBuilders.termQuery("ID.keyword", transformedDataDTO.getID()))
       .filter(QueryBuilders.termsQuery("stepName.keyword", transformedDataDTO.getStepName(), MigrationStatusEnum.getPreviousData(transformedDataDTO.getStepName())));