Elasticsearch能把普通的sql翻译成DSL的插件

一、前言

      作为一名phper,之前查询数据之类用的都是普通的sql,现在突然要用ES的DSL查询,实在是有点艰难。刚好在看大佬博客的时候,看到大佬提了一句关于sql转化的插件,于是立马去研究一下。

二、那些年我们研究过的插件

1、ElasticHQ工具

(1)下载安装
(2)本地安装python 3.4+
(3)进入安装ElasticHQ的主目录,执行:pip install -r requirements.txt
(4)进入安装ElasticHQ的主目录,启动服务器命令:python3 application.py
(5)浏览器输入:localhost:5000
(6)官方文档:http://docs.elastichq.org/installation.html

      没找到那个tool,也没找到翻译功能,不知道人家的页面是怎么弄的。大神成功翻译的截图:https://blog.csdn.net/laoyang360/article/details/78556221

2、Elasticsearch-sql工具

(1)可以在浏览器直接通过sql的形式获取数据

(2)可以把普通的sql转化为DSL语言

(3)官方文档:https://github.com/NLPchina/elasticsearch-sql

(4)优秀博客:https://blog.csdn.net/cb2474600377/article/details/78181974

(5)注意:在elasticsearch 1.x / 2.x上,可以直接访问elasticsearch-sql web前端页面:

	http://localhost:9200/_plugin/sql/
在elasticsearch 5.x / 6.x上,需要先下载个网站插件 download and extract site.  链接:https://github.com/NLPchina/elasticsearch-sql/releases/download/5.4.1.0/es-sql-site-standalone.zip

(6)下载浏览器插件,然后依次执行:
	cd site-server
	npm install express --save    	//npm install
	node node-server.js 		//这个命令执行之后,输入框没什么明显反应,此时直接访问端口即可
	
(7)elasticsearch-sql的默认端口是8080,可以在site-server/site_configuration.json文件中进行修改 

(8)浏览器能正常访问之后,在右上角有一个地址,这个地址要填上我们的ES的地址,例如:locahost:9200

3、能把mysql的sql转化为es的DSL的php操作类库

github:https://github.com/qieangel2013/EsParser
(PS:这个我测试了下,只能翻译很简单的sql,而且没人维护了。。,不建议使用)

三、测试sql转化(Elasticsearch-sql)

下载安装了三个类库,只有这个能用了,测试一下下。。

1、写一个简单的sql

select * from test_access2/test_2 where name='chero_devel.ucool.com' limit 1,2

2、使用es-sql生成DSL

{
	"from": 1,
	"size": 2,
	"query": {
		"bool": {
			"filter": [
				{
					"bool": {
						"must": [
							{
								"match_phrase": {
									"name": {
										"query": "chero_devel.ucool.com",
										"slop": 0,
										"boost": 1
									}
								}
							}
						],
						"adjust_pure_negative": true,
						"boost": 1
					}
				}
			],
			"adjust_pure_negative": true,
			"boost": 1
		}
	}
}

      这部分博主是记录在记事本上的笔记,所以已经把DSL的括号什么的都对上了,看起来有点怪,各位见谅哈

3、在ES-PHP方法中按照生成的DSL查询

 public function actionTestSql()
   	 {
       		 $params = [
           		 'index' => 'test_access2',
           		 'type' => 'text_2',
            		    'body' => [
                    "from"=> 1,
	                "size"=> 2,
	                "query"=> [
                       "bool"=> [
                           "filter"=> [
                                    "bool"=>[
                                        "must"=>[
                                            "match_phrase"=> [
                                                //source.beat.name
                                                "source.beat.name"=> [
                                                    "query"=> "chero_devel.ucool.com",
                                                    "slop"=> 0,
                                                    "boost"=> 1
                                                    ]
								            ]
							            ],
                                          "adjust_pure_negative"=> true,
						                "boost"=> 1
						            ]
				            ],
			            "adjust_pure_negative"=> true,
			            "boost"=> 1
                         ]
		            ]
	        ]
       	 ];
        	$repos =  $this->client->search($params);
       	 var_dump($repos);exit;

    }

4、成功查到了数据

      但是,生成的格式是json的,php还要自己转化成数组的格式,然后调用API,实在是,有些过于痛苦了,只能提升一丢丢速度吧。切记要把中括号都对应好,不然对应不好的话,会报错:

	{"root_cause":[{"type":"parsing_exception","reason":"[bool] malformed query, expected [END_OBJECT] but found [FIELD_NAME]","line":1,"col":194}]

四、其他

1、ES聚合的性能优化

https://blog.csdn.net/wangmaohong0717/article/details/82429278

把group by和limit等转化为DSL:https://segmentfault.com/a/1190000014946753

2、ES通过父子文档的来实现mysql中的join问题

https://blog.csdn.net/ctwy291314/article/details/82781667  (ES6.0之后的父子级关系和6.0之前的父子级关系不一样,需要警惕)

3、我的理解

      测试了一整圈,发现最终还是要自己来拼写DSL查询了。既然涉及到大数据,那查询的sql也是很复杂的,这些插件都不怎么靠谱,翻译简单的还行,复杂的就直接报错。对,说的就是那个Elasticsearch-sql,随便一个复杂的sql直接报错了,日哦。

      不过,ES6.3发布之后,带来了很多新特性,参考;https://www.elastic.co/blog/elasticsearch-6-3-0-released 其中最大的亮点,莫过于内置支持SQL模块。不过截止到现在,6.7之后的版本已经把sql部分的工作作为GA(release)发布,单纯的sql查询是免费提供的功能,如果版本够新,还是用自带的更靠谱一些。

end

你可能感兴趣的:(Elasticsearch)