ElasticSearch日记之查询表达式入门语法--Bluesky
最近项目中因为有些大数据量的查询,在原有的Mysql深感性能不足,于是开始了对ElasticSearch的摸索。我喜欢写原生的查询语句,虽然Github上有工程可以支持直接写sql,不需要会写ES的语句,或者spring data jpa 集成ES的工程,但是鄙人才疏学浅,这种集成的工程报错类型排查困难,相关错误帖子也不多,所以直接采用原生的查询体,这样报错可以在很多帖子上查询到。我将会用sql转变为ES查询体,再转换为代码的思维来解释我所摸索的东西。
关于ES的安装自行百度,ES安装一般是附带kibana的,可以管理ES,也可以当成一个执行ES查询体的网页工具,想写什么语句进行调试学习很方便。
ElasticSearch官方文档链接
链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
条件查询
-
单条件查询
sql:select * from table where id = ?
怎么样,sql看上去简单吧!
那就翻译成ES查询体,去哪可以直接写ES查询体,kibana这时候就是个好东西了,用kibana写语句的时候是会有自动提示和候选词。
首先要知道ES的查询体的几个关键词:PUT(增),DELETE(删),POST(改),GET(查),这理解吧
ES查询体GET my_index/_search { "query": { "term": { "id": { "value": "?" } } } }
ok,这里就要解释一下了,my_index 代表你要查询的那个索引,不懂这玩意儿的话先去百度下ElasticSearch储存机制,可以通过自己在kibana写一个创建语句执行,玩一玩就知道怎么回事了。/_search restful风格,代表后面跟着的{}大括号里面写的是查询体,当然还有 _mapping(查看数据格式类型) _setting(设置) 等等。
{}大括号里面其实是个json,查询首先需要query, 那term是什么意思呢?其实是精确查找的意思,因为sql是根据id查询,那就是根据id精确查找,对不对。
注意term跟terms是不一样的,具体后面再说。
看到没有,输入term回车,直接帮你补全,后面怎么写看的懂了吧。FIELD填写要查询的字段,VALUE就代表你要查询的具体值。
Sql翻译成ES查询体了,接下来翻译成java代码。
Java 代码实现
1.pom.xml
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.7.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.7.0</version>
</dependency>
PS:用的是官方推荐的Rest high level client,之前用过JestClient后者在版本方面有优势,ElasticSearch版本切换的不需要更换JestClient,前者Client需要跟着ElasticSearch版本走,但是经过本人压测两种client执行es查询的时候,后者单台服务器只能到200TPS,并且抖动较大,而Rest high level client单台能达到800TPS,数据来自于阿里云压力测试,果断放弃JestClient,如果对性能要求不高的大佬可以使用,本人做电商的,所以需要性能更好的。
2.设置Client参数
import lombok.Getter;
import lombok.Setter;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client