# Performance gap of single search loop and multisearch

**URL:** <https://discuss.elastic.co/t/performance-gap-of-single-search-loop-and-multisearch/12506>\
**Category:** Elasticsearch\
**Created:** [June 21, 2013, 8:30am UTC](https://discuss.elastic.co/t/performance-gap-of-single-search-loop-and-multisearch/12506 "2013-06-21T08:30:07Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![nomad](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/nomad/32/2266_2.png) [@nomad](https://discuss.elastic.co/u/nomad)\
**Post date:** [June 21, 2013, 8:30am UTC](https://discuss.elastic.co/t/performance-gap-of-single-search-loop-and-multisearch/12506/1 "2013-06-21T08:30:07Z")

</div>

I've been prototyping the search function by 20 keywords over a  
multilingual index on elasticsearch server.

First, I tried the search function for 20 times, one keyword each time, and  
then I put the same SearchRequestBuilders into a MultiSearch and the  
response time is 10 times of the previous single search loop. Is it normal?

# code snippet (Scala) of the single search loop:

val ES\_QUERY\_KEYS = List(("forbes", "en"), ("Yankees", "en"), ("France",  
"fr"), ("hollywoodien", "fr"),  
("della gara", "it"), ("paralizzata", "it"), ("Alemania", "es"),  
("Sudeste Asiático", "es"),  
("Hamburg", "de"), ("Berliner", "de"), ("美国", "zh"), ("台北", "zh"),  
("увольнения", "ru"), ("РФ", "ru"),  
("hockeyploeg", "nl"), ("Nederlandse", "nl"), ("والاسرائيلي", "ar"),  
("في موزامبيق و", "ar"), ("東京", "ja"),  
("アメリカン", "ja"))  
val ES\_QUERY\_ROUND = 10  
val ES\_RESULT\_FROM = 0  
val ES\_RESULT\_SIZE = 10

def esSearch()  
{  
val client =getClient  
var totalMillis = 0.0  
for (i \<- 0 to ES\_QUERY\_ROUND - 1)  
{  
var subTotalMillis = 0.0  
ES\_QUERY\_KEYS.foreach(key =\>  
{  
val response = doSearch(client, newQueryBuilder(key.\_1, key.\_2),  
ES\_RESULT\_FROM, ES\_RESULT\_SIZE)  
subTotalMillis += response.getTookInMillis  
logger.debug(s"\>\>\>\> response.tookInMillis  
=[${response.getTookInMillis}] \<\<\<\<")  
})  
totalMillis += subTotalMillis  
logger.debug(s"\>\>\>\> round=[$i] subTotalMillis=[$subTotalMillis] \<\<\<\<")  
}  
client.close()  
logger.info(s"\>\>\>\> average=[${totalMillis / ES\_QUERY\_ROUND}] \<\<\<\<")  
}

def newQueryBuilder(queryKey: String, lang: String): BaseQueryBuilder =  
{  
val maxQuery = QueryBuilders.disMaxQuery()  
.add(QueryBuilders.fuzzyQuery(s"title.$lang",  
queryKey).boost(2.0f).minSimilarity(0.7f))  
.add(QueryBuilders.prefixQuery(s"title.$lang", queryKey).boost(1.5f))  
.add(QueryBuilders.queryString(queryKey).defaultField(s"title.$lang")  
.defaultOperator(QueryStringQueryBuilder.Operator.AND).boost(1.5f))  
.add(QueryBuilders.fuzzyQuery(s"body.$lang",  
queryKey).boost(1.0f).minSimilarity(0.7f))  
.add(QueryBuilders.prefixQuery(s"body.$lang", queryKey).boost(0.7f))  
.add(QueryBuilders.queryString(queryKey).defaultField(s"body.$lang")  
.defaultOperator(QueryStringQueryBuilder.Operator.AND).boost(0.7f))

```
val startTime = Calendar.getInstance
startTime.add(Calendar.DAY_OF_WEEK, -6)

QueryBuilders.boolQuery().must(maxQuery)
  .mustNot(QueryBuilders.matchQuery("thumbnail_id", ""))

```

.must(QueryBuilders.rangeQuery("timestamp").from(startTime.getTimeInMillis)  
.to(Calendar.getInstance.getTimeInMillis))  
}

def doSearch(client: TransportClient, queryBuilder: BaseQueryBuilder,  
from: Int, size: Int,  
explain: Boolean): SearchResponse = queryToRequestBuilder(client,  
queryBuilder, from, size, explain).execute()  
.actionGet()

def queryToRequestBuilder(client: TransportClient, queryBuilder:  
BaseQueryBuilder, from: Int, size: Int):  
SearchRequestBuilder =  
client.prepareSearch(ES\_INDEX).setTypes(ES\_TYPE).setQuery(queryBuilder).setFrom(from).setSize(size)

# code snippet of multisearch:

def esMultiSearch()  
{  
val client = getClient  
var totalMillis = 0.0  
val queryBuilders = ES\_QUERY\_KEYS.map(key =\> newQueryBuilder(key.\_1,  
key.\_2))  
val reqBuilders = queryBuilders  
.map(queryBuilder =\> queryToRequestBuilder(client, queryBuilder,  
ES\_RESULT\_FROM, ES\_RESULT\_SIZE))  
for (i \<- 0 to ES\_QUERY\_ROUND - 1)  
{  
var subTotalMillis = 0.0  
val mResponse = doMultiSearch(client, reqBuilders)  
mResponse.getResponses.foreach(response =\>  
{  
subTotalMillis += response.getResponse.getTookInMillis  
logger.debug(s"\>\>\>\> response.tookInMillis  
=[${response.getResponse.getTookInMillis}] \<\<\<\<")  
})  
totalMillis += subTotalMillis  
logger.debug(s"\>\>\>\> round=[$i] subTotalMillis=[$subTotalMillis] \<\<\<\<")  
}  
client.close()  
logger.info(s"\>\>\>\> average=[${totalMillis / ES\_QUERY\_ROUND}] \<\<\<\<")  
}

def doMultiSearch(client: TransportClient, reqBuilders:  
List[SearchRequestBuilder]): MultiSearchResponse =  
{  
val mReqBuilder = client.prepareMultiSearch()  
reqBuilders.foreach(reqBuilder =\> mReqBuilder.add(reqBuilder))  
mReqBuilder.execute().actionGet()  
}

The sample average response time of single search loop is [4948.0] and the  
one of multisearch is [39813.9].

Our dev server is not a big one but the performance gap is, please help.

--  
You received this message because you are subscribed to the Google Groups "elasticsearch" group.  
To unsubscribe from this group and stop receiving emails from it, send an email to [elasticsearch+unsubscribe@googlegroups.com](mailto:elasticsearch+unsubscribe@googlegroups.com).  
For more options, visit [https://groups.google.com/groups/opt\_out](https://groups.google.com/groups/opt_out).

---

<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 6, 2017, 2:30am UTC](https://discuss.elastic.co/t/performance-gap-of-single-search-loop-and-multisearch/12506/2 "2017-07-06T02:30:02Z")

</div>


