# Help on IF statement in Kibana painless script

**URL:** <https://discuss.elastic.co/t/help-on-if-statement-in-kibana-painless-script/320024>\
**Category:** Kibana\
**Tags:** painless\
**Created:** [November 29, 2022, 9:55am UTC](https://discuss.elastic.co/t/help-on-if-statement-in-kibana-painless-script/320024 "2022-11-29T09:55:06Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![auato](https://avatars.discourse-cdn.com/v4/letter/a/ec9cab/32.png) [@auato](https://discuss.elastic.co/u/auato)\
**Post date:** [November 29, 2022, 9:55am UTC](https://discuss.elastic.co/t/help-on-if-statement-in-kibana-painless-script/320024/1 "2022-11-29T09:55:06Z")

</div>

This script below works fine but I would like to insert an IF statement that executes these lines of code only in the case a third '\_' character is present in the field 'measurement', otherwise it does not execute anything.

```auto
def AB = doc['measurement'].value.splitOnToken('_');
return AB[3].substring(0, 5);

```

Thanks!

---

<div class="post-metadata">

**Author:** ![Marco\_Liberati](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/marco_liberati/32/82953_2.png) [@Marco\_Liberati](https://discuss.elastic.co/u/Marco_Liberati)\
**Post date:** [November 29, 2022, 10:51am UTC](https://discuss.elastic.co/t/help-on-if-statement-in-kibana-painless-script/320024/2 "2022-11-29T10:51:32Z")

</div>

Hi @auato ,

Something like that would work?

```auto
if(doc['measurement'].value.indexOf('_') === 2){
  def AB = doc['measurement'].value.splitOnToken('_');
  return AB[3].substring(0, 5);
}

```

---

<div class="post-metadata">

**Author:** ![auato](https://avatars.discourse-cdn.com/v4/letter/a/ec9cab/32.png) [@auato](https://discuss.elastic.co/u/auato)\
**Post date:** [November 29, 2022, 11:06am UTC](https://discuss.elastic.co/t/help-on-if-statement-in-kibana-painless-script/320024/3 "2022-11-29T11:06:14Z")

</div>

Thank you Marco but the new 'AB' is empty. 🙄

---

<div class="post-metadata">

**Author:** ![auato](https://avatars.discourse-cdn.com/v4/letter/a/ec9cab/32.png) [@auato](https://discuss.elastic.co/u/auato)\
**Post date:** [November 29, 2022, 12:52pm UTC](https://discuss.elastic.co/t/help-on-if-statement-in-kibana-painless-script/320024/4 "2022-11-29T12:52:52Z")

</div>

In your script the statment `indexOf('_')` look like always returns the number 7 which is the position of the first underline.  
In the field measurement there are strings which contain more than one char `'_'` but only if it finds a third underline, it retrieve the next 5 characters.  
i.e. In the first string, the script does not do anything because a third `'_'` underline doesn't exist, while in the second string it will extract CSCDS and in the third one it will extract CSHHD

APAC42\_OM/VM:Virtual machine name=APAC42\_ELETYPE  
APAC42\_OM/VM:Virtual machine name=APAC42\_ELETYPE\_CSCDS\_VDU2\_0  
APAC42\_OM/VPORT:Virtual machine name=APAC42\_ELETYPE\_CSHHD\_26, Port name=FABRIC2

---

<div class="post-metadata">

**Author:** ![Marco\_Liberati](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/marco_liberati/32/82953_2.png) [@Marco\_Liberati](https://discuss.elastic.co/u/Marco_Liberati)\
**Post date:** [November 29, 2022, 5:32pm UTC](https://discuss.elastic.co/t/help-on-if-statement-in-kibana-painless-script/320024/5 "2022-11-29T17:32:01Z")

</div>

Ok, I've misunderstood the initial goal of it.  
Your examples helped clarify.

Try something like that:

```auto
def n = 3;
def str = doc['measurement'].value;
def pos = str.indexOf('_');
while (n > 0 && pos != -1) {
      pos = str.indexOf('_', pos + 1);
      n--;
}
if(pos != -1){
  def AB = str.splitOnToken('_');
  return AB[3].substring(0, 5);
}

```

---

<div class="post-metadata">

**Author:** ![auato](https://avatars.discourse-cdn.com/v4/letter/a/ec9cab/32.png) [@auato](https://discuss.elastic.co/u/auato)\
**Post date:** [November 30, 2022, 10:33am UTC](https://discuss.elastic.co/t/help-on-if-statement-in-kibana-painless-script/320024/6 "2022-11-30T10:33:10Z")

</div>

Marco, there is still an error:

```auto
{
  "took": 60,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 2,
    "skipped": 2,
    "failed": 1,
    "failures": [
      {
        "shard": 0,
        "index": "vc-ims-hourly-hua-cscf-v72-000010",
        "node": "22RBcknTRyGKSxbix83s_A",
        "reason": {
          "type": "script_exception",
          "reason": "runtime error",
          "script_stack": [
            "java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)",
            "java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)",
            "java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)",
            "java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)",
            "java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)",
            "java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)",
            "java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)",
            "java.base/java.lang.String.checkBoundsBeginEnd(String.java:4589)",
            "java.base/java.lang.String.substring(String.java:2703)",
            "return AB[3].substring(0, 5);\r\n}",
            " ^---- HERE"
          ],
          "script": "def n = 3; ...",
          "lang": "painless",
          "position": {
            "offset": 235,
            "start": 219,
            "end": 255
          },
          "caused_by": {
            "type": "string_index_out_of_bounds_exception",
            "reason": "Range [0, 5) out of bounds for length 3"
          }
        }
      }
    ]
  },
  "hits": {
    "max_score": null,
    "hits": []
  }
}

```

---

<div class="post-metadata">

**Author:** ![Marco\_Liberati](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/marco_liberati/32/82953_2.png) [@Marco\_Liberati](https://discuss.elastic.co/u/Marco_Liberati)\
**Post date:** [November 30, 2022, 2:07pm UTC](https://discuss.elastic.co/t/help-on-if-statement-in-kibana-painless-script/320024/7 "2022-11-30T14:07:51Z")

</div>

Seems like you can have a shorter string than 5 chars after the third `_`.  
Can't you just return `AB[3]`?

---

<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:** [December 28, 2022, 2:08pm UTC](https://discuss.elastic.co/t/help-on-if-statement-in-kibana-painless-script/320024/8 "2022-12-28T14:08:15Z")

</div>

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