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
相关产品推荐
相关产品推荐

