java操作ElasticSearch聚合查詢的示例代碼
1、引入依賴
<!-- es工具--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
2、配置es連接信息
sring:
elasticsearch:
rest:
uris: "http://localhost:9200"3、構(gòu)建索引
@Document(indexName = "test_index_person")
public class TestPerson{
public TestPerson( String personName, Integer personId, String gmtCreate, String gmtModified) {
this.personName = personName;
this.personId = personId;
this.gmtCreate = gmtCreate;
this.gmtModified = gmtModified;
}
public TestPerson() {
}
@Override
public String toString() {
return "TestPerson{" +
"id='" + id + '\'' +
", personName='" + personName + '\'' +
", personId=" + personId +
", gmtCreate=" + gmtCreate +
", gmtModified=" + gmtModified +
'}';
}
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "ik_analyzer",name = "person_name")
private String personName;
@Field(type = FieldType.Integer,name = "person_id")
private Integer personId;
@Field(type = FieldType.Date,name = "gmt_create")
private String gmtCreate;
@Field(type = FieldType.Date,name = "gmt_modified")
private String gmtModified;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPersonName() {
return personName;
}
public void setPersonName(String personName) {
this.personName = personName;
}
public Integer getPersonId() {
return personId;
}
public void setPersonId(Integer personId) {
this.personId = personId;
}
public String getGmtCreate() {
return gmtCreate;
}
public void setGmtCreate(String gmtCreate) {
this.gmtCreate = gmtCreate;
}
public String getGmtModified() {
return gmtModified;
}
public void setGmtModified(String gmtModified) {
this.gmtModified = gmtModified;
}
}4、查詢(包含自定義聚合查詢)
@Autowired
ElasticsearchOperations elasticsearchOperations;
/***
* 自定義 match 查詢
*/
@Test
public void test6(){
// 構(gòu)建查詢條件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本分詞查詢
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("person_name", "小黑子");
queryBuilder.withQuery(matchQueryBuilder);
SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
searchHits.forEach(item ->{
System.out.println(item);
});
}
/***
* 自定義 term 查詢
*/
@Test
public void test7(){
// 構(gòu)建查詢條件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本分詞查詢
TermQueryBuilder personId = QueryBuilders.termQuery("person_id", "1");
queryBuilder.withQuery(personId);
SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
searchHits.forEach(item ->{
System.out.println(item);
});
}
/***
* 自定義 match_all 查詢
*/
@Test
public void test8(){
// 構(gòu)建查詢條件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本分詞查詢
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
queryBuilder.withQuery(matchAllQueryBuilder);
SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
searchHits.forEach(item ->{
System.out.println(item);
});
}
/***
* 自定義 match_phrase 查詢
*/
@Test
public void test9(){
// 構(gòu)建查詢條件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本分詞查詢
MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("person_name", "小黑子");
queryBuilder.withQuery(matchPhraseQueryBuilder);
SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
searchHits.forEach(item ->{
System.out.println(item);
});
}
/***
* 范圍查詢
*/
@Test
public void test10(){
// 構(gòu)建查詢條件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本分詞查詢
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("gmt_create");
rangeQuery.gte("2024-01-31T11:00:00");
rangeQuery.lt("2024-07-31T11:00:00");
queryBuilder.withQuery(rangeQuery);
SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
searchHits.forEach(item ->{
System.out.println(item);
});
}
/***
* 模糊匹配
*/
@Test
public void test11(){
// 構(gòu)建查詢條件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本分詞查詢
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("person_name", "張三");
queryBuilder.withQuery(fuzzyQueryBuilder);
SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
searchHits.forEach(item ->{
System.out.println(item);
});
}
/***
* 布爾查詢 必須匹配(must) 過濾(filter) 至少匹配一個(gè)(should)
*/
@Test
public void test12(){
// 構(gòu)建查詢條件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 構(gòu)建布爾查詢
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//布爾查詢下添加must
List<QueryBuilder> must = boolQueryBuilder.must();
TermQueryBuilder personId = QueryBuilders.termQuery("person_id", "1");
must.add(personId);
//布爾查詢下添加filter
List<QueryBuilder> filter = boolQueryBuilder.filter();
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("gmt_create");
rangeQuery.gte("2024-07-31T10:00:00");
filter.add(rangeQuery);
//布爾查詢下添加should
List<QueryBuilder> should = boolQueryBuilder.should();
TermQueryBuilder shouldTerm = QueryBuilders.termQuery("person_id", "111");
should.add(shouldTerm);
//布爾查詢下添加must_not
List<QueryBuilder> queryBuilders = boolQueryBuilder.mustNot();
TermQueryBuilder mustNotTerm = QueryBuilders.termQuery("person_name", "哈哈哈");
queryBuilders.add(mustNotTerm);
//構(gòu)建布爾查詢語法,準(zhǔn)備執(zhí)行
queryBuilder.withQuery(boolQueryBuilder);
SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
searchHits.forEach(item ->{
System.out.println(item);
});
}
/***
* 分頁(yè)
*/
@Test
public void test13(){
// 構(gòu)建查詢條件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 查詢?nèi)?
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
queryBuilder.withQuery(matchAllQueryBuilder);
Pageable pageable = PageRequest.of(0, 10, Sort.by("personId").descending());
queryBuilder.withPageable(pageable);
SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
searchHits.forEach(item ->{
System.out.println(item);
});
}
/***
* 對(duì)查詢出來的值進(jìn)行聚合查詢 統(tǒng)計(jì)每個(gè)唯一值的個(gè)數(shù)
*/
@Test
public void test14(){
// 構(gòu)建查詢條件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//查詢數(shù)據(jù)
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("person_name", "張三");
queryBuilder.withQuery(matchQuery);
//聚合數(shù)據(jù)
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("test_aggs").field("gmt_create");
queryBuilder.addAggregation(termsAggregationBuilder);
SearchHits<TestPerson> searchHits = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
searchHits.forEach(item ->{
System.out.println(item);
});
Aggregations aggregations = searchHits.getAggregations();
// 檢查 aggregations 是否為 null
if (aggregations != null) {
// 第二步:通過聚合名稱獲取特定的聚合結(jié)果
Terms testAggs = aggregations.get("test_aggs");
// 檢查特定聚合是否存在
if (testAggs != null) {
// 第三步:遍歷聚合中的桶(buckets)
for (Terms.Bucket bucket : testAggs.getBuckets()) {
// 獲取桶的鍵(在這個(gè)例子中是 gmt_create 的值)
String keyAsString = bucket.getKeyAsString();
// 獲取桶中文檔的數(shù)量
long docCount = bucket.getDocCount();
// 打印或處理每個(gè)桶的結(jié)果
System.out.println("Key: " + keyAsString + ", DocCount: " + docCount);
}
}
}
}
/***
* 對(duì)查詢出來的值進(jìn)行聚合查詢 統(tǒng)計(jì)每個(gè)唯一值的個(gè)數(shù) 僅僅返回聚合結(jié)果
*/
@Test
public void test15(){
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//僅僅返回聚合結(jié)果
queryBuilder.withPageable(PageRequest.of(0,1));
//查詢數(shù)據(jù)
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("person_name", "張三");
queryBuilder.withQuery(matchQueryBuilder);
//聚合
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("test_aggs").field("gmt_create");
queryBuilder.addAggregation(aggregationBuilder);
//獲取聚合信息
SearchHits<TestPerson> search = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
Aggregations aggregations = search.getAggregations();
if (aggregations != null){
Terms terms = aggregations.get("test_aggs");
List<? extends Terms.Bucket> buckets = terms.getBuckets();
buckets.forEach(item ->{
System.out.println("key:"+item.getKeyAsString() +"===="+"doc_count:"+item.getDocCount());
});
}
}
/***
* 多個(gè)聚合
*/
@Test
public void test16(){
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//僅僅返回聚合結(jié)果
queryBuilder.withPageable(PageRequest.of(0,1));
TermsAggregationBuilder test_aggs = AggregationBuilders.terms("test_aggs").field("gmt_create");
queryBuilder.addAggregation(test_aggs);
AvgAggregationBuilder test_aggs2 = AggregationBuilders.avg("test_aggs2").field("person_id");
queryBuilder.addAggregation(test_aggs2);
SearchHits<TestPerson> search = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
Aggregations aggregations = search.getAggregations();
if (aggregations != null){
Terms test_aggs1 = aggregations.get("test_aggs");
if (test_aggs != null){
test_aggs1.getBuckets().forEach(item ->{
System.out.println("key:"+ item.getKeyAsString()+"===="+"doc_count:"+item.getDocCount());
});
}
Avg test2_aggs = aggregations.get("test_aggs2");
System.out.println( test2_aggs.getValue());
}
}
/***
* 子聚合 先分組,再計(jì)算
*/
@Test
public void test17(){
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
queryBuilder.withPageable(PageRequest.of(0,1));
TermsAggregationBuilder test_aggs = AggregationBuilders.terms("test_aggs").field("gmt_create");
test_aggs.subAggregation(AggregationBuilders.avg("son_aggs_test").field("person_id"));
queryBuilder.addAggregation(test_aggs);
SearchHits<TestPerson> search = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
Aggregations aggregations = search.getAggregations();
Terms testAgges = aggregations.get("test_aggs");
testAgges.getBuckets().forEach(item ->{
Avg aggregations1 = item.getAggregations().get("son_aggs_test");
System.out.println("key:"+item.getKeyAsString()+"--doc_count:"+item.getKeyAsString()+"--son_aggs_test"+aggregations1.getValue());
});
}
/**
* 取聚合最大值
*/
@Test
public void test18(){
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
queryBuilder.addAggregation(AggregationBuilders.max("test_agg").field("person_id"));
SearchHits<TestPerson> search = elasticsearchOperations.search(queryBuilder.build(), TestPerson.class);
Aggregations aggregations = search.getAggregations();
Max test_agg = aggregations.get("test_agg");
System.out.println(test_agg.getValue());
}到此這篇關(guān)于java操作ElasticSearch(包含聚合查詢)的文章就介紹到這了,更多相關(guān)java操作ElasticSearch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java json字符串轉(zhuǎn)JSONObject和JSONArray以及取值的實(shí)例
這篇文章主要介紹了java json字符串轉(zhuǎn)JSONObject和JSONArray以及取值的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
Spring中使用AOP進(jìn)行事務(wù)管理實(shí)例
這篇文章主要介紹了Spring中使用AOP進(jìn)行事務(wù)管理實(shí)例,當(dāng)在Spring項(xiàng)目中涉及數(shù)據(jù)庫(kù)操作時(shí),事務(wù)管理是非常重要的,它可以確保數(shù)據(jù)庫(kù)操作的一致性和完整性,Spring提供了強(qiáng)大的事務(wù)管理功能,可以通過聲明式或編程式兩種方式進(jìn)行配置,需要的朋友可以參考下2023-09-09
JAVA如何把數(shù)據(jù)庫(kù)的數(shù)據(jù)處理成樹形結(jié)構(gòu)
本文介紹了JAVA如何把數(shù)據(jù)庫(kù)的數(shù)據(jù)處理成樹形結(jié)構(gòu),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
基于Java編寫一個(gè)簡(jiǎn)單的內(nèi)部網(wǎng)段掃描程序
這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫一個(gè)簡(jiǎn)單的內(nèi)部網(wǎng)段掃描程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下2025-02-02
解決一個(gè)JSON反序列化問題的辦法(空字符串變?yōu)榭占?
在平時(shí)的業(yè)務(wù)開發(fā)中,經(jīng)常會(huì)有拿到一串序列化后的字符串要來反序列化,下面這篇文章主要給大家介紹了如何解決一個(gè)JSON反序列化問題的相關(guān)資料,空字符串變?yōu)榭占?需要的朋友可以參考下2024-03-03
關(guān)于泛型擦除問題的解決--Mybatis查詢類型轉(zhuǎn)換
這篇文章主要介紹了關(guān)于泛型擦除問題的解決--Mybatis查詢類型轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
Java?ClassLoader虛擬類實(shí)現(xiàn)代碼熱替換的示例代碼
本文主要介紹了Java?ClassLoader虛擬類實(shí)現(xiàn)代碼熱替換的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

