提问人:OJ Slott 提问时间:11/2/2023 最后编辑:OJ Slott 更新时间:11/5/2023 访问量:56
查询具有匹配项的嵌套对象
Query nested object with match
问:
我刚刚开始使用 Elasticsearch,并构建了一个简单的集成到丹麦 CVR 寄存器中,我在其中提取了各种客户端信息。所有这些都在按预期进行。但是现在我必须添加 2 个新对象 - 'attributter' 和 'deltagerRelation' - 两者都是数组。它们都包含大量信息,我只需要 deltagerRelation 中的 1 个元素和“attributter”对象中的 2 个元素。我正在努力创建一个可以执行此操作的查询。
这就是我想要实现的目标 - 希望这个伪代码有意义:
从对象“deltagerRelation”:
GET ELEMENT FROM Vrvirksomhed.deltagerRelation WHERE Vrvirksomhed.deltagerRelation.organisationer.hovedtype = 'REVISION' AND Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier.period.gyldigFra IS NOT NULLAND Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier.period.gyldigFra IS NULL
从对象“attributter”:
GET ELEMENT FROM Vrvirksomhed.attributter WHERE Vrvirksomhed.attributter.type IN ('REGNSKABSÅR_SLUT', 'REGNSKABSÅR_START')
这是我当前的请求,我只拉了 1 个客户端。我想在这里实现查询。请不要,您无法访问端点 - 您需要一个密钥
POST http://distribution.virk.dk/cvr-permanent/virksomhed/_search
{
"_source": [
"Vrvirksomhed.cvrNummer",
"Vrvirksomhed.reklamebeskyttet",
"Vrvirksomhed.virksomhedMetadata.nyesteNavn.navn",
"Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse",
"Vrvirksomhed.virksomhedMetadata.nyesteHovedbranche",
"Vrvirksomhed.virksomhedMetadata.sammensatStatus",
"Vrvirksomhed.deltagerRelation",
"Vrvirksomhed.attributter"
],
"query": {
"term": {
"Vrvirksomhed.cvrNummer": "61126228"
}
}
}
这是回应 - 已缩短以更好地概述
[
{
"_index": "cvr-v-20220630",
"_type": "_doc",
"_id": "3089460",
"_score": 10.979432,
"_source": {
"Vrvirksomhed": {
"cvrNummer": 61126228,
"deltagerRelation": [
{
"organisationer": [
{
"organisationsNavn": [
{
"sidstOpdateret": "2015-02-10T00:00:00+01:00",
"navn": "Revision",
"periode": {
"gyldigFra": null,
"gyldigTil": null
}
}
],
"enhedsNummerOrganisation": 4004678075,
"hovedtype": "REVISION",
"medlemsData": [
{
"attributter": [
{
"type": "FUNKTION",
"vaerdier": [
{
"sidstOpdateret": "2015-05-08T08:33:25+02:00",
"vaerdi": "REVISION",
"periode": {
"gyldigFra": "2015-03-18",
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "string"
}
]
}
],
"attributter": [
{
"type": "FUNKTION",
"vaerdier": [
{
"sidstOpdateret": "2015-02-10T00:00:00+01:00",
"vaerdi": "Revision",
"periode": {
"gyldigFra": null,
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "string"
}
]
}
],
"kontorsteder": [
{
"penhed": {
"navne": [
{
"sidstOpdateret": "2011-10-13T16:32:58+02:00",
"navn": "Deloitte Statsautoriseret Revisionspartnerselskab",
"periode": {
"gyldigFra": "2011-10-13",
"gyldigTil": null
}
}
],
"beliggenhedsadresse": [
{
"vejkode": 8122,
"fritekst": null,
"adresseId": null,
"vejnavn": "Weidekampsgade",
"bogstavTil": null,
"conavn": null,
"bogstavFra": null,
"periode": {
"gyldigFra": "2011-10-13",
"gyldigTil": null
},
"kommune": {
"sidstOpdateret": "2006-11-13T00:00:00+01:00",
"kommuneNavn": "KØBENHAVN",
"kommuneKode": 101,
"periode": {
"gyldigFra": "2007-01-01",
"gyldigTil": null
}
},
"husnummerFra": 6,
"postboks": null,
"sidstOpdateret": "2016-08-23T14:19:38+02:00",
"postnummer": 2300,
"etage": null,
"bynavn": null,
"husnummerTil": null,
"sidedoer": null,
"landekode": "DK",
"sidstValideret": null,
"postdistrikt": "København S"
}
],
"sidstOpdateret": null,
"sidstIndlaest": "2023-11-02T10:31:46.693+01:00",
"adresseOpdateringOphoert": null,
"enhedsNummer": 4003554478,
"adresseHemmelig": null,
"forretningsnoegle": 1017192430,
"adresseHemmeligUndtagelse": null,
"organisationstype": null,
"postadresse": [],
"enhedstype": "PRODUKTIONSENHED"
},
"attributter": [
{
"type": "FUNKTION",
"vaerdier": [
{
"sidstOpdateret": "2015-05-08T08:33:25+02:00",
"vaerdi": "KONTORSTED",
"periode": {
"gyldigFra": "2015-03-18",
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "string"
}
]
}
],
"deltager": {
"navne": [
{
"sidstOpdateret": "2015-03-12T17:58:37+01:00",
"navn": "DELOITTE STATSAUTORISERET REVISIONSPARTNERSELSKAB",
"periode": {
"gyldigFra": "2011-10-13",
"gyldigTil": null
}
}
],
"beliggenhedsadresse": [
{
"vejkode": 8122,
"fritekst": null,
"adresseId": null,
"vejnavn": "Weidekampsgade",
"bogstavTil": null,
"conavn": null,
"bogstavFra": null,
"periode": {
"gyldigFra": "2011-10-13",
"gyldigTil": null
},
"kommune": {
"sidstOpdateret": "2006-11-13T00:00:00+01:00",
"kommuneNavn": "KØBENHAVN",
"kommuneKode": 101,
"periode": {
"gyldigFra": "2007-01-01",
"gyldigTil": null
}
},
"husnummerFra": 6,
"postboks": null,
"sidstOpdateret": "2013-11-22T22:40:23+01:00",
"postnummer": 2300,
"etage": null,
"bynavn": null,
"husnummerTil": null,
"sidedoer": null,
"landekode": "DK",
"sidstValideret": null,
"postdistrikt": "København S"
}
],
"sidstOpdateret": "2023-11-01T08:53:28+01:00",
"sidstIndlaest": "2023-11-02T10:31:46.693+01:00",
"adresseOpdateringOphoert": null,
"enhedsNummer": 5651072,
"adresseHemmelig": null,
"forretningsnoegle": 33963556,
"adresseHemmeligUndtagelse": null,
"organisationstype": null,
"postadresse": [],
"enhedstype": "VIRKSOMHED"
}
},
{
"organisationer": [
{
"organisationsNavn": [
{
"sidstOpdateret": "2015-02-10T00:00:00+01:00",
"navn": "Bestyrelse",
"periode": {
"gyldigFra": null,
"gyldigTil": null
}
}
],
"enhedsNummerOrganisation": 4004678073,
"hovedtype": "LEDELSESORGAN",
"medlemsData": [
{
"attributter": [
{
"type": "FUNKTION",
"vaerdier": [
{
"sidstOpdateret": "2022-03-25T11:12:29+01:00",
"vaerdi": "BESTYRELSESMEDLEM",
"periode": {
"gyldigFra": "2022-03-17",
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "string"
},
{
"type": "VALGFORM",
"vaerdier": [
{
"sidstOpdateret": "2022-03-25T11:12:29+01:00",
"vaerdi": "medarbejdere i selskabet",
"periode": {
"gyldigFra": "2022-03-17",
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "string"
}
]
}
],
"attributter": [
{
"type": "FUNKTION",
"vaerdier": [
{
"sidstOpdateret": "2015-02-10T00:00:00+01:00",
"vaerdi": "Bestyrelse",
"periode": {
"gyldigFra": null,
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "string"
}
]
}
],
"kontorsteder": [],
"deltager": {
"navne": [
{
"sidstOpdateret": null,
"navn": "Aleksandras Cicasovas",
"periode": {
"gyldigFra": null,
"gyldigTil": null
}
}
],
"beliggenhedsadresse": [
{
"vejkode": null,
"fritekst": "Linkmenų Gatvė 33-11\n08217 Vilnius",
"adresseId": null,
"vejnavn": null,
"bogstavTil": null,
"conavn": null,
"bogstavFra": null,
"periode": {
"gyldigFra": "2022-06-17",
"gyldigTil": null
},
"kommune": null,
"husnummerFra": null,
"postboks": null,
"sidstOpdateret": "2022-06-16T23:53:17Z",
"postnummer": null,
"etage": null,
"bynavn": null,
"husnummerTil": null,
"sidedoer": null,
"landekode": "LT",
"sidstValideret": null,
"postdistrikt": null
}
],
"sidstOpdateret": "2022-06-18T00:03:23.732+02:00",
"sidstIndlaest": "2023-11-02T10:31:46.693+01:00",
"adresseOpdateringOphoert": false,
"enhedsNummer": 4009216850,
"adresseHemmelig": false,
"forretningsnoegle": 4009216850,
"adresseHemmeligUndtagelse": false,
"organisationstype": null,
"postadresse": [],
"enhedstype": "ANDEN_DELTAGER"
}
},
{
"organisationer": [
{
"organisationsNavn": [
{
"sidstOpdateret": "2015-02-10T00:00:00+01:00",
"navn": "Direktion",
"periode": {
"gyldigFra": null,
"gyldigTil": null
}
}
],
"enhedsNummerOrganisation": 4004678074,
"hovedtype": "LEDELSESORGAN",
"medlemsData": [
{
"attributter": [
{
"type": "FUNKTION",
"vaerdier": [
{
"sidstOpdateret": "2022-05-04T12:15:58+02:00",
"vaerdi": "DIREKTØR",
"periode": {
"gyldigFra": "2022-05-01",
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "string"
}
]
}
],
"attributter": [
{
"type": "FUNKTION",
"vaerdier": [
{
"sidstOpdateret": "2015-02-10T00:00:00+01:00",
"vaerdi": "Direktion",
"periode": {
"gyldigFra": null,
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "string"
}
]
}
],
"kontorsteder": [],
"deltager": {
"navne": [
{
"sidstOpdateret": null,
"navn": "Barbro Johanna Gunnarsdotter Norberg",
"periode": {
"gyldigFra": null,
"gyldigTil": null
}
}
],
"beliggenhedsadresse": [
{
"vejkode": null,
"fritekst": "Kommendörsgatan 44\n11458 Stockholm",
"adresseId": null,
"vejnavn": null,
"bogstavTil": null,
"conavn": null,
"bogstavFra": null,
"periode": {
"gyldigFra": "2022-06-17",
"gyldigTil": null
},
"kommune": null,
"husnummerFra": null,
"postboks": null,
"sidstOpdateret": "2022-06-16T23:34:56Z",
"postnummer": null,
"etage": null,
"bynavn": null,
"husnummerTil": null,
"sidedoer": null,
"landekode": "SE",
"sidstValideret": null,
"postdistrikt": null
}
],
"sidstOpdateret": "2022-06-18T00:04:26.092+02:00",
"sidstIndlaest": "2023-11-02T10:31:46.693+01:00",
"adresseOpdateringOphoert": false,
"enhedsNummer": 4009254383,
"adresseHemmelig": false,
"forretningsnoegle": 4009254383,
"adresseHemmeligUndtagelse": false,
"organisationstype": null,
"postadresse": [],
"enhedstype": "ANDEN_DELTAGER"
}
}
],
"reklamebeskyttet": true,
"attributter": [
{
"type": "ARKIV_REGISTRERINGSNUMMER",
"vaerdier": [
{
"sidstOpdateret": "2015-02-10T00:00:00+01:00",
"vaerdi": "A/S28472",
"periode": {
"gyldigFra": null,
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "string"
},
{
"type": "BØRSNOTERET",
"vaerdier": [
{
"sidstOpdateret": "2015-02-10T00:00:00+01:00",
"vaerdi": "true",
"periode": {
"gyldigFra": "2005-01-01",
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "boolean"
},
{
"type": "REGNSKABSÅR_SLUT",
"vaerdier": [
{
"sidstOpdateret": "2015-02-10T00:00:00+01:00",
"vaerdi": "--12-31",
"periode": {
"gyldigFra": null,
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "gMonthDay"
},
{
"type": "REGNSKABSÅR_START",
"vaerdier": [
{
"sidstOpdateret": "2015-02-10T00:00:00+01:00",
"vaerdi": "--01-01",
"periode": {
"gyldigFra": null,
"gyldigTil": null
}
}
],
"sekvensnr": 0,
"vaerditype": "gMonthDay"
}
],
"virksomhedMetadata": {
"nyesteHovedbranche": {
"sidstOpdateret": "2007-12-25T09:45:25+01:00",
"branchetekst": "Banker, sparekasser og andelskasser",
"branchekode": "641900",
"periode": {
"gyldigFra": "2008-01-01",
"gyldigTil": null
}
},
"sammensatStatus": "NORMAL",
"nyesteNavn": {
"navn": "DANSKE BANK A/S"
},
"nyesteBeliggenhedsadresse": {
"vejkode": 2992,
"fritekst": null,
"adresseId": "ccfb6ead-f39e-4438-8a9f-22b2b3d0b202",
"vejnavn": "Holmens Kanal",
"bogstavTil": null,
"conavn": null,
"bogstavFra": null,
"periode": {
"gyldigFra": "2007-01-10",
"gyldigTil": null
},
"kommune": {
"sidstOpdateret": "2006-11-13T00:00:00+01:00",
"kommuneNavn": "KØBENHAVN",
"kommuneKode": 101,
"periode": {
"gyldigFra": "2007-01-01",
"gyldigTil": null
}
},
"husnummerFra": 2,
"postboks": null,
"sidstOpdateret": "2007-01-10T18:12:10+01:00",
"postnummer": 1060,
"etage": null,
"bynavn": null,
"husnummerTil": 12,
"sidedoer": null,
"landekode": "DK",
"sidstValideret": "2017-10-09T09:38:54.228+02:00",
"postdistrikt": "København K"
}
}
}
}
}
]
更新:
我发现我查询了错误的字段。所以我将查询从 @imotov 更改为 this。它似乎做了我想做的事。
{
"_source": [
"Vrvirksomhed.cvrNummer",
"Vrvirksomhed.reklamebeskyttet",
"Vrvirksomhed.virksomhedMetadata.nyesteNavn.navn",
"Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse",
"Vrvirksomhed.virksomhedMetadata.nyesteHovedbranche",
"Vrvirksomhed.virksomhedMetadata.sammensatStatus"
],
"query": {
"bool": {
"must": [
{
"term": {
"Vrvirksomhed.cvrNummer": "61126228"
}
},
{
"nested": {
"inner_hits": {},
"path": "Vrvirksomhed.deltagerRelation",
"query": {
"nested": {
"path": "Vrvirksomhed.deltagerRelation.organisationer",
"query": {
"nested": {
"path": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData",
"query": {
"nested": {
"path": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter",
"query": {
"nested": {
"path": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier",
"query": {
"bool": {
"must": [
{
"match": {
"Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier.vaerdi": "REVISION"
}
},
{
"nested": {
"bool": {
"must": [
{
"exists": {
"field": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier.periode.gyldigFra"
}
}
],
"must_not": [
{
"exists": {
"field": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier.periode.gyldigTil"
}
}
]
}
}
}
]
}
}
}
}
}
}
}
}
}
}
}
},
{
"nested": {
"inner_hits": {},
"path": "Vrvirksomhed.attributter",
"query": {
"bool": {
"should": [
{
"match": {
"Vrvirksomhed.attributter.type": "REGNSKABSÅR_SLUT"
}
},
{
"match": {
"Vrvirksomhed.attributter.type": "REGNSKABSÅR_START"
}
}
]
}
}
}
}
]
}
}
}
答:
1赞
imotov
11/3/2023
#1
我不得不承认,我已经有一段时间没有看到如此可怕的地图了。查询如下:
{
"_source": [
"Vrvirksomhed.cvrNummer",
"Vrvirksomhed.reklamebeskyttet",
"Vrvirksomhed.virksomhedMetadata.nyesteNavn.navn",
"Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse",
"Vrvirksomhed.virksomhedMetadata.nyesteHovedbranche",
"Vrvirksomhed.virksomhedMetadata.sammensatStatus"
],
"query": {
"bool": {
"must": [
{
"term": {
"Vrvirksomhed.cvrNummer": "61126228"
}
},
{
"nested": {
"inner_hits": {},
"path": "Vrvirksomhed.deltagerRelation",
"query": {
"nested": {
"path": "Vrvirksomhed.deltagerRelation.organisationer",
"query": {
"bool": {
"must": [
{
"match": {
"Vrvirksomhed.deltagerRelation.organisationer.hovedtype": "REVISION"
}
},
{
"nested": {
"path": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData",
"query": {
"nested": {
"path": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter",
"query": {
"nested": {
"path": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier",
"query": {
"bool": {
"must": [
{
"exists": {
"field": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier.periode.gyldigFra"
}
}
],
"must_not": [
{
"exists": {
"field": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier.periode.gyldigTil"
}
}
]
}
}
}
}
}
}
}
}
]
}
}
}
}
}
},
{
"nested": {
"inner_hits": {},
"path": "Vrvirksomhed.attributter",
"query": {
"bool": {
"should": [
{
"match": {
"Vrvirksomhed.attributter.type": "REGNSKABSÅR_SLUT"
}
},
{
"match": {
"Vrvirksomhed.attributter.type": "REGNSKABSÅR_START"
}
}
]
}
}
}
}
]
}
}
}
评论
0赞
OJ Slott
11/3/2023
这真是太棒了——非常感谢。我测试了它,它现在或多或少按预期返回。我可以在查询中看到它只有“gyldigFra”的 exist - 字段。应该为 NULL 的“gyldigTil”呢?
0赞
Joe - Check out my books
11/3/2023
@imotov为什么需要多个嵌套级别的查询呢?最后一个子句()还不够吗?exists
Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier
0赞
imotov
11/4/2023
@OJSlott抱歉,您在 IS NULL 和 IS NOT NULL 子句中都有 gyldigFra,所以它看起来像一个错别字,但我无法弄清楚您只是添加了两次,还是您打算使用另一个字段或其他东西,所以我把它留给观众作为家庭作业。我更新了我的答案以包含它。
1赞
imotov
11/4/2023
@Joe-GMapsBook.com 这是一个很好的问题。我记得 elasticsearch 在省略中间嵌套查询时遇到了一些问题,但我不太记得这些问题是什么。由于我没有 OJ Slott 的数据要测试,我决定遵循官方文档的建议,并在每个级别实施它。我怀疑你是对的,省略了对 medlemsData 和 attributter 的中间嵌套查询应该有效并且应该更新文档,但我需要做一些额外的研究才能 100% 确定并建议偏离官方建议。
0赞
Joe - Check out my books
11/4/2023
谢谢@imotov。根据我的经验,最内层应该没问题,但你可能是对的。
评论