Elasticsearch multiple condition query using java api

11,483

You don't want to use MultiSearchRequestBuilder, you simply need to combine your three constraints in a bool/filter query:

BoolQueryBuilder query = QueryBuilders.boolQuery()
   .filter(QueryBuilders.termsQuery("department", departments))
   .filter(QueryBuilders.termsQuery("job", jobs))
   .filter(QueryBuilders.termsQuery("name", names));
SearchResponse resp = client.prepareSearch().setQuery(query).get();
Share:
11,483
Zerg
Author by

Zerg

Updated on June 13, 2022

Comments

  • Zerg
    Zerg almost 2 years

    There are multiple documents containing around 100 fields each. I'd like to perform a following search trough elasticsearch Java API 5.x:

    There are 3 fields I'd like to use for this search i.e.

    department
    job
    name
    

    I'd like to search the return documents that match fields like "department: D1", "department: D2", "job: J1", "job: J2" "name: N1"

    I've been trying to do it this way

    String[] departments = ["d1","d2","d3"];
    String[] jobs = ["j1","j2","j3"];
    String[] names = ["n1"];
    
    MultiSearchRequestBuilder requestbuilder; 
    
    requestBuilder.add(client.prepareSearch().setQuery(QueryBuilders.termsQuery("department", departments)));
    requestBuilder.add(client.prepareSearch().setQuery(QueryBuilders.termsQuery("job", jobs)));
    requestBuilder.add(client.prepareSearch().setQuery(QueryBuilders.termsQuery("name", names)));
    
    MultiSearchResponse response = requestBuilder.get();
    

    However the queries are executed as if each was an individual query, i.e. in this example when j3 exists in d4, the document with d4 will be matched aswell

    How to perform the search the way I mentioned? I've been trying numerous different queries and nothing seems to work, is there something I am missing?

  • Zerg
    Zerg over 7 years
    using the code you provided I get no results at all, even tried narrowing it to only filter by departments but still the hits list is empty. if your code is correct then do you know what can possibly be the reason?
  • Val
    Val over 7 years
    Are your fields analyzed or not? a term query is a exact match query, so your terms need to be exactly like the terms that have been indexed in the fields you're trying to match
  • Zerg
    Zerg over 7 years
    I had to use .setSize() in response, and it was in wrong place of the chain. it works now.
  • Val
    Val over 7 years
    Awesome, glad it helped!
  • Sophon Men
    Sophon Men about 4 years
    Can you confirm, if _score is working with this BoolQuery?
  • Val
    Val about 4 years
    @SophonMen No you need to use must() instead of filter() and matchQuery() instead of termsQuery()
  • Val
    Val about 4 years
    @SophonMen please create a new question with your requirements described
  • Sophon Men
    Sophon Men about 4 years
  • bogdan.rusu
    bogdan.rusu almost 4 years
    The source builder method from SearchRequest cannot be chained, it will overwrite the given sourceBuilder each time, so only the last one will be taken into consideration.
  • DaniyalVaghar
    DaniyalVaghar almost 3 years
    when use RestHighLevelClient we dont have prepareSearch.instead of that we can use searchSourceBuilder.query(query)