Elasticsearch基于公共字段合并多个索引

时间:2020-07-22 05:13:17

标签: elasticsearch logstash kibana elk

我正在使用ELK从两个不同的数据库的数据中生成视图。一种是mysql,另一种是PostgreSQL。这两个数据库实例之间无法编写联接查询。但是我有一个共同的领域称呼“ nic”。以下是每个索引的文档。

MySQL

索引:user_detail

"_id": "871123365V",
"_source": {
    "type": "db-poc-user",
    "fname": "Iraj",
    "@version": "1",
    "field_lname": "Sanjeewa",
    "nic": "871456365V",
    "@timestamp": "2020-07-22T04:12:00.376Z",
    "id": 2,
    "lname": "Santhosh"
  }

PostgreSQL

索引:track_details

"_id": "871456365V",
"_source": {
   "@version": "1",
   "nic": "871456365V",
   "@timestamp": "2020-07-22T04:12:00.213Z",
   "track": "ELK",
   "type": "db-poc-ceg"
},

我想使用公共字段“ nic”将两个索引合并为单个索引。并创建新索引。因此,我可以在Kibana上创建可视化效果。如何实现?

请注意,新索引中的每个文档都应具有 “ nic,fname,lname,track”作为字段。不是聚合。

1 个答案:

答案 0 :(得分:1)

我会利用enrich processor实现这一目标。

首先,您需要创建一个扩展策略(使用最小的索引,假设它是user_detail):

PUT /_enrich/policy/user-policy
{
  "match": {
    "indices": "user_detail",
    "match_field": "nic",
    "enrich_fields": ["fname", "lname"]
  }
}

然后,您可以执行该策略以创建充实索引

POST /_enrich/policy/user-policy/_execute

下一步需要您创建使用上述丰富政策/索引的提取管道:

PUT /_ingest/pipeline/user_lookup
{
  "description" : "Enriching user details with tracks",
  "processors" : [
    {
      "enrich" : {
        "policy_name": "user-policy",
        "field" : "nic",
        "target_field": "tmp",
        "max_matches": "1"
      }
    },
    {
      "script": {
        "if": "ctx.tmp != null",
        "source": "ctx.putAll(ctx.tmp); ctx.remove('tmp');"
      }
    },
    {
      "remove": {
        "field": ["@version", "@timestamp", "type"]
      }
    }
  ]
}

最后,您现在可以使用连接的数据创建目标索引了。只需将_reindex API与我们刚刚创建的摄取管道结合使用:

POST _reindex
{
  "source": {
    "index": "track_details"
  },
  "dest": {
    "index": "user_tracks",
    "pipeline": "user_lookup"
  }
}

运行此命令后,user_tracks索引将完全包含您所需的内容,例如:

  {
    "_index" : "user_tracks",
    "_type" : "_doc",
    "_id" : "0uA8dXMBU9tMsBeoajlw",
    "_score" : 1.0,
    "_source" : {
      "fname" : "Iraj",
      "nic" : "871456365V",
      "lname" : "Santhosh",
      "track" : "ELK"
    }
  }

如果源索引发生变化(新用户,更改的名称等),则需要重新运行上述步骤,但是在执行此操作之前,您需要删除接收管道和接收策略(在这种情况下,订单):

DELETE /_ingest/pipeline/user_lookup
DELETE /_enrich/policy/user-policy

之后,您可以自由地重新运行上述步骤。

PS:请注意,由于user_detail中的记录在您的示例中没有相同的nic,我作弊了一点,但我想这是一个复制/粘贴问题。