elasticsearch Elasticsearch基于公共字段合并多个索引,elasticsearch,logstash,kibana,elk,elasticsearch,Logstash,Kibana,Elk" /> elasticsearch Elasticsearch基于公共字段合并多个索引,elasticsearch,logstash,kibana,elk,elasticsearch,Logstash,Kibana,Elk" />

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

elasticsearch Elasticsearch基于公共字段合并多个索引,elasticsearch,logstash,kibana,elk,elasticsearch,Logstash,Kibana,Elk,我使用ELK从两个不同的数据库中的数据生成视图。一个是mysql,另一个是PostgreSQL。无法在这两个DB实例之间编写连接查询。但我有一个共同的领域叫“nic”。以下是每个索引中的文档 MySQL 索引:用户详细信息 "_id": "871123365V", "_source": { "type": "db-poc-user", "fname": &quo

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

MySQL

索引:用户详细信息

"_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

索引:跟踪详细信息

"_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”作为字段。不是聚合

我会利用这一点来实现这一目标

首先,您需要创建一个充实策略(使用最小的索引,比如说它是
user\u detail
):

然后,您可以执行该策略以创建扩展索引

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"]
      }
    }
  ]
}
最后,您现在可以使用连接的数据创建目标索引了。只需将
\u reindex
API与我们刚刚创建的摄取管道结合使用即可:

POST _reindex
{
  "source": {
    "index": "track_details"
  },
  "dest": {
    "index": "user_tracks",
    "pipeline": "user_lookup"
  }
}
运行此操作后,
user\u tracks
索引将准确地包含您需要的内容,例如:

  {
    "_index" : "user_tracks",
    "_type" : "_doc",
    "_id" : "0uA8dXMBU9tMsBeoajlw",
    "_score" : 1.0,
    "_source" : {
      "fname" : "Iraj",
      "nic" : "871456365V",
      "lname" : "Santhosh",
      "track" : "ELK"
    }
  }
如果源索引发生更改(新用户、更改名称等),则需要重新运行上述步骤,但在执行此操作之前,需要删除摄取管道和摄取策略(按顺序):

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

PS:请注意,我有点作弊,因为
user\u detail
中的记录在您的示例中没有相同的
nic
,但我想这是一个复制/粘贴问题。

我会利用

首先,您需要创建一个充实策略(使用最小的索引,比如说它是
user\u detail
):

然后,您可以执行该策略以创建扩展索引

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"]
      }
    }
  ]
}
最后,您现在可以使用连接的数据创建目标索引了。只需将
\u reindex
API与我们刚刚创建的摄取管道结合使用即可:

POST _reindex
{
  "source": {
    "index": "track_details"
  },
  "dest": {
    "index": "user_tracks",
    "pipeline": "user_lookup"
  }
}
运行此操作后,
user\u tracks
索引将准确地包含您需要的内容,例如:

  {
    "_index" : "user_tracks",
    "_type" : "_doc",
    "_id" : "0uA8dXMBU9tMsBeoajlw",
    "_score" : 1.0,
    "_source" : {
      "fname" : "Iraj",
      "nic" : "871456365V",
      "lname" : "Santhosh",
      "track" : "ELK"
    }
  }
如果源索引发生更改(新用户、更改名称等),则需要重新运行上述步骤,但在执行此操作之前,需要删除摄取管道和摄取策略(按顺序):

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


PS:请注意,我有点作弊,因为
user\u detail
中的记录与您的示例中的
nic
不一样,但我想这是一个复制/粘贴问题。

这很好用。但是,如果我们想反复更新不断增长的指数,那么这一步是什么呢?太棒了,很高兴它有所帮助!目前,这些充实索引无法实时填充(这是一个错误)。因此,每当任何源索引发生更改时,您都需要重新执行上述步骤,以便重新创建/更新目标索引。谢谢。工作得很好。如果我们再次重新生成,将跳过第一步。如果
user\u detail
索引更改(新用户、名称更新等),也需要执行第一步。是的,您需要删除策略并在每次运行时重新创建它。我已经用详细的步骤更新了我的答案。这很好用。但是,如果我们想反复更新不断增长的指数,那么这一步是什么呢?太棒了,很高兴它有所帮助!目前,这些充实索引无法实时填充(这是一个错误)。因此,每当任何源索引发生更改时,您都需要重新执行上述步骤,以便重新创建/更新目标索引。谢谢。工作得很好。如果我们再次重新生成,将跳过第一步。如果
user\u detail
索引更改(新用户、名称更新等),也需要执行第一步。是的,您需要删除策略并在每次运行时重新创建它。我已经用详细的步骤更新了我的答案