在无痛/elk中拆分字符串

tsm1rwdh  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(416)

我有一个字符串字段“myfield.keyword”,其中条目的格式如下:
aaa\U bbbb\U抄送
滴滴涕
我正在尝试创建一个脚本化字段,该字段在第一个\之前输出子字符串,一个脚本化字段在第一个\和第二个\之间输出子字符串,一个脚本化字段在第二个\之后输出子字符串。
我试图使用.split('''')来执行此操作,但发现此方法在无痛模式中不可用:

def newfield = "";
def path = doc[''myfield.keyword].value;
if (...)
{newfield = path.split('_')[1];} else {newfield="null";}
return newfield

然后我尝试了这里建议的解决方法,但发现必须在elastic中启用regex(在我的情况下这是不可能的):

def newfield = "";
def path = doc[''myfield.keyword].value;
if (...)
{newfield = /_/.split(path)[1];} else {newfield="null";}
return newfield

有没有一种方法是以启用正则表达式为前提的?
编辑:
谢谢你这么优雅的解决方案。这回答了我的问题。然而,我的问题不是很清楚。特别是,需要拆分的字符串有四次出现'\ux'。比如:
aaa\U bb\U ccc\U地址
快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进快进
如果我理解正确的话, indexOf() 以及 lastIndexOf() 不能给我bb,ccc或dd。我想我可以调整你的解决方案,并找到第二次和第三次出现的索引,使用 string.indexOf("_", 1) 以及 string.indexOf("_", 2) . 然而,我总是得到和你一样的结果 string.indexOf("_") ,没有任何额外的参数(即,结果总是\第一次出现的索引)。

vmjh9lq9

vmjh9lq91#

启用正则表达式并不十分复杂,但它需要重新启动集群,根据环境的不同,这对您来说可能并不容易。
实现这一点的另一种方法是用“老办法”。首先,为每个脚本字段创建一个可重用的脚本。这个脚本所做的只是找到 _ 符号并返回拆分的元素。它将要拆分的字段名和要返回的子字符串的索引作为输入:

POST _scripts/my-split
{
  "script": {
    "lang": "painless",
    "source": """
      def str = doc[params.field].value;
      def first = str.indexOf("_");
      def second = first + 1 + str.substring(first + 1).indexOf("_");
      def third = second + 1 + str.substring(second + 1).indexOf("_");
      def last = str.lastIndexOf("_");
      def parts = [
           str.substring(0, first), 
           str.substring(first + 1, second), 
           str.substring(second + 1, third), 
           str.substring(third + 1, last), 
           str.substring(last + 1)
      ];
      return parts[params.index];
    """
  }
}

然后您可以简单地为每个部分定义一个脚本字段,如下所示:

POST test/_search
{
  "script_fields": {
    "first": {
      "script": {
        "id": "my-split",
        "params": {
          "field": "myfield.keyword",
          "index": 0
        }
      }
    },
    "second": {
      "script": {
        "id": "my-split",
        "params": {
          "field": "myfield.keyword",
          "index": 1
        }
      }
    },
    "third": {
      "script": {
        "id": "my-split",
        "params": {
          "field": "myfield.keyword",
          "index": 2
        }
      }
    }
  }
}

您得到的响应如下所示:

{
    "_index" : "test",
    "_type" : "_doc",
    "_id" : "ykS-l3UBeO1HTBdDvTZd",
    "_score" : 1.0,
    "fields" : {
      "first" : [
        "AAA"
      ],
      "second" : [
        "BBBB"
      ],
      "third" : [
        "CC"
      ]
    }
  }

相关问题