在摄取期间向字段添加对象值以进行ElasticSearch,并在摄取期间删除所有空值字段

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

我正在使用append处理器将csv数据接收到elasticsearch中。我已经有两个字段是对象(object1和object2),我想将它们都附加到另一个字段(mainlist)的数组中。所以结果是 mainlist:[ {object1}, {object}] 我用copy\u from参数尝试了set处理器,但遇到了一个错误,即缺少所需的属性名“value”,即使elasticsearch文档在使用“copy\u from”时显然没有使用“value”属性。 {"set": {"field": "mainlist","copy_from": ["object1", "object"]}} . 我的语法甚至完全是从文档中复制过来的。请帮忙。
此外,我需要在摄取级别删除空字段,以便它们不会返回。我不希望将“fieldname:”返回给用户。最好的办法是什么。我对elasticsearch还不熟悉,但进展并不顺利。

izkcnapc

izkcnapc1#

至于在摄取级别删除空字段--设置一个管道:

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" 和其他人。

相关问题