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

Laravel 集成 Elasticsearch 如何实现多字段搜索查询

解决方案

首先你需要确认Elasticsearch中存储的data字段为Object类型(无特殊自定义mapping的情况下,ES存入JSON结构会自动映射为该类型),嵌套子字段的查询路径需要用.拼接父字段和子字段,比如data.description。

场景1:多字段精确匹配(多条件为「和」关系)

如果你需要同时满足data.type = "room"、data.description = "asdsad"这类多条件精确匹配,调整查询语句为bool+must组合多个term查询即可,代码示例:

$responses = Utils::all([$client->post('http://es:9200/indexes/_search',
    [
        'body' => json_encode(
            [
                'query' => [
                    'bool' => [
                        'must' => [
                            // 第一个条件:data.type 精确匹配room
                            ['term' => ['data.type' => 'room']],
                            // 第二个条件:data.description 精确匹配asdsad
                            ['term' => ['data.description' => 'asdsad']],
                            // 可按需求继续添加更多匹配条件
                            // ['term' => ['data.post_code' => '627155']]
                        ]
                    ]
                ]
            ]
        )
    ])
])->wait();

如果需要多条件为「或」关系,把上述代码中的must替换为should即可。

场景2:多字段全文匹配(同一个关键词命中任意指定字段即可)

如果你需要在data.title、data.description这类文本字段中,用同一个关键词做模糊匹配,直接用multi_match查询更高效,代码示例:

$q = 'asdsad'; // 搜索关键词
$responses = Utils::all([$client->post('http://es:9200/indexes/_search',
    [
        'body' => json_encode(
            [
                'query' => [
                    'multi_match' => [
                        'query' => $q,
                        'fields' => ['data.title', 'data.description', 'data.post_code'] // 指定需要搜索的多个字段
                    ]
                ]
            ]
        )
    ])
])->wait();

注意事项

  • term为精确匹配查询,适合类型、邮编这类枚举/短编码字段;如果是标题、描述这类需要分词的长文本字段,把term替换为match即可实现模糊匹配。
  • 如果你手动将data字段设置为了nested类型,查询需要额外加nested属性配置,默认自动映射的Object类型不需要额外调整。

内容的提问来源于stack exchange,提问作者KurlK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:00:00