methodinvocation
methodinvocation

Reputation: 69

ElasticSearch get data with one value but from multiple places

I have structure something like this:

{
   id: "someId",
   age: "15",
   metadata: {
      otherId: "someOtherId"
   }
}

and i need to create query builder to get all objects where my dto.providedId == id or dto.providedId == metadata.otherId,

I try do it in this way:

if(dto.getProvidedId() != null){
            BoolQueryBuilder boolQueryBuilder= new BoolQueryBuilder();
            boolQueryBuilder.must(QueryBuilders.termQuery("id.keyword", dto.getProvidedId()));
            boolQueryBuilder.must(QueryBuilders.termQuery("metadata.otherId", dto.getProvidedId()));
}

but it return me empty array and I don't know why :(

can someone tell me how to do this?

{
  "index": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "custom",
          "filter": [
            "lowercase"
          ],
          "tokenizer": "whitespace"
        }
      }
    }
  }
}

thanks for any help

Upvotes: 2

Views: 172

Answers (1)

Val
Val

Reputation: 217474

If you need OR semantics, then you need to use should instead of `must``

        BoolQueryBuilder boolQueryBuilder= new BoolQueryBuilder();
        boolQueryBuilder.minimumShouldMatch(1);
        boolQueryBuilder.should(QueryBuilders.termQuery("id.keyword", dto.getProvidedId()));
        boolQueryBuilder.should(QueryBuilders.termQuery("metadata.otherId", dto.getProvidedId()));

Also make sure to check if metadata.otherId should not be metadata.otherId.keyword.

Upvotes: 4

Related Questions