Elasticsearch multiple condition query using java api
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();
Zerg
Updated on June 13, 2022Comments
-
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 over 7 yearsusing 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 over 7 yearsAre 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 over 7 yearsI had to use .setSize() in response, and it was in wrong place of the chain. it works now.
-
Val over 7 yearsAwesome, glad it helped!
-
Sophon Men about 4 yearsCan you confirm, if _score is working with this BoolQuery?
-
Val about 4 years@SophonMen No you need to use
must()
instead offilter()
andmatchQuery()
instead oftermsQuery()
-
Val about 4 years@SophonMen please create a new question with your requirements described
-
Sophon Men about 4 yearsOk, I created one here stackoverflow.com/questions/61011387/…
-
bogdan.rusu almost 4 yearsThe 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 almost 3 yearswhen use RestHighLevelClient we dont have prepareSearch.instead of that we can use searchSourceBuilder.query(query)