0

How can I create below bool query with RestHighLevelClient?

My attempt doesn't return anything:

BoolQueryBuilder query = boolQuery()
                .must(queryStringQuery(queryString).analyzeWildcard(true).defaultField("*"))
                .must(rangeQuery("timestamp").gte(fromTs).lte(toTs).format("epoch_millis")
                );

I want

"query":{  
      "bool":{  
         "must":[  
            {  
               "query_string":{  
                  "query":"foo:evlis AND bar:beatles",
                  "analyze_wildcard":true,
                  "default_field":"*"
               }
            },
            {  
               "range":{  
                  "timestamp":{  
                     "gte":1549360021398,
                     "lte":1549446421398,
                     "format":"epoch_millis"
                  }
               }
            }
         ],
         "filter":[  

         ],
         "should":[  

         ],
         "must_not":[  

         ]
      }
   }

Update I've enabled debug logging on org.elasticsearch.client and can see this debug output. When I click the link from debug log I can see results.

2019-02-07 19:20:11.351 DEBUG 17524 --- [/O dispatcher 1] org.elasticsearch.client.RestClient      : request 
[POST http://10.134.39.147:31429/journey/_doc/_search?typed_keys=true&ignore_unavailable=false&expand_wildcards=open&allow_no_indices=true&search_type=query_then_fetch&batched_reduce_size=512] 
returned [HTTP/1.1 200 OK]

However searchResponse.getHits() is empty, 0 hits???

    private void printResult(SearchResponse response) {
        System.out.println("=== HTTP Request ===");
        System.out.println("status: " + response.status());
        System.out.println("took: " + response.getTook());
        System.out.println("timed_out: " + response.isTimedOut());

        System.out.println("\n=== Hits ===");
        final SearchHits hits = response.getHits();
        System.out.println("total_hits: " + hits.getHits().length);

        List<Journey> journeys = new ArrayList<>();
        for (SearchHit hit : hits.getHits()) {
            System.out.println("\n=== Documents ===");
            System.out.println("index: " + hit.getIndex());
            System.out.println("type: " + hit.getType());
            System.out.println("id: " + hit.getId());
            System.out.println("source: " + hit.getSourceAsString());
        }
    }

Output

=== HTTP Request ===
status: OK
took: 19ms
timed_out: false

=== Hits ===
total_hits: 0

1
  • You should check your generated query via debugging elasticsearch request. Commented Feb 7, 2019 at 22:02

1 Answer 1

4

Steps:

  1. Create a new object SearchSourceBuilder sourceBuilder.
  2. Create a new object of BoolQueryBuilder boolQueryBuilder.
  3. Add to must of boolQueryBuilder a queryStringQuery using QueryBuilders.
  4. Add to must of boolQueryBuilder a rangeQuery using QueryBuilders.
  5. Add boolQueryBuilder as query of sourceBuilder.

So your query translates to:

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.must(
    QueryBuilders.queryStringQuery("foo:evlis AND bar:beatles").defaultField("*")
        .analyzeWildcard(true));
boolQueryBuilder.must(
    QueryBuilders.rangeQuery("timestamp").gte(1549360021398l).lte(1549446421398l)
        .format("epoch_millis"));
sourceBuilder.query(boolQueryBuilder);
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.