Импорт вложенных документов JSON в Elasticsearch и возможность поиска по ним

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

EDIT: Обходной путь Наш текущий обходной путь состоит в том, чтобы (1) выгрузить базу данных MongoDB на dump.json, а затем (2) сгладить ее с помощью jq, используя следующее выражение, и, наконец, (3) вручную импортировать его в Elastic

объявление (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), которое является европейским органом финансового регулирования, осуществляющим надзор за рынками капитала.


person B--rian    schedule 24.05.2019    source источник
comment
Вы уже пробовали фильтр json? elastic.co/guide/en/logstash/current/ плагины-фильтры-json.html   -  person leandrojmp    schedule 24.05.2019
comment
@leandrojmp Мы изо всех сил пытаемся найти правильный способ сделать это. Мы обнаружили stackoverflow.com/questions/22941739/using-json-with- logstash, в котором приведены примеры (которые, однако, не сработали).   -  person B--rian    schedule 27.05.2019