Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

elasticsearch sort error using script

Currently I encountered a weird issue: when I sort based on a field, it throws out an exception:

curl -XGET 'http://localhost:9200/pb/p/_search?pretty' -d '{
"query": {"match" : {"first_name" : "john"}},
"sort" : {
  "_script" : {
      "script" : "doc['dob_size'].value * factor1",
      "type"   : "number",
      "params" : {"factor1" : 1},
      "order"  : "desc" 
}}}'
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 1,
    "failed" : 4,
    "failures" : [ {
      "index" : "pb",
      "shard" : 0,
      "status" : 500,
      "reason" : "QueryPhaseExecutionException[[pb][0]: query[filtered(first_name:john)->cache(_type:p)],from[0],size[10],sort[<custom:\"_script\": org.elasticsearch.search.sort.ScriptSortParser$2@7ac5f844>!]: Query Failed [Failed to execute main query]]; nested: GroovyScriptExecutionException[MissingPropertyException[No such property: dob_size for class: Script132]]; "
    }, {
      "index" : "pb",
      "shard" : 2,
      "status" : 500,
      "reason" : "QueryPhaseExecutionException[[pb][2]: query[filtered(first_name:john)->cache(_type:p)],from[0],size[10],sort[<custom:\"_script\": org.elasticsearch.search.sort.ScriptSortParser$2@12127900>!]: Query Failed [Failed to execute main query]]; nested: GroovyScriptExecutionException[MissingPropertyException[No such property: dob_size for class: Script132]]; "
    }, {
      "index" : "pb",
      "shard" : 3,
      "status" : 500,
      "reason" : "QueryPhaseExecutionException[[pb][3]: query[filtered(first_name:john)->cache(_type:p)],from[0],size[10],sort[<custom:\"_script\": org.elasticsearch.search.sort.ScriptSortParser$2@5b2e7754>!]: Query Failed [Failed to execute main query]]; nested: GroovyScriptExecutionException[MissingPropertyException[No such property: dob_size for class: Script132]]; "
    }, {
      "index" : "pb",
      "shard" : 4,
      "status" : 500,
      "reason" : "QueryPhaseExecutionException[[pb][4]: query[filtered(first_name:john)->cache(_type:p)],from[0],size[10],sort[<custom:\"_script\": org.elasticsearch.search.sort.ScriptSortParser$2@5dd9cdc1>!]: Query Failed [Failed to execute main query]]; nested: GroovyScriptExecutionException[MissingPropertyException[No such property: dob_size for class: Script132]]; "
    } ]
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}

However when I remove the sort part, it works perfectly:

curl -XGET 'http://localhost:9200/pb/p/_search?pretty' -d '{
"query": {"match" : {"first_name" : "john"}}}'
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 4,
    "max_score" : 0.30685282,
    "hits" : [ {
      "_index" : "pb",
      "_type" : "p",
      "_id" : "4",
      "_score" : 0.30685282,
      "_source":{
"first_name" : ["john", "jon"],
"last_name" : "abcdef",
"location_size": 3,
"relative_size": 3,
"dob_size"     : 1}
    }, {
      "_index" : "pb",
      "_type" : "p",
      "_id" : "1",
      "_score" : 0.30685282,
      "_source":{
"first_name" : ["john", "jon"],
"last_name" : "abcdef",
"location_size": 5,
"relative_size": 3,
"dob_size"     : 1}
    }, {
      "_index" : "pb",
      "_type" : "p",
      "_id" : "2",
      "_score" : 0.30685282,
      "_source":{
"first_name" : ["john", "jon"],
"last_name" : "abcdef",
"location_size": 5,
"relative_size": 4,
"dob_size"     : 0}
    }, {
      "_index" : "pb",
      "_type" : "p",
      "_id" : "3",
      "_score" : 0.30685282,
      "_source":{
"first_name" : ["john", "jon"],
"last_name" : "abcdef",
"location_size": 5,
"relative_size": 4,
"dob_size"     : 1}
    } ]
  }
}

I followed the guideline from here, but seems it does not work.

The mapping is:

curl -XGET 'http://localhost:9200/pb/p/_mapping?pretty'
{
  "pb" : {
    "mappings" : {
      "p" : {
        "properties" : {
          "dob_size" : {
            "type" : "integer"
          },
          "first_name" : {
            "type" : "string",
            "index" : "not_analyzed"
          },
          "last_name" : {
            "type" : "string",
            "index" : "not_analyzed"
          },
          "location_size" : {
            "type" : "integer"
          },
          "relative_size" : {
            "type" : "integer"
          }
        }
      }
    }
  }
}

And the elasticsearch version is: ./elasticsearch -v Version: 1.4.1, Build: 89d3241/2014-11-26T15:49:29Z, JVM: 1.7.0_55

Any ideas?

Thanks!

like image 350
milodky Avatar asked Feb 10 '23 21:02

milodky


1 Answers

This is an issue with shell. You need to escape the singe quotes. The query should look like -

curl -XPOST 'http://localhost:9200/pb/p/_search' -d '{
  "query": {
    "match": {
      "first_name": "john"
    }
  },
  "sort": {
    "_script": {
      "script": "doc['"'"'dob_size'"'"'].value * factor1",
      "type": "number",
      "params": {
        "factor1": 1
      },
      "order": "desc"
    }
  }
}'
like image 124
Vineeth Mohan Avatar answered Feb 13 '23 22:02

Vineeth Mohan