AND OR查询弹性搜索

时间:2017-08-14 20:43:10

标签: php sql elasticsearch

我需要根据AND,OR查询动态制作弹性搜索查询。

用户输入类似于SQL格式的字符串:

((("query1 query2" OR query3) OR query4) AND (query5 OR query6)) AND query7

我将它解析为数组:

[
    'AND' => [
        [
            'AND' => [
                [
                    'OR' => [
                        [
                            'OR' => [
                                '" query1 query 2"',
                                'query3'
                            ]
                        ],
                        'query4'
                    ]
                ],
                [
                    'OR' => [
                        'query5',
                        'query6'
                    ]
                ]
            ]

        ],
        'query7'
    ]

]

基于这个数组,我需要搜索一个字段。

类似的东西:

{"bool":{"must":[{"match":{"title":"research"}},{"match":{"title":"lecturer"}}]}}

但是我坚持使用嵌套条件。请指教。

2 个答案:

答案 0 :(得分:1)

您可以将嵌套bool用于嵌套条件。

((("query1 query 2" OR query3) OR query4) AND (query5 OR query6)) AND query7

可表示为:

{
    "query" : {
        "bool":{
            "must" : [
                {           
                    "bool":{    // ((("query1 query 2" OR query3) OR query4) AND (query5 OR query6)) 
                        "must" : [  
                            {
                                "bool":{    // (("query1 query 2" OR query3) OR query4)
                                    "should" : [                                    
                                        {
                                            "bool":{    // ("query1 query 2" OR query3)
                                                "should" : [
                                                    {"match": // query1 query2},
                                                    {"match": // query3}
                                                ]
                                            }
                                        },
                                        {"match": // query4}
                                    ]
                                }
                            },
                            {
                                "bool":{    // (query5 OR query6)
                                    "should" : [
                                        {"match": // query5},
                                        {"match": // query6}
                                    ]
                                }
                            }
                        ]
                    }
                },
                {match":    //...  query7}
            ]
        }   
    }
}

答案 1 :(得分:0)

我已经创建了一个小型库 SqlElasticSearchQueryConverter