RestHighLevelClient查询es
本篇分享的是es官网推荐的es客户端组件RestHighLevelClient的使用,其封装了操作es的crud方法,底层原理就是模拟各种es需要的请求,如put,delete,get等方式;本篇主要分享常用查询,希望能给大家带来好的帮助;
- 分页查询
条件查询
- 文本模糊匹配
- 时间范围匹配
超时设置
- es超时时间
- RestHighLevelClient发送请求的http响应超时时间
- 排序
- 指定返回列
- 模拟一个post获取es数据
准备工作
本人es服务端的版本是5.6.x,因此RestHighLevelClient建议同样引入相同主版本的包,相关参考文档(link):
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>5.6.</version>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.</version>
<scope>compile</scope>
</dependency>
作为客户端来说,我们需要知道es服务的ip:端口,以此来连接到服务端,对于es来说连接服务端其实就是往这个ip:端口上发送各种格式请求参数,如下创建个restclient:
public RestHighLevelClient client() {
Assert.requireNonEmpty(this.hosts, "无效的es连接");
return new RestHighLevelClient(
RestClient.builder(this.hosts).build()
);
}
分页查询
作为客户端来说resthighlevelclient的查询操作及其简单,只需要如下简短代码即可操作查询:
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
SearchRequest rq = new SearchRequest();
//索引
rq.indices(index);
//各种组合条件
rq.source(sourceBuilder); //请求
System.out.println(rq.source().toString());
SearchResponse rp = client().search(rq);
如上模板我们知道要完成一次查询,需要知道对应的索引和各种业务查询条件;索引是必须的,至于条件这里先来分页吧,可以通过如下方式设置页码:
from = from <= - ? : from;
size = size >= ? : size;
size = size <= ? : size;
//其实位置
sourceBuilder.from(from);
//每页数量
sourceBuilder.size(size);
条件查询
对于查询来说通常都有各种and和or的条件,可以通过SearchSourceBuilder的must和should来设置and和or关系,这里用到了must;
1.文本模糊匹配
对于es关键字或单词的查询我们可以借助QueryBuilders.wildcardQuery方法来操作,只需要指定es中对应的列和要查询的内容即可:
//模糊匹配
boolQueryBuilder.must(QueryBuilders.wildcardQuery(k, v.toString()));
2.时间范围匹配
相对时间条件来说,通常的需求都是按照范围来查询的,这里可以借助QueryBuilders.rangeQuery指定es中某列(k)的范围匹配:
boolQueryBuilder.must(
QueryBuilders.rangeQuery(k).
gte(format.format(mapV.get("start"))).
lt(format.format(mapV.get("end"))));
超时设置
使用RestHighLevelClient作为查询端,需要注意的超时时间有两种:es本身需要的时间和Rest发送http的响应时间
1.es超时时间
对于es服务端来说往往需要设置一下查询超时时间,尽管es是分布式查询较快并建立在多个lucence基础上聚合的查询,也需要设置超时时间,避免由于数据量过大或集群过大导致查询缓慢问题;
sourceBuilder.timeout(new TimeValue(timeOut, TimeUnit.SECONDS));
2.RestHighLevelClient发送请求的http响应超时时间
对应http来说往往会有一个响应的时长,超过时长后将不能再获取到数据,RestHighLevelClient作为以http方式请求es客户端这点需要注意;比如es查询需要10s,但是http设置了5s,数据就无法正常返回;
return new RestHighLevelClient(
RestClient.builder(this.hosts).
setMaxRetryTimeoutMillis( * ). //设置http客户请求时长
build()
);
排序
排序在业务中也是常用,es提供了默认排序和自定义排序,默认排序通常都是_score来排的,如下参数:
如果自定义列来排序,可以通过如下方式:
sourceBuilder.sort(new FieldSortBuilder(k).order(v ? SortOrder.ASC : SortOrder.DESC));
指定返回列
对应查询通常会指定一些返回列,就sql查询来说select *通常都比select cols要慢,一个原因是数据量少了有可能走了索引;es其实也同样,指定返回列可减少返回数据体量;
//返回和排除列
if (!CollectionUtils.isEmpty(includeFields) || !CollectionUtils.isEmpty(excludeFields)) {
sourceBuilder.fetchSource(includeFields, excludeFields);
}
模拟一个post获取es数据
如上就是查询es常用一些参数说明,配置及心得;下面给出完整的示例代码:
/**
* @param index
* @param from
* @param size
* @param where
* @param sortFieldsToAsc
* @param includeFields
* @param excludeFields
* @param timeOut
* @return
*/
public List<Map<String, Object>> searchIndex(String index, int from, int size, Map<String, Object> where,
Map<String, Boolean> sortFieldsToAsc, String[] includeFields, String[] excludeFields,
int timeOut) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
try {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//条件
if (where != null && !where.isEmpty()) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
where.forEach((k, v) -> {
if (v instanceof Map) {
//范围选择map 暂定时间
Map<String, Date> mapV = (Map<String, Date>) v;
if (mapV != null) {
boolQueryBuilder.must(
QueryBuilders.rangeQuery(k).
gte(format.format(mapV.get("start"))).
lt(format.format(mapV.get("end"))));
}
} else {
//普通模糊匹配
boolQueryBuilder.must(QueryBuilders.wildcardQuery(k, v.toString()));
}
});
sourceBuilder.query(boolQueryBuilder);
} //分页
from = from <= - ? : from;
size = size >= ? : size;
size = size <= ? : size;
sourceBuilder.from(from);
sourceBuilder.size(size); //超时
sourceBuilder.timeout(new TimeValue(timeOut, TimeUnit.SECONDS)); //排序
if (sortFieldsToAsc != null && !sortFieldsToAsc.isEmpty()) {
sortFieldsToAsc.forEach((k, v) -> {
sourceBuilder.sort(new FieldSortBuilder(k).order(v ? SortOrder.ASC : SortOrder.DESC));
});
} else {
sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
} //返回和排除列
if (!CollectionUtils.isEmpty(includeFields) || !CollectionUtils.isEmpty(excludeFields)) {
sourceBuilder.fetchSource(includeFields, excludeFields);
} SearchRequest rq = new SearchRequest();
//索引
rq.indices(index);
//各种组合条件
rq.source(sourceBuilder); //请求
System.out.println(rq.source().toString());
SearchResponse rp = client().search(rq); //解析返回
if (rp.status() != RestStatus.OK || rp.getHits().getTotalHits() <= ) {
return Collections.emptyList();
} //获取source
return Arrays.stream(rp.getHits().getHits()).map(b -> {
return b.getSourceAsMap();
}).collect(Collectors.toList()); } catch (Exception ex) {
ex.printStackTrace();
}
return Collections.emptyList();
}
分享通过RestClient方式往es发送的请求参数以及模拟post方式发送参数获取es数据:
{
"from" : ,
"size" : ,
"timeout" : "60s",
"query" : {
"bool" : {
"must" : [
{
"range" : {
"timeStamp" : {
"from" : "2019-05-23T19:17:59.000+0800",
"to" : "2019-05-23T19:18:00.000+0800",
"include_lower" : true,
"include_upper" : false,
"boost" : 1.0
}
}
},
{
"wildcard" : {
"data" : {
"wildcard" : "虎",
"boost" : 1.0
}
}
}
],
"disable_coord" : false,
"adjust_pure_negative" : true,
"boost" : 1.0
}
},
"_source" : {
"includes" : [ ],
"excludes" : [
"serverIp"
]
},
"sort" : [
{
"timeStamp" : {
"order" : "desc"
}
}
]
}
有了上面参数,我们完全可以通过postman直接发post给es服务端,让其返回响应的数据而;resthighlevelclient作为http客户端就是帮我们完成了这部分封装:
RestHighLevelClient查询es的更多相关文章
- Elasticsearch7.6.2 RestHighLevelClient查询用法 must should(and or 关系)
1. 引入jar <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId&g ...
- [ES]Python查询ES导出数据为Excel
版本 elasticsearch==5.5.0 python==3.7 说明 用python查询es上存储的状态数据,将查询到的数据用pandas处理成excel code # -*- coding: ...
- 分页查询es时,返回的数据不是自己所期望的问题
在进行es分页查询时,一般都是用sql语句转成es查询字符串,在项目中遇到过不少次返回的数据不是自己所期望的那样时,多半原因是自己的sql拼接的有问题. 解决办法:务必要保证自己的sql语句拼接正确.
- Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货
一.什么是 ES Nested 嵌套 Elasticsearch 有很多数据类型,大致如下: 基本数据类型: string 类型.ES 7.x 中,string 类型会升级为:text 和 keywo ...
- PB级数据实现秒级查询ES的安装
什么是ES?ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java语言开发的, ...
- 使用DbVisualizer 10.0.20 查询ES中的索引时需要注意的事项
查询前5条数据 光标停在某一个查询结果框中,左下角会显示该字段的类型 查询类型是text的字段使用单引号,使用双引号查询会报错
- 查询es curl命令记录
curl -H "Content-Type: application/json" -XGET http://10.65.0.33:9200/online/senseLog/_se ...
- Es查询工具使用
Kibana按照索引过滤数据 1.创建索引模式 2.查询索引中的数据 Es查询不返回数据 创建索引的时候指定mapping mappings={ "mappings": { &qu ...
- ES-PHP向ES批量添加、查询文档报 No alive nodes found in your cluster
转自: https://blog.csdn.net/itfootball/article/details/53637238 问题描述为了提高保存数据到es消耗的时间,采取积攒到3000条文档的时候才保 ...
随机推荐
- django项目中form表单和ajax的文件上传功能。
form表单文件上传 路由 # from表单上传 path('formupload/',apply.formupload,name='formupload/'), 方法 # form表单文件上传 de ...
- BigDecimal加减乘除计算
一.简述 java.math.BigDecimal不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值(unscaledValue)和32位的整数标度(scale)组成. ...
- 20180418模拟赛T2——Gym
Gym (Gym.cpp/c/pas) 题目描述 Description 木吉终于到达了 VAN 様的老巢 gym,然而他已经是孤身一人.他决定和 VAN 様来一场对决.他决定和 VAN 様玩♂跑♂步 ...
- Java检查异常、非检查异常、运行时异常、非运行时异常的区别
Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类. Java的异常(Exception和Error)分为检查异常和非检查的异常. 其 ...
- 强大的接口调试工具-Postman图文详解
前言 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正确性可用性.而这要求前端开发进度和后端进度保持基本一致,任何一方的进度跟不上,都无法及时完成功能 ...
- (14)树莓派 - 修改pi账号密码,开启root账号
https://blog.csdn.net/yoie01/article/details/45115067 1.修改PI账号的密码 password pi 2.开启root账号树莓派使用的linux是 ...
- 洛谷 P1731 [NOI1999]生日蛋糕 题解
每日一题 day53 打卡 Analysis 观察一个蛋糕的俯视图,上表面的面积其实就是最下面那一层的底面积,所以在第一次搜索的时候加入这个底面积,之后就只用考虑侧面积就好啦. 就是每次枚举r和h,如 ...
- Numpy | 14 字符串函数
本章函数用于对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作. 它们基于 Python 内置库中的标准字符串函数. 这些函数在字符数组类(n ...
- JavaScript == 与 === 区别
1.对于 string.number 等基础类型,== 和 === 是有区别的 a)不同类型间比较,== 之比较 "转化成同一类型后的值" 看 "值" 是否相等 ...
- css实现块级元素水平垂直居中的方法?
父级给相对定位,子级给绝对定位,margin设置为auto,上下左右值设为0. 父级给相对定位,子级给绝对定位,设置left和top为50%,再向左和向上移动负的子级一半. 父级设置display:f ...