将嵌套的JSON文档导入Elasticsearch并使它们可搜索

时间:2019-05-24 12:54:36

标签: mongodb elasticsearch logstash mongoexport

我们有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}市场。

0 个答案:

没有答案