如何将指定SQL查询转换为带named query的Elasticsearch查询?
SQL转Elasticsearch查询(带命名查询)
首先你的SQL查询逻辑可以简化,因为OR两边的条件完全一致,等价于:
SELECT * FROM products WHERE stock_code = '1234' AND category_code = '3214'
如果要严格遵循原始SQL的OR结构(即使重复),对应的Elasticsearch查询(带命名查询)结构如下:
Elasticsearch DSL 示例
{ "query": { "bool": { "should": [ { "bool": { "must": [ { "match": { "stock_code": { "query": "1234", "_name": "stock_code_1234" } } }, { "match": { "category_code": { "query": "3214", "_name": "category_code_3214" } } } ] } }, { "bool": { "must": [ { "match": { "stock_code": { "query": "1234", "_name": "stock_code_1234" } } }, { "match": { "category_code": { "query": "3214", "_name": "category_code_3214" } } } ] } } ], "minimum_should_match": 1 } } }
对应PHP代码实现(基于你提供的代码完善)
原始代码的嵌套结构有误,调整为正确的bool嵌套逻辑,同时为每个条件添加命名:
// 初始化参数数组 $params = []; // 构造(stock_code AND category_code)条件组 $conditionGroup = [ 'bool' => [ 'must' => [ [ 'match' => [ 'stock_code' => [ 'query' => $val->stock_code, '_name' => "stock_code_{$val->stock_code}" ] ] ], [ 'match' => [ 'category_code' => [ 'query' => $val->category_code, '_name' => "category_code_{$val->category_code}" ] ] ] ] ] ]; // 加入两个相同的条件组(对应SQL的OR逻辑) $params['body']['query']['bool']['should'][] = $conditionGroup; $params['body']['query']['bool']['should'][] = $conditionGroup; // 显式声明should至少匹配1个条件(默认值,可省略) $params['body']['query']['bool']['minimum_should_match'] = 1;
关键说明
- 每个查询的
_name字段会在结果的matched_queries数组中返回,用于获取匹配的查询信息。 - 由于SQL中OR两边条件完全重复,实际使用中只需保留一个条件组,效果完全一致且更高效。
- 如果
stock_code和category_code是精确匹配的keyword类型字段,推荐用term查询替代match,性能更优:
'term' => [ 'stock_code.keyword' => [ 'value' => $val->stock_code, '_name' => "stock_code_{$val->stock_code}" ] ]
内容的提问来源于stack exchange,提问作者Saadi Andishmand
相关产品推荐
相关产品推荐

