# Sort script in painless

**URL:** <https://discuss.elastic.co/t/sort-script-in-painless/81817>\
**Category:** Elasticsearch\
**Created:** [April 10, 2017, 12:42pm UTC](https://discuss.elastic.co/t/sort-script-in-painless/81817 "2017-04-10T12:42:01Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![zajca](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/zajca/32/26576_2.png) [@zajca](https://discuss.elastic.co/u/zajca)\
**Post date:** [April 10, 2017, 12:42pm UTC](https://discuss.elastic.co/t/sort-script-in-painless/81817/1 "2017-04-10T12:42:01Z")

</div>

I'm trying to sort results on query which is run using multiple indexes/type

In some types I have nested 'revisions' which have title, in some I don't have revisions just title. Title has raw field.  
I just want to use revisions.title.raw when revisions exists and title.raw when don't

this is my query:

```
{
   "query":{
      "bool":{
         "must":[
            {
               "match_all":{

               }
            }
         ]
      }
   },
   "sort":{
      "_script":{
         "script":{
            "lang":"painless",
            "inline":"doc['revisions'] === null ? doc['title'].raw.value : doc['revisions.title'].raw.value"
         },
         "type":"string",
         "order":"asc"
      }
   },
   "size":10,
   "from":"0"
}

```

and I get error:

```
{
   "error":{
      "root_cause":[
         {
            "type":"script_exception",
            "reason":"runtime error",
            "script_stack":[
               "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:80)",
               "doc['revisions'] === null ? doc['title'].raw.value : doc['revisions.title'].raw.value",
               " ^---- HERE"
            ],
            "script":"doc['revisions'] === null ? doc['title'].raw.value : doc['revisions.title'].raw.value",
            "lang":"painless"
         }
      ],
      "type":"search_phase_execution_exception",
      "reason":"all shards failed",
      "phase":"query",
      "grouped":true,
      "failed_shards":[
         {
            "shard":0,
            "index":"cdk",
            "node":"oGUf1cVDRaGrOQD3d0IUog",
            "reason":{
               "type":"script_exception",
               "reason":"runtime error",
               "script_stack":[
                  "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:80)",
                  "doc['revisions'] === null ? doc['title'].raw.value : doc['revisions.title'].raw.value",
                  " ^---- HERE"
               ],
               "script":"doc['revisions'] === null ? doc['title'].raw.value : doc['revisions.title'].raw.value",
               "lang":"painless",
               "caused_by":{
                  "type":"illegal_argument_exception",
                  "reason":"No field found for [revisions] in mapping with types []"
               }
            }
         }
      ],
      "caused_by":{
         "type":"script_exception",
         "reason":"runtime error",
         "script_stack":[
            "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:80)",
            "doc['revisions'] === null ? doc['title'].raw.value : doc['revisions.title'].raw.value",
            " ^---- HERE"
         ],
         "script":"doc['revisions'] === null ? doc['title'].raw.value : doc['revisions.title'].raw.value",
         "lang":"painless",
         "caused_by":{
            "type":"illegal_argument_exception",
            "reason":"No field found for [revisions] in mapping with types []"
         }
      }
   },
   "status":500
}

```

I try to use containsKey function like this:

```auto
doc.containsKey('revisions') ? doc.revisions.title.raw.value : doc.title.raw.value

```

But I get:

```auto
          ^---- HERE"],"script":"doc.containsKey('revisions') ? doc.revisions.title.raw.value : doc.title.raw.value","lang":"painless","caused_by":{"type":"illegal_argument_exception","reason":"No field found for [title] in mapping with types []"}}},"status":500}

```

but my mappings are fine:

I have:

```auto
"properties": {
        "title": {
            "type": "text",
            "boost": 10.0,
            "fields": {
              "first": {
                "type": "text",
                "analyzer": "first",
                "fielddata": true
              },
              "raw": {
                "type": "keyword"
              }
            },

```

or

```auto
"properties": {
          "revisions": {
            "type": "nested",
            "properties": {
              "title": {
                "type": "text",
                "boost": 10.0,
                "fields": {
                  "first": {
                    "type": "text",
                    "analyzer": "first",
                    "fielddata": true
                  },
                  "raw": {
                    "type": "keyword"
                  }
                },
                "analyzer": "cz"
              }
            }
          },

```

---

<div class="post-metadata">

**Author:** ![nik9000](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/nik9000/32/44947_2.png) [@nik9000](https://discuss.elastic.co/u/nik9000)\
**Post date:** [April 10, 2017, 1:18pm UTC](https://discuss.elastic.co/t/sort-script-in-painless/81817/2 "2017-04-10T13:18:29Z")

</div>

Fields that have a `.` in their name need to be looked up like `doc['revisions.title.raw']` and `doc['title.raw']` because `doc` is an accessor for doc values rather than your source document.

---

<div class="post-metadata">

**Author:** ![zajca](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/zajca/32/26576_2.png) [@zajca](https://discuss.elastic.co/u/zajca)\
**Post date:** [April 10, 2017, 1:43pm UTC](https://discuss.elastic.co/t/sort-script-in-painless/81817/3 "2017-04-10T13:43:59Z")

</div>

Yes this is part of my problem.

When I do:  
`"inline":"doc.containsKey('revisions') ? doc['revisions.title.raw'] : doc['title.raw']"`  
One of my index is success.  
But the weird thing is that other one will fail with:

```auto
{
   "error":{
      "root_cause":[
         {
            "type":"script_exception",
            "reason":"runtime error",
            "script_stack":[
               "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:80)",
               "doc.containsKey('revisions') ? doc['revisions.title.raw'] : doc['title.raw']",
               " ^---- HERE"
            ],
            "script":"doc.containsKey('revisions') ? doc['revisions.title.raw'] : doc['title.raw']",
            "lang":"painless"
         }
      ],
      "type":"search_phase_execution_exception",
      "reason":"all shards failed",
      "phase":"query",
      "grouped":true,
      "failed_shards":[
         {
            "shard":0,
            "index":"cdk",
            "node":"oGUf1cVDRaGrOQD3d0IUog",
            "reason":{
               "type":"script_exception",
               "reason":"runtime error",
               "script_stack":[
                  "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:80)",
                  "doc.containsKey('revisions') ? doc['revisions.title.raw'] : doc['title.raw']",
                  " ^---- HERE"
               ],
               "script":"doc.containsKey('revisions') ? doc['revisions.title.raw'] : doc['title.raw']",
               "lang":"painless",
               "caused_by":{
                  "type":"illegal_argument_exception",
                  "reason":"No field found for [title.raw] in mapping with types [competence]"
               }
            }
         }
      ],
      "caused_by":{
         "type":"script_exception",
         "reason":"runtime error",
         "script_stack":[
            "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:80)",
            "doc.containsKey('revisions') ? doc['revisions.title.raw'] : doc['title.raw']",
            " ^---- HERE"
         ],
         "script":"doc.containsKey('revisions') ? doc['revisions.title.raw'] : doc['title.raw']",
         "lang":"painless",
         "caused_by":{
            "type":"illegal_argument_exception",
            "reason":"No field found for [title.raw] in mapping with types [competence]"
         }
      }
   },
   "status":500
}

```

But when I do:  
`"inline":"doc.containsKey('revisions') ? doc['revisions.title.raw'] : doc['revisions.title.raw']"`  
It will be success. So how I understand it is that `doc.containsKey('revisions')` will be false even when key `revisions` exists, that doesn't make sense and should fail this way.

---

<div class="post-metadata">

**Author:** ![nik9000](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/nik9000/32/44947_2.png) [@nik9000](https://discuss.elastic.co/u/nik9000)\
**Post date:** [April 10, 2017, 3:49pm UTC](https://discuss.elastic.co/t/sort-script-in-painless/81817/4 "2017-04-10T15:49:53Z")

</div>

If `revisions` is an object field then it won't be in `doc` at all because `doc` is a view of doc values fields, not the internal structure of the document.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [May 8, 2017, 3:50pm UTC](https://discuss.elastic.co/t/sort-script-in-painless/81817/5 "2017-05-08T15:50:12Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
