# Query Builder API

**URL:** https://discuss.elastic.co/t/query-builder-api/57176
**Category:** Elasticsearch
**Created:** [August 4, 2016, 6:25am UTC](https://discuss.elastic.co/t/query-builder-api/57176 "2016-08-04T06:25:52Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![igorbunova](https://avatars.discourse-cdn.com/v4/letter/i/bbce88/32.png) [@igorbunova](https://discuss.elastic.co/u/igorbunova)
#### Post date: [August 4, 2016, 6:25am UTC](https://discuss.elastic.co/t/query-builder-api/57176/1 "2016-08-04T06:25:52Z")

</div>

Hi all I have a question.  
I have the query  
q=field1:"$value" field2:"$value"^10 field3:"$value" field4:"$value"^0.5 field5:"$value"^0.5

I passed this query via uri search  
[http://es.endpoint:9200/indexname/\_search?q=](http://es.endpoint:9200/indexname/_search?q=)...

Now I'm using the java transport client in my java code  
Which query builder should I use to perform the same query?

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [August 4, 2016, 6:50am UTC](https://discuss.elastic.co/t/query-builder-api/57176/2 "2016-08-04T06:50:43Z")

</div>

If you want to duplicate exactly the same request, you can use a QueryStringQuery

But I'd use a BoolQuery with should clauses and matchQuery inside.

---

<div class="post-metadata">

### Author: ![igorbunova](https://avatars.discourse-cdn.com/v4/letter/i/bbce88/32.png) [@igorbunova](https://discuss.elastic.co/u/igorbunova)
#### Post date: [August 4, 2016, 2:28pm UTC](https://discuss.elastic.co/t/query-builder-api/57176/3 "2016-08-04T14:28:49Z")

</div>

I tried the QueryStringQuery and BoolQuery and I've got really strange thing with the performance.  
When I pass the URI query ES is able to serve 1200 requests per second with disabled http cache and the CPU level on 45-50%  
When I pass BoolQuery the CPU level is under 100% on when the load reaches 100 requests per second only, however it keeps the response time good.  
QueryStringQuery is even worse. 3-4 requests per second 100% utilization and the huge response time.  
What can impact the performance so much when the transport client is used?

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [August 4, 2016, 2:53pm UTC](https://discuss.elastic.co/t/query-builder-api/57176/4 "2016-08-04T14:53:31Z")

</div>

Many factors.

But impossible to know without knowing what you are doing with which machines/settings...

---

<div class="post-metadata">

### Author: ![igorbunova](https://avatars.discourse-cdn.com/v4/letter/i/bbce88/32.png) [@igorbunova](https://discuss.elastic.co/u/igorbunova)
#### Post date: [August 5, 2016, 12:35pm UTC](https://discuss.elastic.co/t/query-builder-api/57176/5 "2016-08-05T12:35:01Z")

</div>

ElasticSearch runs on amazon c4.large instance (RAM 3.75Gb, CPU(s) 2) inside the Docker container  
OS Ubuntu 14.04

Index size is ~1GB  
Documents count ~3 million

ES settings:  
"refresh\_interval" : "10s",  
"number\_of\_shards" : "1",  
"number\_of\_replicas" : "0"  
other settings are default

JVM settings:  
-Xms2500m -Xmx2500m -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -Dfile.encoding=UTF-8 -Djna.nosys=true

mlock\_all is on

I understand that there can be a lot of reasons of high CPU consuming, however the main question is why uri search works fine with the same settings?  
I tested the DSL queries by http before and I had horrible results, hot\_threads output said that query parsing consumed a lot of resources, thus I started to use uri search for initial tests.  
I assume that ES transport serializes/deserializes query objects to something different from json strings, am I right?

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [August 5, 2016, 12:54pm UTC](https://discuss.elastic.co/t/query-builder-api/57176/6 "2016-08-05T12:54:48Z")

</div>

What is the query you wrote exactly?

---

<div class="post-metadata">

### Author: ![igorbunova](https://avatars.discourse-cdn.com/v4/letter/i/bbce88/32.png) [@igorbunova](https://discuss.elastic.co/u/igorbunova)
#### Post date: [August 9, 2016, 10:48am UTC](https://discuss.elastic.co/t/query-builder-api/57176/7 "2016-08-09T10:48:33Z")

</div>

```
QueryBuilders.boolQuery()
    .must(QueryBuilders.multiMatchQuery(value)
            .field("name")
            .field("description", 0.5f)
            .field("type",0.5f)
            .field("exactname", 3)
            .field("text")
            .type(MultiMatchQueryBuilder.Type.MOST_FIELDS)
    )

```

Also I tried this query

```
QueryBuilders.queryStringQuery(value)
            .field("name")
            .field("description", 0.5f)
            .field("type", 0.5f)
            .field("exactname", 3)
            .field("text")       
            .escape(true);

```

I have some custom filters and analyzers:

```
"filter" : {
    "name_autocomplete_filter": {
       "type": "edge_ngram",
       "min_gram": 1,
       "max_gram":30
     } 
},

"analyzer" : {
     "name_autocomplete" : {
     "type" : "custom",
     "tokenizer" : "standard",
     "filter" : ["lowercase", "name_autocomplete_filter", "asciifolding"]
},
}

```

The mapping is:

```
"name" : {
    "type": "string",
    "search_analyzer": "search_standard",
    "analyzer": "name_autocomplete"
 },
"exactname" : {
    "type": "string",
    "analyzer" : "keyword"
},
"type": {
  "type": "string",
  "analyzer": "english"
},
"description": {
  "type": "string",
  "analyzer": "english"
},
"text": {
  "type" : "string",
  "analyzer" : "english",
  "position_increment_gap": 15
}
```

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [August 9, 2016, 12:06pm UTC](https://discuss.elastic.co/t/query-builder-api/57176/8 "2016-08-09T12:06:11Z")

</div>

Can you try

```auto
QueryBuilders.queryStringQuery("field1:\"$value\" field2:\"$value\"^10 field3:\"$value\" field4:\"$value\"^0.5 field5:\"$value\"^0.5");

```

I can't imagine that you see any difference between the transport client and the REST layer.

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [August 9, 2016, 12:06pm UTC](https://discuss.elastic.co/t/query-builder-api/57176/9 "2016-08-09T12:06:29Z")

</div>

And BTW please format your code using `</>` icon. It will make your post more readable.

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)
#### Post date: [July 5, 2017, 10:29pm UTC](https://discuss.elastic.co/t/query-builder-api/57176/10 "2017-07-05T22:29:06Z")

</div>


