Elasticsearch嵌套查询优化:从丹麦CVR Register筛选指定数组元素
丹麦CVR Register数据集成:Elasticsearch嵌套数组筛选解决方案
需求背景
已完成与丹麦CVR Register的基础集成,可正常拉取客户信息。现需在返回结果中新增两个数组对象attributter和deltagerRelation,并对两个数组做精准筛选:
筛选规则
- deltagerRelation数组筛选:仅保留满足以下全部条件的元素
organisationer.hovedtype为'REVISION'organisationer.medlemsData.attributter.vaerdier.periode.gyldigFra非空organisationer.medlemsData.attributter.vaerdier.periode.gyldigTil为空
- attributter数组筛选:仅保留类型为
'REGNSKABSÅR_SLUT'或'REGNSKABSÅR_START'的元素
解决方案:调整嵌套查询结构
由于数组对象属于嵌套类型,普通查询无法精准筛选数组内的元素(会返回包含任意符合条件元素的整个数组),需使用Elasticsearch的nested查询结合inner_hits来实现仅返回符合条件的数组元素。
以下是实现上述需求的查询示例:
{ "query": { "bool": { "must": [ // 基础查询条件(示例:拉取特定vrNummer的客户信息) { "match": { "vrNummer": "12345678" } }, // 筛选deltagerRelation的嵌套查询 { "nested": { "path": "Vrvirksomhed.deltagerRelation", "query": { "bool": { "must": [ { "term": { "Vrvirksomhed.deltagerRelation.organisationer.hovedtype": "REVISION" } }, { "exists": { "field": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier.periode.gyldigFra" } }, { "bool": { "must_not": { "exists": { "field": "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter.vaerdier.periode.gyldigTil" } } } } ] } }, "inner_hits": {} // 返回符合条件的deltagerRelation元素 } }, // 筛选attributter的嵌套查询 { "nested": { "path": "Vrvirksomhed.attributter", "query": { "terms": { "Vrvirksomhed.attributter.type": ["REGNSKABSÅR_SLUT", "REGNSKABSÅR_START"] } }, "inner_hits": {} // 返回符合条件的attributter元素 } } ] } } }
关键说明
- 使用
nested查询指定数组字段的路径,确保查询逻辑作用于数组内的单个元素 - 通过
exists和must_not exists判断日期字段的非空/空值状态 inner_hits用于在返回结果中仅保留符合筛选条件的数组元素,而非整个数组- 若索引未将这两个数组字段设置为
nested类型,需先更新索引映射:
{ "mappings": { "properties": { "Vrvirksomhed": { "properties": { "deltagerRelation": { "type": "nested" }, "attributter": { "type": "nested" } } } } } }
内容的提问来源于stack exchange,提问作者OJ Slott
相关产品推荐
相关产品推荐

