Search code examples
javaelasticsearchelasticsearch-painless

ElasticSearch painless determine that field was array in source document


Elasticsearch contains document like

{
  "array":["1","2"],
  "str": "123"
}

With mapping

"array" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          },
          "copy_to" : [
            "all"
          ],
          "norms" : false,
          "analyzer" : "logspeak"
        }

and

"str" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          },
          "copy_to" : [
            "all"
          ],
          "norms" : false,
          "analyzer" : "logspeak"
        }

If i do

Debug.explain(doc['array.keyword']);

and

Debug.explain(doc['str.keyword']);

I get org.elasticsearch.index.fielddata.ScriptDocValues$Strings type for both fields.

How can i determine source field type? (I need get string length if field is simple string or size of array if field is array)


Solution

  • The correct painless expression to use is:

    def size = -1;
    if (doc['array.keyword'].size() > 0) {
        // string case
        if (doc['array.keyword'].size() == 1) {
            size = doc['array.keyword'].value.length();
        } 
        // array case
        else {
            size = doc['array.keyword'].values.size();
        }
    }