Saeed Zhiany
Saeed Zhiany

Reputation: 2141

Sort parent type based on one field within an array of nested Object in elasticsearch

I have below mapping in my index:

{
"testIndex": {
    "mappings": {
        "type1": {
            "properties": {
                "text": {
                    "type": "string"
                },
                "time_views": {
                    "properties": {
                        "timestamp": {
                            "type": "long"
                        },
                        "views": {
                            "type": "integer"
                        }
                    }
                }
            }
        }
    }
}
}

"time_views" actually is an array, but inner attributes not array.

I want to sort my type1 records based on maximum value of "views" attribute of each type1 record. I read elasticsearch sort documentation, it's have solution for use cases that sorting is based on field (single or array) of single nested object. but what I want is different. I want pick maximum value of "views" for each document and sort the documents based on these values

I made this json query

{
"size": 10,
"query": {
   "range": {
     "timeStamp": {
       "gte": 1468852617347,
       "lte": 1468939017347
     }
   }
 },
 "from": 0,
 "sort": [
    {
      "time_views.views": {
        "mode": "max",
        "nested_path": "time_views",
        "order": "desc"
      }
    }
 ]
}

but I got this error

{
  "error": {
    "phase": "query",
    "failed_shards": [
    {
    "node": "n4rxRCOuSBaGT5xZoa0bHQ",
    "reason": {
      "reason": "[nested] nested object under path [time_views] is not of nested type",
      "col": 136,
      "line": 1,
      "index": "data",
      "type": "query_parsing_exception"
    },
    "index": "data",
    "shard": 0
  }
],
"reason": "all shards failed",
"grouped": true,
"type": "search_phase_execution_exception",
"root_cause": [
  {
    "reason": "[nested] nested object under path [time_views] is not of nested type",
    "col": 136,
    "line": 1,
    "index": "data",
    "type": "query_parsing_exception"
  }
]
},
 "status": 400
}

as I mentioned above time_views is an array and I guess this error is because of that. even I can't use sorting based on array field feature, because "time_views" is not a primitive type. I think my last chance is write a custom sorting by scripting, but I don't know how. please tell me my mistake if it's possible to achieve to what I'm want, otherwise give me a simple script sample.

tnx :)

Upvotes: 0

Views: 770

Answers (1)

Andrei Stefan
Andrei Stefan

Reputation: 52368

The error message does a lot to explain what is wrong with the query. Actually, the problem is with the mapping. And I think you intended on using nested fields, since you are using nested queries.

You just need to make your time_views field as nested:

  "mappings": {
    "type1": {
      "properties": {
        "text": {
          "type": "string"
        },
        "time_views": {
          "type": "nested", 
          "properties": {
            "timestamp": {
              "type": "long"
            },
            "views": {
              "type": "integer"
            }
          }
        }
      }
    }
  }

Upvotes: 3

Related Questions