我正在使用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”作为字段。不是聚合。
答案 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
,我作弊了一点,但我想这是一个复制/粘贴问题。