Performance gap of single search loop and multisearch

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.
For more options, visit https://groups.google.com/groups/opt_out.