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