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 ...
随机推荐
- gorm插入报错Error 1292 (22007): Incorrect datetime value: ‘0000-00-00‘ for column ‘xxx‘ at row 1
在MySQL中,'0000-00-00 00:00:00'不是一个合法的DATETIME值.从MySQL 5.7.5开始,默认情况下不允许插入零日期或零时间值到DATETIME或 TIMESTAMP列 ...
- 懂了 OpenLDAP
轻型目录访问协议(英文: LightweightDirectoryAccessProtocol,缩写: LDAP)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目 ...
- 工作日记-LED串口开发
背景 公司最近的一个项目中需要使用LED显示屏实时显示一些数据,经过调研,项目经理选择了泰美泉公司的产品,前几日硬件设备到了之后,笔者负责的中间件组就马不停蹄的开始了实际的调研与测试工作,因为之前有过 ...
- 【网络协议】深入理解HTTP协议
# 协议 协议就是一种双方提前约定好采用某种形式,以某种规格,利用某种物体把数据传输出去:而另一方再以同样的规则和流程去接收数据的约定制度或者规章. 现代网络是由多种运行在不同平台上的异构系统组成的. ...
- 【Linux】5.8 Shell流程控制
Shell 流程控制 1. 判断语句 1.1 if判断 if else-if else 语法格式: if condition1 then command1 elif condition2 then c ...
- LLMOps MLOPS
https://www.redhat.com/en/topics/ai/llmops https://www.redhat.com/en/topics/cloud-computing/what-is- ...
- Web前端入门第 27 问:你知道 CSS 被浏览器分为了几大类吗?
埋头苦写多年的 CSS,从没注意到 CSS 被浏览器分了类,直到偶然的一次翻阅开发者工具,才发现原来 CSS 属性也被浏览器归类收纳了. Chrome 下面是 Chrome 的开发者工具中 CSS 的 ...
- Linux poweroff 命令
poweroff 命令命令用于关闭计算器并切断电源. 使用权限:系统管理者. 语法 poweroff [-n] [-w] [-d] [-f] [-i] [-h] 参数说明: -n : 在关机前不做将记 ...
- 通过 Python 在PDF中添加、或删除超链接
PDF文件现已成为文档存储和分发的首选格式.然而,PDF文件的静态特性有时会限制其交互性.超链接是提高PDF文件互动性和用户体验的关键元素.Python作为一种强大的编程语言,拥有多种库和工具来处理P ...
- mac系统安装GNU-sed
经过网上查资料,发现 由于 mac 系统与 linux 系统的差异,mac自带的sed命令,因为其是基于bsd,所以与常用的gnu不一样,安装gnu-sed 可正常使用: 1.brew install ...