Elasticsearch multiple condition query using java api

14k views Asked by At

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?

2

There are 2 answers

8
Val On BEST ANSWER

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();
1
Kaliappan On

For Elasticsearch 5.6.4 of using HighRestClient, add required number of sourcebuilder...

static RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
public static void multisearch() throws IOException{
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); 
    sourceBuilder.query(QueryBuilders.termQuery("name", "vijay1"));
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.indices("posts-1","posts-2").source(sourceBuilder);
    SearchResponse searchResponse = client.search(searchRequest);
    RestStatus status = searchResponse.status();
    System.out.println(searchResponse.toString());