作为一名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,而且没人维护了。。,不建议使用)
下载安装了三个类库,只有这个能用了,测试一下下。。
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