SQL 语句的弹性搜索 DSL 语法等价

Elastic search DSL Syntax equivalence for SQL statement

我正在尝试在弹性搜索查询中复制以下查询逻辑,但有些地方不对。

基本上 returns 一个文档下面的查询。我想要应用第一个条件:"name": "iphone" 更复杂的第二个条件:(username = 'gogadget' AND status_type = '1' AND created_time between 4532564 AND 64323238)。请注意,should 中的 nested bool must 会处理更复杂的情况。如果我将 "name": "iphone" 的外部匹配更改为 "name": "wrong value",我仍然应该看到 1 个文档。但是当我这样做时我什么也得不到。我不确定这是哪里错了。

SQL 查询在下方。

SELECT * from data_points 
WHERE name = 'iphone'
    OR 
(username = 'gogadget' AND status_type = '1' AND created_time between 4532564 AND 64323238) 


{
    "size": 30,
    "query": {
        "bool": {
            "must": [
                {
                    "bool": {
                        "minimum_should_match": "1",
                        "should": [
                            {
                                "bool": {
                                    "must": [
                                        {
                                            "match": {
                                                "username": "gogadget"
                                            }
                                        },
                                        {
                                            "terms": {
                                                "status_type": [
                                                    "3",
                                                    "4"
                                                ]
                                            }
                                        },
                                        {
                                            "range": {
                                                "created_time": {
                                                    "gte": 20140712,
                                                    "lte": 1405134711
                                                }
                                            }
                                        }
                                    ]
                                }
                            }
                        ],
                        "must": [],
                        "must_not": []
                    }
                },
                {
                    "match": {
                        "name": "iphone"
                    }
                }
            ]
        }
    }
}

should查询将匹配查询和return.

您不需要使用 must 来汇总您的 OR query

查询应该是这样的:

{
    "query": {
        "bool": {
            "should": [{
                "bool": {
                    "must": [{
                        "match": {
                            "username": "gogadget"
                        }
                    }, {
                        "terms": {
                            "status_type": [
                                "3",
                                "4"
                            ]
                        }
                    }, {
                        "range": {
                            "created_time": {
                                "gte": 20140712,
                                "lte": 1405134711
                            }
                        }
                    }]
                }
            }, {
                "match": {
                    "name": "iphone"
                }
            }]
        }
    }
}