我们有MongoDB集合,我们想将其导入到Elasticsearch中(现在是一次性的工作)。为此,我们用monogexport
导出了集合。这是一个巨大的JSON文件,其中包含以下内容:
{
"RefData" : {
"DebtInstrmAttrbts" : {
"NmnlValPerUnit" : "2000",
"IntrstRate" : {
"Fxd" : "3.1415"
},
"MtrtyDt" : "2020-01-01",
"TtlIssdNmnlAmt" : "200000000",
"DebtSnrty" : "SNDB"
},
"TradgVnRltdAttrbts" : {
"IssrReq" : "false",
"Id" : "BMTF",
"FrstTradDt" : "2019-04-01T12:34:56.789"
},
"TechAttrbts" : {
"PblctnPrd" : {
"FrDt" : "2019-04-04"
},
"RlvntCmptntAuthrty" : "GB"
},
"FinInstrmGnlAttrbts" : {
"ClssfctnTp" : "DBFNXX",
"ShrtNm" : "AVGO 3.625 10/16/24 c24 (URegS)",
"FullNm" : "AVGO 3 5/8 10/15/24 BOND",
"NtnlCcy" : "USD",
"Id" : "USU1109MAXXX",
"CmmdtyDerivInd" : "false"
},
"Issr" : "549300WV6GIDOZJTVXXX"
}
我们正在使用以下Logstash配置文件将此数据集导入Elasticsearch:
input {
file {
path => "/home/elastic/FIRDS.json"
start_position => "beginning"
sincedb_path => "/dev/null"
codec => json
}
}
filter {
mutate {
remove_field => [ "_id", "path", "host" ]
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
index => "firds"
}
}
这一切正常,数据最终存储在Elasticsearch的 index firds
中,并且GET /firds/_search
返回_source
字段中的所有条目。
我们知道,此字段未编入索引,因此无法搜索,这实际上是我们所追求的。 我们希望在Elasticsearch中搜索原始嵌套JSON中的所有条目。
我们假设必须调整Logstash配置的filter {}
部分,但是如何?出于一致性原因,保留原始的嵌套JSON结构并不坏,但这不是必须的。扁平化也是一种选择,例如,
"RefData" : {
"DebtInstrmAttrbts" : {
"NmnlValPerUnit" : "2000" ...
成为单个键值对"RefData.DebtInstrmAttrbts.NmnlValPerUnit" : "2000"
。
如果我们能立即使用Logstash做到这一点,而无需使用对从MongoDB导出的JSON文件上运行的其他Python脚本,那将是很棒的事情。
参考
好奇的话:显示的JSON是Financial Instruments Reference Database System (FIRDS)的(已修改)条目,European Securities and Markets Authority (ESMA)是负责监管资本的欧洲金融监管机构,{JSON}市场。