如何在kibana中编写与字段前4位匹配的字段脚本?

yqkkidmi  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(433)

我有一个陡峭的学习曲线与语法和我的数据有pii,所以我不知道如何描述更多。
我需要在已经索引的文档中的kibana中添加一个新字段。此字段“c”将是字段“a”的前4位数字的组合,该字段包含多达数百万个数字,并且是type:keyword,以及字段“b”,即type:keyword and 是个大数字。稍后我将使用这个字段“c”,它是一个独特的组合,用于与项目列表/数组进行比较(我将在kibana中的查询dsl中插入列表,因为我需要用返回的文档构建一些可视化和报告)。我知道我可以使用无痛来创建这个新字段,但我不知道是否需要使用regex以及如何使用它。
编辑:
如有需要,请提供有关Map的详细信息,并提供一个具体示例。

"fieldA" : {
        "type: "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
           }
          }
        },
"fieldB" : {
        "type: "text",
        "fields" : {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
           }
          }
        },

值示例:fielda=“9876443320134”,fieldb=“00000000 1”。我想把fielda的前4位数字和fieldb的全部内容相加。fieldc将导致值“9877”。

j2qf4p5b

j2qf4p5b1#

原始查询可能如下所示:

GET combination_index/_search
{
  "script_fields": {
    "a+b": {
      "script": {
        "source": """
          def a = doc['fieldA.keyword'].value;
          def b = doc['fieldB.keyword'].value;

          if (a == null || b == null) {
            return null
          }

          def parsed_a = new BigInteger(a);
          def parsed_b = new BigInteger(b);

          return  new BigInteger(parsed_a.toString().substring(0, 4)) + parsed_b;
        """
      }
    }
  }
}

注1:我们将字符串解析为 BigInteger 看似不充分的信用证 Integer.MAX_VALUE .
注2:我们首先分析 fieldA 然后才打电话来 .toString 再上一次,以便处理边缘情况 fieldA 启动w/0s-like 009876443320134 . 假设你在找 9876 ,不是 98 ,这是第一次调用的结果 .substring 然后分析。
如果您打算在kibana可视化中使用它,那么首先需要一个索引模式。一旦你有了一个,你可以继续如下:

然后将脚本放入:

单击“保存”,新的脚本将在数值聚合和查询中可用:

相关问题