Импорт вложенных документов JSON в Elasticsearch и обеспечение их поиска - PullRequest
0 голосов
/ 24 мая 2019

У нас есть 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"
  }
}

Все это прекрасно работаетданные попадают в индекс firds Elasticsearch, а GET /firds/_search возвращает все записи в поле _source.Мы понимаем, что это поле не проиндексировано и, следовательно, не доступно для поиска, что мы на самом деле ищем. Мы хотим, чтобы все записи в исходном вложенном JSON-файле были доступны для поиска в Elasticsearch.

Мы предполагаем, что нам нужно настроить filter {} часть нашей конфигурации Logstash, но как?По соображениям согласованности было бы неплохо сохранить исходную вложенную структуру JSON, но это не обязательно.Сглаживание также может быть вариантом, так что, например,

"RefData" : {
      "DebtInstrmAttrbts" : {
        "NmnlValPerUnit" : "2000" ... 

становится одной парой ключ-значение "RefData.DebtInstrmAttrbts.NmnlValPerUnit" : "2000".

Было бы замечательно, если бы мы могли сделать это немедленно с Logstash, без использования дополнительного скрипта Python, работающего с файлом JSON, который мы экспортировали из MongoDB.

РЕДАКТИРОВАТЬ: Обходной путь Наш текущий обходной путь - (1) вывести базу данных MongoDB в dump.json, а затем (2) выровнять ее с помощью jq , используя следующее выражение, и, наконец, (3) вручную импортировать ее в Elastic

ad (2): Это шаг выравнивания:

jq  '. as $in | reduce leaf_paths as $path ({}; . + { ($path | join(".")): $in | getpath($path) })  | del(."_id.$oid") ' 
    -c dump.json > flattened.json

Ссылки

Примечание для любопытных: Показанный JSON является (измененной) записью из Справочная база данных по финансовым инструментам(FIRDS) , доступное от Европейского агентства по ценным бумагам и рынкам (ESMA) , которое является европейским органом финансового регулирования, контролирующим рынки капитала.

...