0

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 :)

0

1 Answer 1

3

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"
            }
          }
        }
      }
    }
  }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.