How to set more query to elasticsearch via java API

Hi I am trying to do query on elastic search by following the sql query and I want to implement same logic using Java API

select
* from log
where
name is "jay"
and [all_field_value] LIKE "%keyword%"
and @datetime between '2016-05-20T00:00:00.000Z' AND '2016-05-30T00:00:00.000Z'

my java code,

RangeQueryBuilder range = QueryBuilders.rangeQuery("@timestamp")
                                   .gte("2016-05-20T00:00:00.000Z")
                                   .lte("2016-05-27T00:00:00.000Z"); 

TermQueryBuilder nameqry = QueryBuilders.termQuery("name", "jay");  

QueryStringQueryBuilder qs = QueryBuilders.queryStringQuery("keyword")
                                      .field("message"); 

 BoolQueryBuilder keyboolqry = QueryBuilders.boolQuery();                                           
SearchResponse mibresponse = client.prepareSearch("logstash-record-*")
                        .setTypes("log")
                        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                        .setQuery(keyboolqry)  
                        .setQuery(nameqry ) 
                       .setQuery(qs)                                        
                      .setQuery(QueryBuilders.boolQuery().filter(range))
                       .setFetchSource(new String[] { "*" },new String[] {"message"})
                     .setFrom(0).setSize(60).setExplain(true)
                     .execute()
                    .actionGet();

when i run the code ,the results's timestamp is not between the RangeQueryBuilder range and each document is not all match the nameqry (that's can see in my code)

Please guide I am new to Elastic search. Thanks in advance.

You must provide only one query. Each time you call setQuery it overwrites the previous one.

Set only the boolQuery but use must clauses to wrap your other queries .

See https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-compound-queries.html#java-query-dsl-bool-query

hi dadoonet,
i have try to use "must" as you said looks like ,

BoolQueryBuilder keyboolqry = QueryBuilders.boolQuery().must(nameqry ).must(qs).must(range);
SearchResponse mibresponse = client.prepareSearch("logstash-record-*")
                    .setTypes("log")
                    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                    .setQuery(keyboolqry)  
                   .setFetchSource(new String[] { "*" },new String[] {"message"})
                 .setExplain(true)
                 .execute()
                .actionGet();

return result is all match nameqry and qs but didn't get all match results from
the range that i set ,
for example , it's have miss logstash-log-2016.05.26
please can you tell me what's wrong with me ?

What results do you get back?

for my code ,i want to get from "2016-05-20T00:00:00.000Z") to ("2016-05-27T00:00:00.000Z"),
it's only get 2016-05-23 to 2016-05-24 , but i check the document it's should have 2016-05-26 document too

Yes but can you show a full complete JSON doc ?

Also what is the mapping?

BTW it would be easier to write a full script which reproduces your issue in pure Rest/JSON.

Like:

DELETE index
PUT index/doc/1
{
"foo":"bar"
}
GET index/_search
{
  "query": { ... }
}

hi dadoonet,
i found the problem is have to set size for searchresponse,
but how to set searchresponse to get all record ?

It's a bit more clear.

So yes there is pagination.

If you want to extract all the results, you scroll API.

can i sort the results by timestamp with desc ?

Yes you can!

can you guild me how to do ?

A bit old but you get the idea: Sorting response hits using java api

hi dadoonet,
i try to using setscroll to get all results as you said,

.setScroll(new TimeValue(60000))
.setSize(100)
but it's only return 100 hits ,what's wrong with it ?

This is expected.

You must read the scroll API doc to understand how this works: https://www.elastic.co/guide/en/elasticsearch/reference/2.3/search-request-scroll.html