У нас есть 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
Ссылки
- Уокер Роу: Вложенные запросы ElasticSearch: поиск встроенных документов а>
- Поиск ElasticSearch в документе и в динамическом вложенном документе
- Сопоставление вложенного документа JSON в Elasticsearch
- Logstash — импортировать вложенный JSON в Elasticsearch
Примечание для любознательных: Показанный JSON представляет собой (измененную) запись из Финансового Система справочной базы данных инструментов (FIRDS), доступная в Европейском управлении по ценным бумагам и рынкам. (ESMA), которое является европейским органом финансового регулирования, осуществляющим надзор за рынками капитала.
json
? elastic.co/guide/en/logstash/current/ плагины-фильтры-json.html - person leandrojmp   schedule 24.05.2019