{"id":15671605,"url":"https://github.com/kanlon/elasticsearch-sql","last_synced_at":"2025-10-15T15:09:31.994Z","repository":{"id":62166052,"uuid":"523337638","full_name":"KANLON/elasticsearch-sql","owner":"KANLON","description":"Convert Elasticsearch DSL to  SQL   Or  Convert Sql To Elasticsearch DSL ; SQL 与  Elasticsearch DSL 语言相互转换的工具模块","archived":false,"fork":false,"pushed_at":"2022-10-27T15:41:32.000Z","size":126,"stargazers_count":6,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-31T02:41:13.630Z","etag":null,"topics":["elasticsearch","java","sql"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KANLON.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-08-10T12:37:28.000Z","updated_at":"2024-10-30T16:34:17.000Z","dependencies_parsed_at":"2022-10-27T16:45:21.401Z","dependency_job_id":null,"html_url":"https://github.com/KANLON/elasticsearch-sql","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KANLON%2Felasticsearch-sql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KANLON%2Felasticsearch-sql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KANLON%2Felasticsearch-sql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KANLON%2Felasticsearch-sql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KANLON","download_url":"https://codeload.github.com/KANLON/elasticsearch-sql/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252763598,"owners_count":21800533,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["elasticsearch","java","sql"],"created_at":"2024-10-03T15:04:00.999Z","updated_at":"2025-10-15T15:09:26.948Z","avatar_url":"https://github.com/KANLON.png","language":"Java","readme":"# elasticsearch-sql\n\nConvert Elasticsearch DSL to SQL Or Convert Sql To Elasticsearch DSL \n\n这个项目主要是将ElasticSearch DSL 转成 SQL 或者将 SQL 转成 ElasticSearch DSL 的工具模块 \n\n#  使用说明\n\nmaven 引用\n\n```pom\n\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.kanlon\u003c/groupId\u003e\n    \u003cartifactId\u003eelasticsearch-sql\u003c/artifactId\u003e\n    \u003cversion\u003e1.0.1\u003c/version\u003e\n\u003c/dependency\u003e\n\n```\n\n主要使用这个工具类 ： SQLToEsDSLUtils\n\n\n然后按照如下单元测试例子中直接使用即可将SQL转为ES 的DSL 语言\n\n\n# 代码示例\n\n```java\npublic class SqlToEsDslUtilsTest {\n    /**\n     * 测试sql es dsl\n     */\n    @Test\n    public void testSqlToEsDsl() {\n        String sql1 = \"select appid,uid,`dt`,dt_time,time from    default.test_t1 where dt_time\u003e='202105081313+0800' and dt_time \u003c='202105081413+0800' and appid = '15013' and uid in ('2524712316','2706555022')  order by dt_time desc,time desc limit 0,5\";\n        String sql2 = \"select count(1) from    default.test_t2 where dt='12' and country like '%张三%'\";\n        String sql3 = \"select * from    default.test_t3 where dt='asdf' limit 10 \";\n        String sql4 = \"select count(1) from ( select * from    default.test_t4 where dt='asdf' limit 10 union all  select * from    default.test_t3 where dt='asdf' limit 10  union all  select * from    default.test_t4 where dt='asdf' limit 10 )t \";\n        String sql5 = \"select * from    default.test_t5 where dt='adsf' union all  select * from    default.test12 where dt='12'  union all  select * from    default.test_t7 where dt='12' order by desc  limit 10 \";\n        String sql6 = \"SELECT * FROM `default.test_t6` WHERE dt_time \u003e= '202105091817+0800'  AND dt_time \u003c= '202105111817+0800'  AND country LIKE '%中国黑龙江绥化%' UNION ALL SELECT * FROM `default.test_t7` WHERE dt_time \u003e= '202105091817+0800'  AND dt_time \u003c= '202105111817+0800'  AND country LIKE '%中国黑龙江绥化%' UNION ALL SELECT * FROM `default.test_t123` WHERE dt_time \u003e= '202105091817+0800'  AND dt_time \u003c= '202105111817+0800'  AND country LIKE '%中国黑龙江绥化%' LIMIT 10\";\n        String sql7 = \"SELECT count(1) AS num FROM (  SELECT *  FROM `default.test_t7`  WHERE dt_time \u003e= '202105092057+0800'   AND dt_time \u003c= '202105112057+0800'   AND act = '7609'  UNION ALL  SELECT *  FROM `default.test_t8`  WHERE dt_time \u003e= '202105092057+0800'   AND dt_time \u003c= '202105112057+0800'   AND act = '7609'  UNION ALL  SELECT *  FROM `default.test_t11,`  WHERE dt_time \u003e= '202105092057+0800'   AND dt_time \u003c= '202105112057+0800'   AND act = '7609'  LIMIT 2147483647 ) temp_t \";\n        String sql8 = \"SELECT * FROM `default.test_t8` WHERE dt_time \u003e= '202105092057+0800'  AND dt_time \u003c= '202105112057+0800'  AND act = '7609' UNION ALL SELECT * FROM `default.test_t11` WHERE dt_time \u003e= '202105092057+0800'  AND dt_time \u003c= '202105112057+0800'  AND act = '7609' UNION ALL SELECT * FROM `default.test_t13` WHERE dt_time \u003e= '202105092057+0800'  AND dt_time \u003c= '202105112057+0800'  AND act = '7609' LIMIT 10\";\n        try {\n            // 下面得到的实例信息，toString 之后，是原生es的 DSL 语法，将该json 作为body可以直接通过ES 的RESTful API查询es\n            String expRet1 = \"{\\\"from\\\":0,\\\"size\\\":5,\\\"query\\\":{\\\"bool\\\":{\\\"must\\\":[{\\\"range\\\":{\\\"dt_time\\\":{\\\"from\\\":\\\"202105081313+0800\\\",\\\"to\\\":null,\\\"include_lower\\\":true,\\\"include_upper\\\":true,\\\"boost\\\":1.0}}},{\\\"range\\\":{\\\"dt_time\\\":{\\\"from\\\":null,\\\"to\\\":\\\"202105081413+0800\\\",\\\"include_lower\\\":true,\\\"include_upper\\\":true,\\\"boost\\\":1.0}}},{\\\"term\\\":{\\\"appid\\\":{\\\"value\\\":\\\"15013\\\",\\\"boost\\\":1.0}}},{\\\"terms\\\":{\\\"uid\\\":[\\\"2524712316\\\",\\\"2706555022\\\"],\\\"boost\\\":1.0}}],\\\"adjust_pure_negative\\\":true,\\\"boost\\\":1.0}},\\\"_source\\\":{\\\"includes\\\":[\\\"dt\\\",\\\"uid\\\",\\\"appid\\\",\\\"time\\\",\\\"dt_time\\\"],\\\"excludes\\\":[]},\\\"sort\\\":[{\\\"dt_time\\\":{\\\"order\\\":\\\"desc\\\"}},{\\\"time\\\":{\\\"order\\\":\\\"desc\\\"}}]}\";\n            String actRet1 = SQLToEsDSLUtils.sqlToEsDslQueryBody(sql1).toString();\n            Assert.assertEquals(expRet1, actRet1);\n\n            String expRet2 = \"{\\\"query\\\":{\\\"bool\\\":{\\\"must\\\":[{\\\"term\\\":{\\\"dt\\\":{\\\"value\\\":\\\"12\\\",\\\"boost\\\":1.0}}},{\\\"wildcard\\\":{\\\"country\\\":{\\\"wildcard\\\":\\\"*张三*\\\",\\\"boost\\\":1.0}}}],\\\"adjust_pure_negative\\\":true,\\\"boost\\\":1.0}}}\";\n            String actRet2 = SQLToEsDSLUtils.sqlToEsDslQueryBody(sql2).toString();\n            Assert.assertEquals(expRet2, actRet2);\n\n            String expRet3 = \"{\\\"from\\\":0,\\\"size\\\":10,\\\"query\\\":{\\\"bool\\\":{\\\"must\\\":[{\\\"term\\\":{\\\"dt\\\":{\\\"value\\\":\\\"asdf\\\",\\\"boost\\\":1.0}}}],\\\"adjust_pure_negative\\\":true,\\\"boost\\\":1.0}}}\";\n            String actRet3 = SQLToEsDSLUtils.sqlToEsDslQueryBody(sql3).toString();\n            Assert.assertEquals(expRet3, actRet3);\n\n            String expRet4 = \"{\\\"query\\\":{\\\"bool\\\":{\\\"must\\\":[{\\\"term\\\":{\\\"dt\\\":{\\\"value\\\":\\\"asdf\\\",\\\"boost\\\":1.0}}}],\\\"adjust_pure_negative\\\":true,\\\"boost\\\":1.0}}}\";\n            String actRet4 = SQLToEsDSLUtils.sqlToEsDslQueryBody(sql4).toString();\n            Assert.assertEquals(expRet4, actRet4);\n\n            String expRet5 = \"{\\\"from\\\":0,\\\"size\\\":10,\\\"query\\\":{\\\"bool\\\":{\\\"must\\\":[{\\\"term\\\":{\\\"dt\\\":{\\\"value\\\":\\\"adsf\\\",\\\"boost\\\":1.0}}}],\\\"adjust_pure_negative\\\":true,\\\"boost\\\":1.0}},\\\"sort\\\":[{\\\"desc\\\":{\\\"order\\\":\\\"desc\\\"}}]}\";\n            String actRet5 = SQLToEsDSLUtils.sqlToEsDslQueryBody(sql5).toString();\n            Assert.assertEquals(expRet5, actRet5);\n\n            String expRet6 = \"{\\\"from\\\":0,\\\"size\\\":10,\\\"query\\\":{\\\"bool\\\":{\\\"must\\\":[{\\\"range\\\":{\\\"dt_time\\\":{\\\"from\\\":\\\"202105091817+0800\\\",\\\"to\\\":null,\\\"include_lower\\\":true,\\\"include_upper\\\":true,\\\"boost\\\":1.0}}},{\\\"range\\\":{\\\"dt_time\\\":{\\\"from\\\":null,\\\"to\\\":\\\"202105111817+0800\\\",\\\"include_lower\\\":true,\\\"include_upper\\\":true,\\\"boost\\\":1.0}}},{\\\"wildcard\\\":{\\\"country\\\":{\\\"wildcard\\\":\\\"*中国黑龙江绥化*\\\",\\\"boost\\\":1.0}}}],\\\"adjust_pure_negative\\\":true,\\\"boost\\\":1.0}}}\";\n            String actRet6 = SQLToEsDSLUtils.sqlToEsDslQueryBody(sql6).toString();\n            Assert.assertEquals(expRet6, actRet6);\n\n            String expRet7 = \"{\\\"query\\\":{\\\"bool\\\":{\\\"must\\\":[{\\\"range\\\":{\\\"dt_time\\\":{\\\"from\\\":\\\"202105092057+0800\\\",\\\"to\\\":null,\\\"include_lower\\\":true,\\\"include_upper\\\":true,\\\"boost\\\":1.0}}},{\\\"range\\\":{\\\"dt_time\\\":{\\\"from\\\":null,\\\"to\\\":\\\"202105112057+0800\\\",\\\"include_lower\\\":true,\\\"include_upper\\\":true,\\\"boost\\\":1.0}}},{\\\"term\\\":{\\\"act\\\":{\\\"value\\\":\\\"7609\\\",\\\"boost\\\":1.0}}}],\\\"adjust_pure_negative\\\":true,\\\"boost\\\":1.0}}}\";\n            String actRet7 = SQLToEsDSLUtils.sqlToEsDslQueryBody(sql7).toString();\n            Assert.assertEquals(expRet7, actRet7);\n\n            String expRet8 = \"{\\\"from\\\":0,\\\"size\\\":10,\\\"query\\\":{\\\"bool\\\":{\\\"must\\\":[{\\\"range\\\":{\\\"dt_time\\\":{\\\"from\\\":\\\"202105092057+0800\\\",\\\"to\\\":null,\\\"include_lower\\\":true,\\\"include_upper\\\":true,\\\"boost\\\":1.0}}},{\\\"range\\\":{\\\"dt_time\\\":{\\\"from\\\":null,\\\"to\\\":\\\"202105112057+0800\\\",\\\"include_lower\\\":true,\\\"include_upper\\\":true,\\\"boost\\\":1.0}}},{\\\"term\\\":{\\\"act\\\":{\\\"value\\\":\\\"7609\\\",\\\"boost\\\":1.0}}}],\\\"adjust_pure_negative\\\":true,\\\"boost\\\":1.0}}}\";\n            String actRet8 = SQLToEsDSLUtils.sqlToEsDslQueryBody(sql8).toString();\n            Assert.assertEquals(expRet8, actRet8);\n            // 下面的包含 index信息，通过得到的这个 SearchRequest 这个实例 ，可以由该实例传到RestHighLevelClient#search 中去es查询获取结果\n            System.out.println(\"转化sql1的请求参数结果：\" + SQLToEsDSLUtils.sqlToEsSearchRequest(sql1));\n            System.out.println(\"转化sql2的请求参数结果：\" + SQLToEsDSLUtils.sqlToEsSearchRequest(sql2));\n            System.out.println(\"转化sql3的请求参数结果：\" + SQLToEsDSLUtils.sqlToEsSearchRequest(sql3));\n            System.out.println(\"转化sql4的请求参数结果：\" + SQLToEsDSLUtils.sqlToEsSearchRequest(sql4));\n            System.out.println(\"转化sql5的请求参数结果：\" + SQLToEsDSLUtils.sqlToEsSearchRequest(sql5));\n            System.out.println(\"转化sql6的请求参数结果：\" + SQLToEsDSLUtils.sqlToEsSearchRequest(sql6));\n            System.out.println(\"转化sql7的请求参数结果：\" + SQLToEsDSLUtils.sqlToEsSearchRequest(sql7));\n            System.out.println(\"转化sql8的请求参数结果：\" + SQLToEsDSLUtils.sqlToEsSearchRequest(sql8));\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}\n```\n\n运行结果\n\n```\n转化sql1的请求参数结果：SearchRequest{searchType=QUERY_THEN_FETCH, indices=[default.test_t1], indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false, ignore_throttled=true], types=[], routing='null', preference='null', requestCache=null, scroll=null, maxConcurrentShardRequests=0, batchedReduceSize=512, preFilterShardSize=128, allowPartialSearchResults=null, localClusterAlias=null, getOrCreateAbsoluteStartMillis=-1, ccsMinimizeRoundtrips=true, source={\"from\":0,\"size\":5,\"query\":{\"bool\":{\"must\":[{\"range\":{\"dt_time\":{\"from\":\"202105081313+0800\",\"to\":null,\"include_lower\":true,\"include_upper\":true,\"boost\":1.0}}},{\"range\":{\"dt_time\":{\"from\":null,\"to\":\"202105081413+0800\",\"include_lower\":true,\"include_upper\":true,\"boost\":1.0}}},{\"term\":{\"appid\":{\"value\":\"15013\",\"boost\":1.0}}},{\"terms\":{\"uid\":[\"2524712316\",\"2706555022\"],\"boost\":1.0}}],\"adjust_pure_negative\":true,\"boost\":1.0}},\"_source\":{\"includes\":[\"dt\",\"uid\",\"appid\",\"time\",\"dt_time\"],\"excludes\":[]},\"sort\":[{\"dt_time\":{\"order\":\"desc\"}},{\"time\":{\"order\":\"desc\"}}]}}\n转化sql2的请求参数结果：SearchRequest{searchType=QUERY_THEN_FETCH, indices=[default.test_t2], indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false, ignore_throttled=true], types=[], routing='null', preference='null', requestCache=null, scroll=null, maxConcurrentShardRequests=0, batchedReduceSize=512, preFilterShardSize=128, allowPartialSearchResults=null, localClusterAlias=null, getOrCreateAbsoluteStartMillis=-1, ccsMinimizeRoundtrips=true, source={\"query\":{\"bool\":{\"must\":[{\"term\":{\"dt\":{\"value\":\"12\",\"boost\":1.0}}},{\"wildcard\":{\"country\":{\"wildcard\":\"*张三*\",\"boost\":1.0}}}],\"adjust_pure_negative\":true,\"boost\":1.0}}}}\n转化sql3的请求参数结果：SearchRequest{searchType=QUERY_THEN_FETCH, indices=[default.test_t3], indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false, ignore_throttled=true], types=[], routing='null', preference='null', requestCache=null, scroll=null, maxConcurrentShardRequests=0, batchedReduceSize=512, preFilterShardSize=128, allowPartialSearchResults=null, localClusterAlias=null, getOrCreateAbsoluteStartMillis=-1, ccsMinimizeRoundtrips=true, source={\"from\":0,\"size\":10,\"query\":{\"bool\":{\"must\":[{\"term\":{\"dt\":{\"value\":\"asdf\",\"boost\":1.0}}}],\"adjust_pure_negative\":true,\"boost\":1.0}}}}\n转化sql4的请求参数结果：SearchRequest{searchType=QUERY_THEN_FETCH, indices=[default.test_t4, default.test_t3], indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false, ignore_throttled=true], types=[], routing='null', preference='null', requestCache=null, scroll=null, maxConcurrentShardRequests=0, batchedReduceSize=512, preFilterShardSize=128, allowPartialSearchResults=null, localClusterAlias=null, getOrCreateAbsoluteStartMillis=-1, ccsMinimizeRoundtrips=true, source={\"query\":{\"bool\":{\"must\":[{\"term\":{\"dt\":{\"value\":\"asdf\",\"boost\":1.0}}}],\"adjust_pure_negative\":true,\"boost\":1.0}}}}\n转化sql5的请求参数结果：SearchRequest{searchType=QUERY_THEN_FETCH, indices=[default.test_t5, default.test12, default.test_t7], indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false, ignore_throttled=true], types=[], routing='null', preference='null', requestCache=null, scroll=null, maxConcurrentShardRequests=0, batchedReduceSize=512, preFilterShardSize=128, allowPartialSearchResults=null, localClusterAlias=null, getOrCreateAbsoluteStartMillis=-1, ccsMinimizeRoundtrips=true, source={\"from\":0,\"size\":10,\"query\":{\"bool\":{\"must\":[{\"term\":{\"dt\":{\"value\":\"adsf\",\"boost\":1.0}}}],\"adjust_pure_negative\":true,\"boost\":1.0}},\"sort\":[{\"desc\":{\"order\":\"desc\"}}]}}\n转化sql6的请求参数结果：SearchRequest{searchType=QUERY_THEN_FETCH, indices=[default.test_t6, default.test_t7, default.test_t123], indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false, ignore_throttled=true], types=[], routing='null', preference='null', requestCache=null, scroll=null, maxConcurrentShardRequests=0, batchedReduceSize=512, preFilterShardSize=128, allowPartialSearchResults=null, localClusterAlias=null, getOrCreateAbsoluteStartMillis=-1, ccsMinimizeRoundtrips=true, source={\"from\":0,\"size\":10,\"query\":{\"bool\":{\"must\":[{\"range\":{\"dt_time\":{\"from\":\"202105091817+0800\",\"to\":null,\"include_lower\":true,\"include_upper\":true,\"boost\":1.0}}},{\"range\":{\"dt_time\":{\"from\":null,\"to\":\"202105111817+0800\",\"include_lower\":true,\"include_upper\":true,\"boost\":1.0}}},{\"wildcard\":{\"country\":{\"wildcard\":\"*中国黑龙江绥化*\",\"boost\":1.0}}}],\"adjust_pure_negative\":true,\"boost\":1.0}}}}\n转化sql7的请求参数结果：SearchRequest{searchType=QUERY_THEN_FETCH, indices=[default.test_t7, default.test_t8, default.test_t11,], indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false, ignore_throttled=true], types=[], routing='null', preference='null', requestCache=null, scroll=null, maxConcurrentShardRequests=0, batchedReduceSize=512, preFilterShardSize=128, allowPartialSearchResults=null, localClusterAlias=null, getOrCreateAbsoluteStartMillis=-1, ccsMinimizeRoundtrips=true, source={\"query\":{\"bool\":{\"must\":[{\"range\":{\"dt_time\":{\"from\":\"202105092057+0800\",\"to\":null,\"include_lower\":true,\"include_upper\":true,\"boost\":1.0}}},{\"range\":{\"dt_time\":{\"from\":null,\"to\":\"202105112057+0800\",\"include_lower\":true,\"include_upper\":true,\"boost\":1.0}}},{\"term\":{\"act\":{\"value\":\"7609\",\"boost\":1.0}}}],\"adjust_pure_negative\":true,\"boost\":1.0}}}}\n转化sql8的请求参数结果：SearchRequest{searchType=QUERY_THEN_FETCH, indices=[default.test_t8, default.test_t11, default.test_t13], indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false, ignore_throttled=true], types=[], routing='null', preference='null', requestCache=null, scroll=null, maxConcurrentShardRequests=0, batchedReduceSize=512, preFilterShardSize=128, allowPartialSearchResults=null, localClusterAlias=null, getOrCreateAbsoluteStartMillis=-1, ccsMinimizeRoundtrips=true, source={\"from\":0,\"size\":10,\"query\":{\"bool\":{\"must\":[{\"range\":{\"dt_time\":{\"from\":\"202105092057+0800\",\"to\":null,\"include_lower\":true,\"include_upper\":true,\"boost\":1.0}}},{\"range\":{\"dt_time\":{\"from\":null,\"to\":\"202105112057+0800\",\"include_lower\":true,\"include_upper\":true,\"boost\":1.0}}},{\"term\":{\"act\":{\"value\":\"7609\",\"boost\":1.0}}}],\"adjust_pure_negative\":true,\"boost\":1.0}}}}\n```\n\n\n# 目前支持的语法\n\n当前只支持条件为and条件连接的，还不支持的复杂的条件嵌套和不支持函数；其他基本就是mysql的语法\n\n查询的表会作为es的index（索引），查询的列作为field（Document中的字段，是文档中的某一个属性）返回 \n\n例如：\n \n支持 \n```sql\nselect col1,col2 from t where a in (1) and b =2 and dt\u003e=\"2022-01-01\"\n```\n\n不支持\n```sql\nselect col1,col2 from t where a in (1) and b =2 and dt\u003e=\"2022-01-01\" or ( d in (10,22) )\n``` \n\n\n\n- [x] SQL Select  \n- [x] SQL Where  \n- [x] SQL Order by\n- [x] SQL And \u0026 Or\n- [x] SQL In\n- [x] SQL like\n- [x] SQL Between And\n- [x] SQL union all (这个需要确保条件一样，只是查询的表不一样)\n- [x] SQL Limit\n- [ ] SQL Is\n- [ ] SQL Not\n- [ ] SQL Null\n- [ ] SQL Group by\n\n# 项目功能搭建思路\n\n主要使用Druid的SQL解析工具，将SQL解析成AST(抽象语法树)，然后重新组装为ES的DSL信息\n\u003e在计算机科学中，抽象语法树（Abstract Syntax Tree，AST），或简称语法树（Syntax tree），是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构，树上的每个节点都表示源代码中的一种结构。\n\n\n```sql\nselect * from test_t \nwhere \nuser_id = 1 \nand (  \nproduct_id = 2 \nand (star_num = 4 or star_num = 5) \nand banned = 1)\n```\n\n例如这样SQL 可以转为 以下的AST的结构：\n\n![sql-ast](./resource/images/sql-ast.png)\n\n然后根据这样的AST再组装为ES的DSL格式就可以了 \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkanlon%2Felasticsearch-sql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkanlon%2Felasticsearch-sql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkanlon%2Felasticsearch-sql/lists"}