Is it expected to have script-based sorting much slower then field-based sorting? (x4 times slower then field-based in my tests) Is there any fundamental performance problem in processing - i.e. why the limitation to one script per request?
Using the following native script for testing:
public class RealPrice extends AbstractFloatSearchScript {
public static class Factory implements NativeScriptFactory {
/**
* This method is called for every search on every shard.
*
* @param params list of script parameters passed with the query
* @return new native script
*/
@Override
public ExecutableScript newScript(@Nullable Map<String, Object> params) {
return new RealPrice();
}
}
@Override
public float runAsFloat() {
Doubles price = (Doubles)doc().get("facet_price");
return Math.abs(10000 - price.get(0).floatValue());
}
}
Running ~5k queries of the form for 15min:
{
"explain": false,
"fields": [
"sku",
"facet_inStock",
"score"
],
"from": 0,
"query": {
"filtered": {
"filter": {
"bool": {
"must": {
"term": {
"searchable": "1"
}
},
"must_not": [
{
"term": {
"product_invisible": "1"
}
},
{
"terms": {
"product_visibility": [
"1",
"3"
]
}
}
]
}
},
"query": {
"bool": {
"boost": 2,
"minimum_should_match": "1",
"should": [
{
"multi_match": {
"fields": [
"attributes_brand_3^2.000000",
"category^2.000000",
"name^1.500000",
"attributes_author_131^1.000000",
"keywords_field^2.500000",
"skus^5.000000",
],
"minimum_should_match": "2<-1 5<80%",
"query": "iphone 6 4.7 case",
"slop": 20,
"tie_breaker": 1,
"type": "cross_fields",
"use_dis_max": true
}
},
{
"multi_match": {
"fields": [
"name^1.500000",
"category^2.000000",
"attributes_brand_3^2.000000",
"keywords_field^2.500000",
"attributes_author_131^1.000000",
"skus^5.000000",
],
"operator": "AND",
"query": "iphone 6 4.7 case",
"slop": 20,
"tie_breaker": 1,
"type": "phrase",
"use_dis_max": true
}
}
]
}
}
}
},
"size": 20,
"sort": {
"_script" : {
"type" : "number",
"script" : {
"lang": "native",
"script": "real_price"
}
}
}
}