# Scripted field return value on same order than original

**URL:** <https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950>\
**Category:** Kibana\
**Created:** [March 2, 2021, 11:54am UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950 "2021-03-02T11:54:40Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![Jose\_Manuel\_Tirado](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jose_manuel_tirado/32/84882_2.png) [@Jose\_Manuel\_Tirado](https://discuss.elastic.co/u/Jose_Manuel_Tirado)\
**Post date:** [March 2, 2021, 11:54am UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/1 "2021-03-02T11:54:40Z")

</div>

I am trying to create a scripted field to be able to fetch me the first value of a certain field.  
I find the problem in that when it returns the values ​​of the field, and I save them in path, it sorts them alphabetically in such a way that when choosing the zero value later, this is sometimes not the one I want.

I would like to get the values ​​in the same order as in the original field.

```auto
//
 if (!doc.containsKey('RSLT') || doc['RSLT'].empty){
    return ""
}else{
    def list = [];  
    for(int i=0; i < doc['RSLT'].length;i++){
        def path=doc['RSLT'][i];
        int lastSlashIndex = path.lastIndexOf(':');
        if (lastSlashIndex > 0) {    
            list.add(path.substring(lastSlashIndex+1));
        }else {
            list.add(path);
        }
            
    }
    return list[0];
}
//

```

 ![Captura de pantalla 2021-03-02 125018](https://us1.discourse-cdn.com/elastic/original/3X/b/d/bdba1b25456bdcd36f22ca053e03b7dedfbc6376.png)

---

<div class="post-metadata">

**Author:** ![flash1293](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/flash1293/32/41227_2.png) [@flash1293](https://discuss.elastic.co/u/flash1293)\
**Post date:** [March 2, 2021, 2:08pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/2 "2021-03-02T14:08:52Z")

</div>

Can you make an example (with input and output) of what you would like to achieve vs what you are seeing with the current version of the script? It's not clear to me from the screenshot you posted.

---

<div class="post-metadata">

**Author:** ![Jose\_Manuel\_Tirado](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jose_manuel_tirado/32/84882_2.png) [@Jose\_Manuel\_Tirado](https://discuss.elastic.co/u/Jose_Manuel_Tirado)\
**Post date:** [March 2, 2021, 3:00pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/3 "2021-03-02T15:00:44Z")

</div>

```auto
If original field = {route:INCIDENCIA_TECNICA_ADSL}, {route:ADSL_CONCRETAR} 
I want to get value in position 0 INCIDENCIA_TECNICA_ADSL
but I obtain ADSL_CONCRETAR because : def path=doc['RSLT'][i] order the values.

Thanks

```

---

<div class="post-metadata">

**Author:** ![flash1293](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/flash1293/32/41227_2.png) [@flash1293](https://discuss.elastic.co/u/flash1293)\
**Post date:** [March 2, 2021, 5:24pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/4 "2021-03-02T17:24:39Z")

</div>

Ah got it, thanks. As you can see here [lucene - Does Elasticsearch keep an order of multi-value fields? - Stack Overflow](https://stackoverflow.com/questions/34755389/does-elasticsearch-keep-an-order-of-multi-value-fields)

The order of indexed multi value fields is not guaranteed.

You can get around that by accessing the `_source` object: [Accessing document fields and special variables | Elasticsearch Reference [master] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-scripting-fields.html#modules-scripting-source)

---

<div class="post-metadata">

**Author:** ![Jose\_Manuel\_Tirado](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jose_manuel_tirado/32/84882_2.png) [@Jose\_Manuel\_Tirado](https://discuss.elastic.co/u/Jose_Manuel_Tirado)\
**Post date:** [March 3, 2021, 11:42am UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/5 "2021-03-03T11:42:52Z")

</div>

```auto
Hi Joe:

could you help me with the script? I don't know how to enter the new parameter that you tell me to make it work for me.
I do not have much experience with painless and all help is great

Regards

```

---

<div class="post-metadata">

**Author:** ![flash1293](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/flash1293/32/41227_2.png) [@flash1293](https://discuss.elastic.co/u/flash1293)\
**Post date:** [March 4, 2021, 1:44pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/6 "2021-03-04T13:44:04Z")

</div>

Let's say your document looks like this:

```auto
{
  "extension": ["gz", "css"]
}

```

Then the following scripted field will return "gz":

```auto
return params._source.extension[0]

```

---

<div class="post-metadata">

**Author:** ![Jose\_Manuel\_Tirado](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jose_manuel_tirado/32/84882_2.png) [@Jose\_Manuel\_Tirado](https://discuss.elastic.co/u/Jose_Manuel_Tirado)\
**Post date:** [March 4, 2021, 3:11pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/7 "2021-03-04T15:11:53Z")

</div>

When I adapt the script that you advised me:

![Captura de pantalla 2021-03-04 155513](https://us1.discourse-cdn.com/elastic/original/3X/7/4/7401ccf0963c58163243b037b61150ff7ed35125.png)

It throws me the following error:

 ![Captura de pantalla 2021-03-04 160636](https://us1.discourse-cdn.com/elastic/original/3X/b/b/bbbcdc3fdc7cce2fb27f6d99fb637cd5ded1c989.png)

When searching in dev tools with the following query:

![Captura de pantalla 2021-03-04 155333](https://us1.discourse-cdn.com/elastic/original/3X/7/c/7cab24dfe77e6a867b252ebfcbc3275cac5158eb.png)

I get:

 ![Captura de pantalla 2021-03-04 155318](https://us1.discourse-cdn.com/elastic/original/3X/2/2/22058c3b80b9812d928dc4a716bd7b9ea4851b51.png)

It seems like a format like the one you indicated but nevertheless I keep getting errors and I don't get the data the way I want

Any suggestion.

Thanks

---

<div class="post-metadata">

**Author:** ![flash1293](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/flash1293/32/41227_2.png) [@flash1293](https://discuss.elastic.co/u/flash1293)\
**Post date:** [March 4, 2021, 4:05pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/8 "2021-03-04T16:05:06Z")

</div>

Either make sure every document in your index specified an array for "RSLT" or add a check in the script:

```auto
if (params._source.RSLT instanceof List) {
  ...
} else {
  return null;
}

```

---

<div class="post-metadata">

**Author:** ![Jose\_Manuel\_Tirado](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jose_manuel_tirado/32/84882_2.png) [@Jose\_Manuel\_Tirado](https://discuss.elastic.co/u/Jose_Manuel_Tirado)\
**Post date:** [March 4, 2021, 4:13pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/9 "2021-03-04T16:13:18Z")

</div>

When I adapt your script:

![Captura de pantalla 2021-03-04 171130](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1aef3c094326e646b0922a05a335f71e99b30d96.png)

Give me the next error:

 ![Captura de pantalla 2021-03-04 171154](https://us1.discourse-cdn.com/elastic/original/3X/6/b/6b104df334ea795c3700c4bdadefc36de4e22813.png)

---

<div class="post-metadata">

**Author:** ![flash1293](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/flash1293/32/41227_2.png) [@flash1293](https://discuss.elastic.co/u/flash1293)\
**Post date:** [March 4, 2021, 4:15pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/11 "2021-03-04T16:15:10Z")

</div>

You have a typo there - it says `soource`

---

<div class="post-metadata">

**Author:** ![Jose\_Manuel\_Tirado](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jose_manuel_tirado/32/84882_2.png) [@Jose\_Manuel\_Tirado](https://discuss.elastic.co/u/Jose_Manuel_Tirado)\
**Post date:** [March 4, 2021, 4:23pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/12 "2021-03-04T16:23:14Z")

</div>

Upss!!!

I changed it and it works!!

But now some values in position[0] are liki this:

![image](https://us1.discourse-cdn.com/elastic/original/3X/b/c/bcb049e6cc4efd67f911f30e957b285495e9c415.png)

How I could split them by '#' and obtain the first value??

Thanks!!

---

<div class="post-metadata">

**Author:** ![flash1293](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/flash1293/32/41227_2.png) [@flash1293](https://discuss.elastic.co/u/flash1293)\
**Post date:** [March 4, 2021, 4:24pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/13 "2021-03-04T16:24:15Z")

</div>

It's still painless, you can use the same approach as in your original script

---

<div class="post-metadata">

**Author:** ![Jose\_Manuel\_Tirado](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jose_manuel_tirado/32/84882_2.png) [@Jose\_Manuel\_Tirado](https://discuss.elastic.co/u/Jose_Manuel_Tirado)\
**Post date:** [March 4, 2021, 4:26pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/14 "2021-03-04T16:26:46Z")

</div>

I don´t understand

Sorry

---

<div class="post-metadata">

**Author:** ![flash1293](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/flash1293/32/41227_2.png) [@flash1293](https://discuss.elastic.co/u/flash1293)\
**Post date:** [March 4, 2021, 4:51pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/15 "2021-03-04T16:51:13Z")

</div>

The scripted field is defined using the painless programming language, and extracting a part of a string is a simple task in this programming language. See the official guide for how to do string manipulation: [Painless Guide | Painless Scripting Language [7.11] | Elastic](https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-guide.html)

The script in your original question is pretty close to what you need.

I won't write your script for you, please check out the tutorials to learn how to use the painless programming language for this kind of simple tasks.

---

<div class="post-metadata">

**Author:** ![Jose\_Manuel\_Tirado](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jose_manuel_tirado/32/84882_2.png) [@Jose\_Manuel\_Tirado](https://discuss.elastic.co/u/Jose_Manuel_Tirado)\
**Post date:** [March 8, 2021, 12:33pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/16 "2021-03-08T12:33:34Z")

</div>

With this script:

```auto
if (params._source.RSLT instanceof List) {
     def list = [];  
    for(int i=0; i < params._source['RSLT'].length;i++){
        def path=params._source['RSLT'][i];
        path = path.replace('#',',');
        int lastSlashIndex = path.lastIndexOf(',');
        if (lastSlashIndex > 0) {    
            list.add(path.substring(lastSlashIndex+1));
        }else {
            list.add(path);
        }
    }
    return list[0];
} else {
    return params._source['RSLT'];
    }

```

I get the value that I'm looking for most of the time

 ![image](https://us1.discourse-cdn.com/elastic/original/3X/1/d/1d1a17a756ff3af20a48b0c438673b0563fb030d.png)

But when :

```auto
......
else {
    return params._source['RSLT'];
    }

```

return:

 ![Captura de pantalla 2021-03-08 132212](https://us1.discourse-cdn.com/elastic/original/3X/7/1/719feae67be429f617485593ad50d6ea89b3398f.png)

I don't know how to split it by '#' and keep the first value while keeping the order.

Any suggestion

Thanks

---

<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:** [April 5, 2021, 12:33pm UTC](https://discuss.elastic.co/t/scripted-field-return-value-on-same-order-than-original/265950/17 "2021-04-05T12:33:59Z")

</div>

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