java es 如何查询_使用elasticsearch的java-api进行查询
1.前言
elsaticsearch版本是6.8.3,使用的java-api是基于Java High Level REST Client.java
2.数据
3. InitClient
用来初始化客户端mysql
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
public class InitClient {
public static RestHighLevelClient getClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
// new HttpHost("192.168.1.101", 9200, "http"),
// new HttpHost("192.168.1.102", 9200, "http"),
new HttpHost("192.168.1.103", 9200, "http")
)
);
return client;
};
}
用来初始化带有密码的客户端sql
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.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;
import org.elasticsearch.client.RestHighLevelClient;
public class InitClient {
public static RestHighLevelClient getClient(){
/** 用户认证对象 */
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
/** 设置帐号密码 */
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"));
/** 建立rest client对象 */
RestClientBuilder builder = RestClient.builder(new HttpHost("127.0.0.1", 9200))
.setHttpClientConfigCallback(new HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
};
}
4.查询
4.1查询全部
无条件状况下,查询全部apache
private static void queryAll(){
try(RestHighLevelClient client = InitClient.getClient()){
//建立SearchRequest
SearchRequest searchRequest = new SearchRequest();
//指定索引为poems
searchRequest.indices("poems");
//建立SearchSourceBuilder
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//建立BoolQueryBuilder 用于添加条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//排序 按照索引中的id升序排序
searchSourceBuilder.sort(new FieldSortBuilder("_uid").order(SortOrder.ASC));
//分页
searchSourceBuilder.from(0);
searchSourceBuilder.size(20);
//将查询条件放入searchSourceBuilder中
searchSourceBuilder.query(boolQueryBuilder);
//searchRequest解析searchSourceBuilder
searchRequest.source(searchSourceBuilder);
//获取SearchResponse
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//获取分片结果
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
//得到数据
for (SearchHit hit : searchHits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
//关闭链接
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
结果:api
4.2match
match查询主要是针对分词状况下的匹配查询.默认状况下,是按照空格分词的.elasticsearch
因为我这里没有设置中文分词,实际上效果并非很好ide
例1:ui
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("content", "三千");
boolQueryBuilder.must(matchQueryBuilder);
这里想查找content字段下,有"三千"的内容,想要的结果应该是只会返回"日照香炉生紫烟,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。"spa
但结果是这样的:rest
能够看到返回了三条结果,只有望庐山瀑布知足了有"三"和"千"这两个内容,月下独酌只知足了"三",元日知足了"千"
4.3term
term查询是彻底匹配查询,只有彻底匹配字段的内容,才会查到,
使用term查询,必定要使用keyword属性,不然会被分词,就查不到了.
例1:查找做者是李白的结果
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("author.keyword", "李白");
boolQueryBuilder.must(termQueryBuilder);
结果:
4.4wildcard
wildcard查询是通配符查询,至关于mysql中的like,这个也要使用keyword属性
例1:查找诗歌中包含"三千"的内容,
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("content.keyword", "*三千*");
boolQueryBuilder.must(wildcardQueryBuilder);
结果:
能够看到只返回了一个结果,这也是wildcard和match不一样的地方
4.5prefix
prefix查询是前缀查询,也是使用keyword属性
例1:查找全部李姓做者
PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("author.keyword", "李");
boolQueryBuilder.must(prefixQueryBuilder);
结果:
4.6嵌套查询
对于多条件查询,有时候须要建立多个QueryBuilders.boolQuery()来进行嵌套
例1:查找content字段下内容中有"月"的或者有"酒"和"雨"
select * from poems where content like '月' or(content like '酒' and content like'雨')
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
BoolQueryBuilder boolQueryBuilderContent = QueryBuilders.boolQuery();
WildcardQueryBuilder wildcardQueryBuilderMoon = QueryBuilders.wildcardQuery("content.keyword", "*月*");
WildcardQueryBuilder wildcardQueryBuilderAlcohol = QueryBuilders.wildcardQuery("content.keyword", "*酒*");
WildcardQueryBuilder wildcardQueryBuilderRainy = QueryBuilders.wildcardQuery("content.keyword", "*雨*");
boolQueryBuilderContent.must(wildcardQueryBuilderAlcohol).must(wildcardQueryBuilderRainy);
boolQueryBuilder.should(wildcardQueryBuilderMoon).should(boolQueryBuilderContent);
结果:
5.聚合统计
例1:计算每一个诗人的诗歌数
select author, count(*) as author_count from poems group by author
private static void aggregation(){
try(RestHighLevelClient client = InitClient.getClient()){
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("poems");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//指定计数author 这里的author_count能够随意取名
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("author_count").field("author.keyword");
//将aggregationBuilder 放入searchSourceBuilder
searchSourceBuilder.aggregation(aggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//获取count 这里的author_count 要和上面取的名字对应上
Terms terms = searchResponse.getAggregations().get("author_count");
//获取结果
for (Terms.Bucket bucket : terms.getBuckets()) {
System.out.println("author=" + bucket.getKey()+" count="+bucket.getDocCount());
}
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
结果:
例2:计算每一个朝代每一个诗人的诗歌数
select dynasty,author,count(*) as author_count from poems group by dynasty,author
private static void aggregation(){
try(RestHighLevelClient client = InitClient.getClient()){
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("poems");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//设置聚合的字段dynasty 和author
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("dynasty_count").field("dynasty.keyword");
TermsAggregationBuilder aggregationBuilder2 = AggregationBuilders.terms("author_count").field("author.keyword");
//aggregationBuilder2是aggregationBuilder的子聚合
searchSourceBuilder.aggregation(aggregationBuilder.subAggregation(aggregationBuilder2));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//获取dynasty_count
Terms terms = searchResponse.getAggregations().get("dynasty_count");
//获取结果
for (Terms.Bucket bucket : terms.getBuckets()) {
System.out.println("dynasty=" + bucket.getKey()+" count="+bucket.getDocCount());
//获取author_count
Terms terms2 = bucket.getAggregations().get("author_count");
for (Terms.Bucket bucket2 : terms2.getBuckets()) {
System.out.println("author=" + bucket2.getKey()+ "; 数量=" + bucket2.getDocCount());
}
}
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
结果:
java es 如何查询_使用elasticsearch的java-api进行查询相关推荐
- 类型的值怎么用es查询_腾讯游戏信用分怎么查询在哪看 有什么用怎么提升介绍...
腾讯游戏信用分查询方法是很多小伙伴们都不知道的,在腾讯游戏中腾讯信用分是极其重要的,那么各位小伙伴们知道腾讯信用分怎么查吗?相信还有很多小伙伴不太清楚,那么接下来和大家一起分享一下腾讯游戏信用分查询方 ...
- .net函数查询_特来电智能分析平台动态查询架构创新实践
一.业务背景及痛点 目前主流互联网智能分析平台中,数据查询作为基础的设施服务支撑着基础数据及业务分析的功能展现.随着数据量的增长,数据存储方式多元化,相对静态数据可能存储到关系型数据库中,订单类动态数 ...
- java list e 查找_源码(04) -- java.util.ListE
java.util.List 源码分析(JDK1.7) ------------------------------------------------------------------------ ...
- java 基础 笔试题_非常全面的java基础笔试题
1.下列说法正确的是() (程序结构) A java程序的main方法必须写在类甩面 B java程序中可以有多个main方法 C.java程序中类名必须与文件名一样 D.JAVA程序的main方法中 ...
- mongodb cond 模糊查询_为了实现在线库的复杂查询,你还在双写吗?
一.在线库不支持在线复杂查询 做在线业务的开发者经常会碰到这样的难题:在线数据库上面运行稍微复杂点的查询,在线业务就挂了!不管是单机数据库如MySQL.PG,还是分布式数据库,HBase.MongoD ...
- java 北理工 教材_北理工《Java技术与应用》在线作业
北理工<Java技术与应用>在线作业 可以代做所有奥鹏平台的作业.小论文.毕业论文.离线作业.考核作业.在线作业.在线测试,有需要的请联系本人 一.单选题(共 20 道试题,共 40 分. ...
- java开发的主流_盘点2019年Java开发中7项主流、热门的IT技术!
作为历史最为悠久的编程语言,Java历经数十年依然盘踞在编程榜前三的位置,与它强大的功能和广泛的运用分不开.Java技术的更新迭代是开发者应该关注的问题,下面千小编就为大家盘点2019年互联网企业在J ...
- 高性能mysql 小查询_高性能MySQL06-查询优化(慢查询)
一.分析原因 SQL语句慢查询的原因有多种,如: 1)数据方面: 需要查询的表数据量太大导致性能下降: 是否向数据库请求了不需要的数据行或数据列: MySQL是否在扫描额外的记录 2)SQL语句太过于 ...
- mysql怎么子查询_在mysql中如何进行子查询?
在mysql中,子查询是指将一个查询语句嵌套在另一个查询语句中,可以在SELECT.UPDATE和 DELETE语句中配合WHERE子句进行实现,WHERE子句中语法格式为"WHERE (另 ...
- mysql水果表查询_最全MySQL数据库表的查询操作
序言 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可 ...
最新文章
- MySQL检查冗余索引代码
- [源码]python Scapy Ftp密码嗅探
- Linux有问必答:如何扩展XFS文件系统
- OpenCV 从文件中读取视频并播放
- 数据库-优化-索引-索引的优化
- 关于 Angular 应用 tsconfig.json 中的 target 属性
- android图片缩小和放大Matrix
- 《父亲家书》终篇:来京探望儿子之后
- 2022 基于SpringBoot/SSM的数据库查询平台
- Seata分布式事务原理
- mac系统下修改usr/bin文件夹权限问题
- DirectX11 SDK下载地址
- EMW3080+STC15轻松实现设备上云1(阿里云物联网平台、智能生活开放平台)
- flutter AppBar背景渐变色
- Window系统下如何生成ssh key以及如何在码云中添加公钥
- WordPress插件开发教程1:开发第一个WordPress插件
- 【一学就会的ROS基础入门教程 】03-1 ROS基础编程:ROS工作空间的创建、话题topic的发布与接收、以及话题消息的自定义使用
- Custom Data Objects
- 从业务需求出发,开启IDC高效运维之路
- 2021年6大好用又免费BI软件系统