Search code examples
spring-data-elasticsearch

How to combine a multiMatchQuery with a boolQuery using Spring Data Elastic Search


I am using a multi match query like so:

var builder = QueryBuilders.multiMatchQuery(search, "projectName", "jobNumber");
var query = new NativeSearchQueryBuilder()
   .withQuery(builder)
   .withPageable(pageable)
   .build();
var result = searchOperations.search(query, Foo.class);

Now I need to make sure that the _id field also matches the FooId field. How do I create a query to do that and combine it with my multi match query?


Solution

  • If both clauses are mandatory, you can combine them using must method of BoolQueryBuilder:

    var builder = new BoolQueryBuilder()
                     .must(QueryBuilders.multiMatchQuery(search, "projectName", "jobNumber"))
                     .must(QueryBuilders.termQuery("_id", fooId));
    var query = new NativeSearchQueryBuilder()
                   .withQuery(builder)
                   .withPageable(pageable)
                   .build();
    var result = searchOperations.search(query, Foo.class);
    

    Or you can define the clause by id as a filter having the same result:

    var builder = QueryBuilders.multiMatchQuery(search, "projectName", "jobNumber");
    var filter = QueryBuilders.termQuery("_id", fooId)
    var query = new NativeSearchQueryBuilder()
                   .withQuery(builder)
                   .withFilter(filter)
                   .withPageable(pageable)
                   .build();
    var result = searchOperations.search(query, Foo.class);