在提取期间将对象值添加到Elastic Search的字段中,并在提取期间全部删除空值字段

问题描述

我正在使用附加处理器将csv数据摄取到elasticsearch中。我已经有两个字段是对象(object1和object2),我想将它们都附加到另一个字段(mainlist)的数组中。因此,它会以mainlist:[ {object1},{object}]的形式出现,我尝试使用copy_from参数设置处理器,并且遇到错误,即使ElasticSearch文档显然没有使用“值”属性使用“ copy_from”时。 {"set": {"field": "mainlist","copy_from": ["object1","object"]}}。我的语法甚至完全从文档中复制。请帮忙。

此外,我需要在提取级别删除空字段,以便不返回它们。我不希望将“ fieldname:”“退还给用户。什么是最好的方法?我是ElasticSearch的新手,而且进展不太顺利。

解决方法

关于在摄取级别删除空白字段-建立管道:

PUT _ingest/pipeline/no_empty_fields
{
  "description": "Removes empty-ish fields from a doc","processors": [
    {
      "script": {
        "source": """
          def keys_to_remove = ctx.keySet()
                          .stream()
                          .filter(field -> ctx[field] == null || 
                                           ctx[field] == "")
                          .collect(Collectors.toList());

          for (key in keys_to_remove) {
            ctx.remove(key);
          }
        """
      }
    }
  ]
}

并将其应用于索引

POST myindex/_doc?pipeline=no_empty_fields
{
  "fieldname23": 123,"fieldname": null,"fieldname123": ""
}

您当然可以扩展条件以放弃其他字段,例如"undefined""Infinity"和其他字段。