elasticsearch RestHighLevelClient 关于document的常用操作 ---------- 查询篇
在es中查询大致分为两类:普通查询、复杂查询。
普通查询只需要使用:GetRequest即可
复杂查询涉及很多:
SearchSourceBuilder(用于指定搜索条件时的附加条件:排序、分页、查询范围、展示\屏蔽字段、各种常见聚合查询等)
QueryBuilders(用于指定搜索模式:全量搜索、附加单条件搜索、附加多条件搜索、模糊搜索等)
SearchRequest(用于指定被操作的索引、加载搜索条件等操作)
es单条操作--查询文档
public String findEsDocument(){
//创建查询文档请求
GetRequest getRequest = new GetRequest();
//设置属性
getRequest.index("user").id("sAMC7XgBrgVVHTXvmYL_");
try {
//像es服务发送请求
GetResponse findInfo = this.client.get(getRequest, RequestOptions.DEFAULT);
System.out.println("find es index _index is : " + findInfo.getIndex());
System.out.println("find es index _id is : " + findInfo.getId());
System.out.println("find es index _type is : " + findInfo.getType());
System.out.println("find es index source is : " + findInfo.getSourceAsString());
} catch (IOException e) {
e.printStackTrace();
}
return "find es index complete";
}
es批量查询--全量查询操作
特别注意:
public String findAll(){
//设置搜索类型及条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//新建搜索
searchSourceBuilder.query(QueryBuilders.matchAllQuery());//指定全量搜索
searchSourceBuilder.from(0);//指定page
searchSourceBuilder.size(5);//指定pageSize
searchSourceBuilder.sort("age" , SortOrder.ASC);//排序规则
//创建检索文档请求
SearchRequest request = new SearchRequest();
request.indices("user");//指定索引名称
request.source(searchSourceBuilder);//加载搜索条件
SearchResponse search = null;
try {
search = this.client.search(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
SearchHit[] hits = search.getHits().getHits();
List<Map<String , Object>> list = new ArrayList<>();
for(SearchHit value : hits){
String sourceAsString = value.getSourceAsString();
JSONObject jsonObject = JSONObject.parseObject(sourceAsString);
HashMap<String, Object> map = new HashMap<>();
map.put("id" , value.getId());//获取当前索引的主键ID
map.put("userName" , jsonObject.getString("userName"));
map.put("age" , jsonObject.getString("age"));
map.put("sex" , jsonObject.getString("sex"));
list.add(map);
}
for (Map<String , Object> listValues : list){
Set<Map.Entry<String, Object>> entries = listValues.entrySet();
for (Map.Entry<String , Object> mapValues : entries){
System.out.println("key : " + mapValues.getKey() + " value : " + mapValues.getValue());
}
}
return "match all query es is complete";
}
es批量查询--全量单条件查询操作
public String findAllByTerm(){
//构建搜索条件以及一些其它参数配置
SearchSourceBuilder builder = new SearchSourceBuilder();
//设置查询条件(where)
TermQueryBuilder queryWhere = QueryBuilders.termQuery("userName.keyword", "张三");
builder.query(queryWhere);///对于未分词的字符串类型的检索一定要表示keyword关键字
//设置查询范围(range)
RangeQueryBuilder queryRangeByAge = QueryBuilders.rangeQuery("age");
queryRangeByAge.gte("40");
queryRangeByAge.lte("300");
builder.query(queryRangeByAge);
//设置分页
builder.from(0);
builder.size(5);
//设置排序
builder.sort("age" , SortOrder.DESC);
//设置要展示/屏蔽的字段
String[] excludes = {};
String[] includes = {"userName" , "lastName" , "age"};
builder.fetchSource(includes , excludes);
//指定要检索的索引并装载搜索条件及各项属性设置
SearchRequest request = new SearchRequest();
request.indices("user");
request.source(builder);
//发送查询请求
SearchResponse search = null;
try {
search = this.client.search(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
return "term query es is complete";
}
复杂的bool查询操作及常见聚合操作
public String BoolEsDocument(){
//指定搜索条件 should == or must == and
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.termQuery("education.keyword" , "高中"));
boolQueryBuilder.should(QueryBuilders.termQuery("education.keyword" , "本科"));
boolQueryBuilder.must(QueryBuilders.termQuery("sex.keyword" , "女"));
//指定范围查询 == between
RangeQueryBuilder rangeQueryBuilderByAge = QueryBuilders.rangeQuery("age");
rangeQueryBuilderByAge.lte(100);
rangeQueryBuilderByAge.gte(10);
RangeQueryBuilder rangeQueryBuilderByHeight = QueryBuilders.rangeQuery("height");
rangeQueryBuilderByHeight.lte(200);
rangeQueryBuilderByHeight.gte(190);
//模糊查询
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("userName.keyword" , "*" + "r" + "*");
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(boolQueryBuilder);//加载and or搜索条件
builder.query(rangeQueryBuilderByAge);//加载范围查找搜索条件
builder.query(rangeQueryBuilderByHeight);//加载范围查找搜索条件
builder.query(wildcardQueryBuilder);//加载模糊查询搜索条件
builder.from(0);//起始页
builder.size(5);//每页记录数
builder.sort("age" , SortOrder.ASC);//排序
String[] excludes = {};//需要屏蔽的字段
String[] includes = {"userName" , "age" , "education" , "sex"};//需要展示的字段
builder.fetchSource(includes , excludes);//加载屏蔽/展示字段
//count
ValueCountAggregationBuilder field = AggregationBuilders.count("count_user_name").field("userName.keyword");
builder.aggregation(field);
//avg
AvgAggregationBuilder avg_age = AggregationBuilders.avg("avg_age").field("age");
builder.aggregation(avg_age);
//Cardinality 去重的统计
CardinalityAggregationBuilder cardinality_sex = AggregationBuilders.cardinality("cardinality_sex").field("sex.keyword");
builder.aggregation(cardinality_sex);
//sum
SumAggregationBuilder sum_total_score = AggregationBuilders.sum("sum_total_score").field("totalScore");
builder.aggregation(sum_total_score);
//max
MaxAggregationBuilder max_height = AggregationBuilders.max("max_height").field("height");
builder.aggregation(max_height);
//min
MinAggregationBuilder min_weight = AggregationBuilders.min("min_weight").field("weight");
builder.aggregation(min_weight);
SearchRequest request = new SearchRequest();
request.indices("user");
request.source(builder);
SearchResponse search = null;
try {
search = this.client.search(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
if(search.status() == RestStatus.OK){
SearchHit[] hits = search.getHits().getHits();
for (SearchHit hitsValue : hits){
String sourceAsString = hitsValue.getSourceAsString();
JSONObject jsonObject = JSONObject.parseObject(sourceAsString);
System.out.println("userName : " + jsonObject.getString("userName") +
"sex : " + jsonObject.getString("sex") +
" age : " + jsonObject.getString("age") +
" lastName : " + jsonObject.getString("lastName") +
" height : " + jsonObject.getString("height") +
" weight : " + jsonObject.getString("weight") +
" education : " + jsonObject.getString("education") +
" totalScore : " + jsonObject.getString("totalScore"));
}
Aggregations aggregations = search.getAggregations();
ValueCount count_user_name = aggregations.get("count_user_name");
System.out.println("count_user_name : " + count_user_name.getValue());
Avg avg_age_result = aggregations.get("avg_age");
System.out.println("avg_age : " + Math.round(avg_age_result.getValue()));
Cardinality cardinality_sex_result = aggregations.get("cardinality_sex");
System.out.println("cardinality_sex : " + cardinality_sex_result.getValue());
Sum sum_total_score_result = aggregations.get("sum_total_score");
System.out.println("sum_total_score : " + sum_total_score_result.getValue());
Max max_height_result = aggregations.get("max_height");
System.out.println("max_height : " + max_height_result.getValue());
Min min_weight_result = aggregations.get("min_weight");
System.out.println("min_weight : " + min_weight_result.getValue());
}
return "bool query es document is complete2";
}
特殊情况:
针对map数据类型的自定义条件查询
map数据类型在做查询操作时比较特别须写全标识,示例中scoure为字段归属标识,“数学”为字段名,keyword为分词,99为值
个人猜想此处须单独写出scoure字段归属标识有两个原因:1.此处查询操作的条件是完全脱离实体类进行设置的。2.考虑到字段同名问题须特别指出要修改哪个“数学”
public void mapTestSelect(){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.termQuery("userName.keyword" , "李四"));
boolQueryBuilder.must(QueryBuilders.termQuery("scoure.历史.keyword" , "99"));
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(boolQueryBuilder);//加载and or搜索条件
SearchRequest request = new SearchRequest();
request.indices("map_test");
request.source(builder);
SearchResponse search = null;
Person personInfo = new Person();
try {
search = this.client.search(request, RequestOptions.DEFAULT);
SearchHit[] hits = search.getHits().getHits();
for (SearchHit value : hits){
String sourceAsString = value.getSourceAsString();
personInfo = JSONObject.parseObject(sourceAsString , Person.class);
}
System.out.println("personInfo = " + personInfo);
System.out.println("personInfo.getAge() = " + personInfo.getAge());
System.out.println("personInfo.getScoure().get(\"数学\") = " + personInfo.getScoure().get("数学"));
} catch (IOException e) {
e.printStackTrace();
}
}
elasticsearch RestHighLevelClient 关于document的常用操作 ---------- 查询篇的更多相关文章
- Elasticsearch本地环境安装和常用操作
本篇文章首发于我的头条号Elasticsearch本地环境安装和常用操作,欢迎关注我的头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech)获取更多干 ...
- 数据结构之链表-链表实现及常用操作(C++篇)
数据结构之链表-链表实现及常用操作(C++篇) 0.摘要 定义 插入节点(单向链表) 删除节点(单向链表) 反向遍历链表 找出中间节点 找出倒数第k个节点 翻转链表 判断两个链表是否相交,并返回相交点 ...
- elasticsearch 基础 —— Common Terms Query常用术语查询
常用术语查询 该common术语查询是一个现代的替代提高了精确度和搜索结果的召回(采取禁用词进去),在不牺牲性能的禁用词. 问题 查询中的每个术语都有成本.搜索"The brown fox& ...
- Elasticsearch(ES)API 增删查改常用操作
常用操作 查询所有数据 POST http://192.168.97.173:27009/logstash_test_2018/doc/_search { "query": { & ...
- ElasticSearch之映射常用操作
本文案例操作,建议先阅读我之前的文章<ElasticSearch之安装及基本操作API> Mapping (映射)类似关系型数据库中的表的结构定义.我们将数据以 JSON 格式存入到 El ...
- ElasticSearch 7.X版本19个常用的查询语句
整理一篇常用的CRUD查询语句,之前这篇文件是在17年左右发表的,从英文翻译过来,现在采用7.x 版本进行实验,弃用的功能或者参数,我这边会进行更新,一起来学习吧. 为了演示不同类型的 Elastic ...
- ElasticSearch 常用的查询过滤语句
query 和 filter 的区别请看: http://www.cnblogs.com/ghj1976/p/5292740.html Filter DSL term 过滤 term主要用于精确匹配 ...
- mysql常用快速查询修改操作
mysql常用快速查询修改操作 一.查找并修改非innodb引擎为innodb引擎 # 通用操作 mysql> select concat('alter table ',table_schema ...
- [转] ElasticSearch 常用的查询过滤语句
备忘remark https://www.cnblogs.com/ghj1976/p/5293250.html query 和 filter 的区别请看: http://www.cnblogs.co ...
- centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课
centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课 mysq ...
随机推荐
- 【记录】C/C++-关于I/O的坑与教训
吐槽 每每读取字符串时,倘若稍有灵活的操作,总会遇上诡异奇怪的事情.究其原因,就是没完全理解一些基本读写函数的机制.这次做Uva227就把I/O上的问题全暴露出来了.想来还是应该记录一些经验教训. 记 ...
- Prometheus Go client library 详解
介绍 Prometheus 支持 4 种 指标类型,分别是 Counter.Gauge.Histogram 和 Summary. Counter 指标类型,指标值是只能递增,不能递减的数值.需要注意的 ...
- go cobra Error: required flag(s) "pkg-name" not set
Cobra 是一个 Golang 包,它提供了简单的接口来创建命令行程序.同时,Cobra 也是一个应用程序,用来生成应用框架,从而开发以 Cobra 为基础的应用. 使用 cobra init 命令 ...
- Tomcat之——宕机自动重启和每日定时启动tomcat
在项目后期维护中会遇到这样的情况,tomcat在内存溢出的时候就出现死机的情况和遇到长时间不响应,需要人工手动关闭和重启服务,针对这样的突发情况,希望程序能自动处理问题而不需要人工关于,所以才有了目前 ...
- 再说PG的连接
前面说过连接PG的方法,但是遇到问题又不通了. 按照前面的做法还是不行,正是鼻子气歪了. 到pg老家下载PGODBC,安装了,还是不行. 其实仅仅copy一个libpg.dll是不够的.因为libpg ...
- 线性探测法的查找函数 作者 DS课程组 单位 浙江大学
虽然但是,我真的讨厌c语言这样一大坨typedef命名来命名去的,很多时候其实我们会写,但是看不懂这个存储结构 函数的接口定义 Position Find( HashTable H, ElementT ...
- FreeRTOS消息队列传递数组
1.使用消息队列的发送和接收前,需要先创建消息队列 2.消息队列的深度和大小 深度 就是数组的元素个数 大小 就是整个数组占用的空间大小 消息队列的创建 static void AppObjC ...
- Python科学计算系列7—微分方程
1.可分离变量方程 例1:求下列微分方程法通解 先化简此方程如下: 代码如下: from sympy import * x = symbols('x') f = symbols('f', cls=Fu ...
- Asp.net mvc基础(十三)集合常用的扩展方法和Linq语句
详情参考:C#之集合常用扩展方法与Linq - 冯继强fjq - 博客园 (cnblogs.com)
- VSCode输出框中文乱码问题
vscode输出中文的时候,总是出现乱码.找了一个一劳永逸解决问题的方法,转载的,原教程地址:https://blog.csdn.net/a19990412/article/details/90270 ...