You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:23:56