【问题标题】:How to create an array runtime field in elasticsearch?如何在 elasticsearch 中创建数组运行时字段?
【发布时间】:2023-01-12 12:54:09
【问题描述】:

我有一个带有嵌套字段“角色”的弹性搜索索引:

"roles": {
    "type": "nested",
    "properties": {
        "name": {
            "type": "text",
            "fields": {
                "raw": {
                    "type": "text",
                    "analyzer": "keylower"
                }
            }
        },
        "responsibilities": {
            "properties": {
                "name": {
                    "type": "text",
                    "fields": {
                        "raw": {
                            "type": "text",
                            "analyzer": "keylower"
                        }
                    }
                }
            }
        }
    }
}

这些字段中的值是数组,例如:

"roles": [
        {
            "name": "System Analyst",
            "responsibilities": [
                {
                    "name": "Software Development"
                },
                {
                    "name": "Software Testing"
                }
            ]
        },
        {
            "name": "Data Analyst",
            "responsibilities": [
                {
                    "name": "Data analysis"
                },
                {
                    "name": "Reporting"
                }
            ]
        }
    ]

我想分别在这些字段上构建 Kibana 可视化。由于它是一个嵌套字段并且 kibana 还不支持它(?),所以我想到为每个字段创建运行时字段。

这是我用于角色的查询:

PUT employee/_mappings
{
  "runtime": {
    "empRoles": {
      "type": "keyword",
      "script": """if (doc["roles.name.raw"].size()!=0 ) {
        String[] empRoles;
        for(int i=0; i < doc["roles.name.raw"].size(); i++) {
          empRoles[i] = doc["roles.name.raw"].value ;
          
        }
         emit(empRoles);}"""
    }
  }
}

但我收到以下错误:

"caused_by" : {
        "type" : "class_cast_exception",
        "reason" : "Cannot cast from [java.lang.String[]] to [java.lang.String]."
      }

我怎样才能让它发挥作用?最终,我想在“角色”和“职责”字段上构建一个 kibana 仪表板。

【问题讨论】:

    标签: elasticsearch kibana elasticsearch-painless nested-fields


    【解决方案1】:

    似乎无法将 nested 字段与 runtime 字段一起使用。

    我可以通过定义一个来得到想要的结果脚本字段正如here所建议的那样。

    Index Pattern &gt; [index pattern name] &gt; Scripted fields tab &gt; Add scripted field(Kibana 版本 7.17。对于更高版本,将 Index Patterns 替换为 Data Views)添加以下脚本。

    对于roles

        def names = new String[params._source.roles.length];
        def i= 0;
        for( role in params._source.roles){
          if(role.name != null){
            names[i++] = role.name;
          }
        }
        return names;
    

    对于responsibilities

        def responsibilitiesLength = 0;
        for( role in params._source.roles){
            responsibilitiesLength += role.responsibilities.length;
        }
        def responsibilities = new String[responsibilitiesLength];
        def i= 0;
        for( role in params._source.roles){
            for( responsability in role.responsibilities){
              responsibilities[i++] = responsability.name
            }
        }
        return responsibilities;
    

    (注意:脚本字段可能导致性能问题,因此已被弃用)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多