Elasticsearch多字段精准过滤查询构建求助(Laravel Guzzle)
解决Laravel Guzzle构建Elasticsearch查询的问题
我明白你的需求:要精准匹配指定cvrNummer的公司文档,同时只返回三个特定部分的数据,而不是冗余的全部字段。原查询的问题在于只指定了要包含的字段,但没有对嵌套数组里的元素进行过滤,所以会返回整个数组的内容,而且缺失了你需要的部分嵌套数据。
下面是修正后的查询代码,我会逐部分解释:
$response = $client->post('cvr-permanent/_search', [ 'auth' => ['USERNAME', 'PASSWORD'], 'json' => [ "_source" => [ // 只保留deltager.navne的全部数据 "includes" => ["Vrvirksomhed.deltagerRelation.deltager.navne"] ], "query" => [ "bool" => [ "must" => [ // 匹配指定的cvrNummer ["term" => ["Vrvirksomhed.cvrNummer" => $vat]], // 嵌套查询:过滤Vrvirksomhed.attributter中type为KAPITAL的对象 [ "nested" => [ "path" => "Vrvirksomhed.attributter", "query" => [ "term" => ["Vrvirksomhed.attributter.type" => "KAPITAL"] ], "inner_hits" => [ "_source" => ["Vrvirksomhed.attributter.*"] // 返回匹配的KAPITAL属性 ] ] ], // 嵌套查询:过滤organisation.attributter中type为EJERANDEL_PROCENT的对象 [ "nested" => [ "path" => "Vrvirksomhed.deltagerRelation.organisation.attributter", "query" => [ "term" => ["Vrvirksomhed.deltagerRelation.organisation.attributter.type" => "EJERANDEL_PROCENT"] ], "inner_hits" => [ "_source" => ["Vrvirksomhed.deltagerRelation.organisation.attributter.*"] // 返回匹配的股权比例属性 ] ] ] ], "must_not" => [], "should" => [] ] ], "from" => 0, "size" => 10, "sort" => [] ] ]);
关键改动说明:
_source优化:明确用includes只保留你需要的deltager.navne全部数据,避免冗余内容。- 嵌套查询(Nested Query):因为
attributter是嵌套数组结构,必须用nested查询才能精准过滤数组中type符合条件的元素,同时通过inner_hits返回这些匹配的对象,而不是整个数组的所有元素。 - 精准字段路径匹配:每个嵌套查询指定对应的
path,确保查询的是正确的嵌套层级,避免因字段路径错误导致的匹配失败。
注意事项:
- 请确认你的Elasticsearch索引中,这些嵌套字段(比如
Vrvirksomhed.attributter、Vrvirksomhed.deltagerRelation.organisation.attributter)的映射类型是nested,而不是普通的object类型。如果是object类型,嵌套查询会失效,需要先修改索引映射。 - 如果需要同时返回多个匹配的嵌套元素,
inner_hits默认会返回所有匹配的结果,不需要额外配置。
这样修改后,查询结果会只包含你需要的三个部分数据,不会有冗余内容,而且能精准获取符合条件的属性对象。
内容的提问来源于stack exchange,提问作者Mike Nor
相关产品推荐
相关产品推荐

