国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ElasticSearch進(jìn)階:多種查詢操作,各種ES查詢以及在Java中的實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了ElasticSearch進(jìn)階:多種查詢操作,各種ES查詢以及在Java中的實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

前言

1 詞條查詢

1.1 等值查詢-term

1.2 多值查詢-terms

1.3 范圍查詢-range

1.4 前綴查詢-prefix

1.5 通配符查詢-wildcard

2 復(fù)合查詢

2.1 布爾查詢

2.2 Filter查詢

3 聚合查詢

3.1 最值、平均值、求和

3.2 去重查詢

3.3 分組聚合

3.3.1 單條件分組

3.3.2 多條件分組

3.4 過(guò)濾聚合


前言

  • ElasticSearch第一篇:ElasticSearch基礎(chǔ):從倒排索引說(shuō)起,快速認(rèn)知ES

這篇博文的主題是ES的查詢,因此我整理了盡可能齊全的ES查詢場(chǎng)景,形成下面的圖:

elasticsearch java client多字段查詢,elasticsearch

本文基于elasticsearch 7.13.2版本,es從7.0以后,發(fā)生了很大的更新。7.3以后,已經(jīng)不推薦使用TransportClient這個(gè)client,取而代之的是Java High Level REST Client。

測(cè)試使用的數(shù)據(jù)示例

首先是,Mysql中的部分測(cè)試數(shù)據(jù):

id name age sex address sect skill power create_time modify_time
1 張無(wú)忌 18 光明頂 明教 九陽(yáng)神功 99 2021-05-14 16:50:33 2021-06-29 16:48:56
2 周芷若 17 峨眉山 峨嵋派 九陰真經(jīng) 88 2021-05-14 11:37:07 2021-06-29 16:56:40
3 趙敏 14 大都 朝廷 無(wú) 40 2021-05-14 11:37:07 2021-06-29 15:22:24

Mysql中的一行數(shù)據(jù)在ES中以一個(gè)文檔形式存在:

?{
? ?"_index" : "person",
? ?"_type" : "_doc",
? ?"_id" : "4",
? ?"_score" : 1.0,
? ?"_source" : {
? ? ?"address" : "峨眉山",
? ? ?"modifyTime" : "2021-06-29 19:46:25",
? ? ?"createTime" : "2021-05-14 11:37:07",
? ? ?"sect" : "峨嵋派",
? ? ?"sex" : "男",
? ? ?"skill" : "降龍十八掌",
? ? ?"name" : "宋青書",
? ? ?"id" : 4,
? ? ?"power" : 50,
? ? ?"age" : 21
?  }
?}

簡(jiǎn)單梳理了一下ES JavaAPI的相關(guān)體系,感興趣的可以自己研讀一下源碼。

elasticsearch java client多字段查詢,elasticsearch

接下來(lái),我們用十幾個(gè)實(shí)例,迅速上手ES的查詢操作,每個(gè)示例將提供SQL語(yǔ)句、ES語(yǔ)句和Java代碼。

1 詞條查詢

所謂詞條查詢,也就是ES不會(huì)對(duì)查詢條件進(jìn)行分詞處理,只有當(dāng)詞條和查詢字符串完全匹配時(shí),才會(huì)被查詢到。

1.1 等值查詢-term

等值查詢,即篩選出一個(gè)字段等于特定值的所有記錄。

SQL:

select * from person where name = '張無(wú)忌';

而使用ES查詢語(yǔ)句卻很不一樣(注意查詢字段帶上keyword):

?GET /person/_search
?{
?    "query": {
?        "term": {
?            "name.keyword": {
?                "value": "張無(wú)忌",
?                "boost": 1.0
?            }
?        }
?    }
?}

ElasticSearch 5.0以后,string類型有重大變更,移除了string類型,string字段被拆分成兩種新的數(shù)據(jù)類型: text用于全文搜索的,而keyword用于關(guān)鍵詞搜索。

查詢結(jié)果:

?{
? ?"took" : 0,
? ?"timed_out" : false,
? ?"_shards" : { // 分片信息
? ? ?"total" : 1, // 總計(jì)分片數(shù)
? ? ?"successful" : 1, // 查詢成功的分片數(shù)
? ? ?"skipped" : 0, // 跳過(guò)查詢的分片數(shù)
? ? ?"failed" : 0 ?// 查詢失敗的分片數(shù)
?  },
? ?"hits" : { // 命中結(jié)果
? ? ?"total" : {
? ? ? ?"value" : 1, // 數(shù)量
? ? ? ?"relation" : "eq" ?// 關(guān)系:等于
? ?  },
? ? ?"max_score" : 2.8526313, ?// 最高分?jǐn)?shù)
? ? ?"hits" : [
? ? ?  {
? ? ? ? ?"_index" : "person", // 索引
? ? ? ? ?"_type" : "_doc", // 類型
? ? ? ? ?"_id" : "1",
? ? ? ? ?"_score" : 2.8526313,
? ? ? ? ?"_source" : {
? ? ? ? ? ?"address" : "光明頂",
? ? ? ? ? ?"modifyTime" : "2021-06-29 16:48:56",
? ? ? ? ? ?"createTime" : "2021-05-14 16:50:33",
? ? ? ? ? ?"sect" : "明教",
? ? ? ? ? ?"sex" : "男",
? ? ? ? ? ?"skill" : "九陽(yáng)神功",
? ? ? ? ? ?"name" : "張無(wú)忌",
? ? ? ? ? ?"id" : 1,
? ? ? ? ? ?"power" : 99,
? ? ? ? ? ?"age" : 18
? ? ? ?  }
? ? ?  }
? ?  ]
?  }
?}

Java中構(gòu)造ES請(qǐng)求的方式:(后續(xù)例子中只保留SearchSourceBuilder的構(gòu)建語(yǔ)句)

?/**
? * term精確查詢
? *
? * @throws IOException
? */
??
?@Autowired
?private RestHighLevelClient client;
??
?@Test
?public void queryTerm() throws IOException {
?    // 根據(jù)索引創(chuàng)建查詢請(qǐng)求
? ? ?SearchRequest searchRequest = new SearchRequest("person");
? ? ?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
? ? ?// 構(gòu)建查詢語(yǔ)句
? ? ?searchSourceBuilder.query(QueryBuilders.termQuery("name.keyword", "張無(wú)忌"));
? ? ?System.out.println("searchSourceBuilder===================" + searchSourceBuilder);
? ? ?searchRequest.source(searchSourceBuilder);
? ? ?SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
? ? ?System.out.println(JSONObject.toJSON(response));
?}

仔細(xì)觀察查詢結(jié)果,會(huì)發(fā)現(xiàn)ES查詢結(jié)果中會(huì)帶有_score這一項(xiàng),ES會(huì)根據(jù)結(jié)果匹配程度進(jìn)行評(píng)分。打分是會(huì)耗費(fèi)性能的,如果確認(rèn)自己的查詢不需要評(píng)分,就設(shè)置查詢語(yǔ)句關(guān)閉評(píng)分:

?GET /person/_search
?{
?    "query": {
?        "constant_score": {
?            "filter": {
?                "term": {
?                    "sect.keyword": {
?                        "value": "張無(wú)忌",
?                        "boost": 1.0
?                    }
?                }
?            },
?            "boost": 1.0
?        }
?    }
?}

Java構(gòu)建查詢語(yǔ)句:

?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 這樣構(gòu)造的查詢條件,將不進(jìn)行score計(jì)算,從而提高查詢效率
?searchSourceBuilder.query(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("sect.keyword", "明教")));

1.2 多值查詢-terms

多條件查詢類似Mysql里的IN查詢,例如:

?select * from persons where sect in('明教','武當(dāng)派');

ES查詢語(yǔ)句:

?GET /person/_search
?{
?    "query": {
?        "terms": {
?            "sect.keyword": [
?                "明教",
?                "武當(dāng)派"
?            ],
?            "boost": 1.0
?        }
?    }
?}

Java實(shí)現(xiàn):

?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 構(gòu)建查詢語(yǔ)句
?searchSourceBuilder.query(QueryBuilders.termsQuery("sect.keyword", Arrays.asList("明教", "武當(dāng)派")));
?}

1.3 范圍查詢-range

范圍查詢,即查詢某字段在特定區(qū)間的記錄。

SQL:

?select * from pesons where age between 18 and 22;

ES查詢語(yǔ)句:

?GET /person/_search
?{
?    "query": {
?        "range": {
?            "age": {
?                "from": 10,
?                "to": 20,
?                "include_lower": true,
?                "include_upper": true,
?                "boost": 1.0
?            }
?        }
?    }
?}

Java構(gòu)建查詢條件:

?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 構(gòu)建查詢語(yǔ)句
?searchSourceBuilder.query(QueryBuilders.rangeQuery("age").gte(10).lte(30));
?

1.4 前綴查詢-prefix

前綴查詢類似于SQL中的模糊查詢。

SQL:

?select * from persons where sect like '武當(dāng)%';

ES查詢語(yǔ)句:

?{
?    "query": {
?        "prefix": {
?            "sect.keyword": {
?                "value": "武當(dāng)",
?                "boost": 1.0
?            }
?        }
?    }
?}

Java構(gòu)建查詢條件:

?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 構(gòu)建查詢語(yǔ)句
?searchSourceBuilder.query(QueryBuilders.prefixQuery("sect.keyword","武當(dāng)"));

1.5 通配符查詢-wildcard

通配符查詢,與前綴查詢類似,都屬于模糊查詢的范疇,但通配符顯然功能更強(qiáng)。

SQL:

?select * from persons where name like '張%忌';

ES查詢語(yǔ)句:

?{
?    "query": {
?        "wildcard": {
?            "sect.keyword": {
?                "wildcard": "張*忌",
?                "boost": 1.0
?            }
?        }
?    }
?}

Java構(gòu)建查詢條件:

?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 構(gòu)建查詢語(yǔ)句
?searchSourceBuilder.query(QueryBuilders.wildcardQuery("sect.keyword","張*忌"));

2 復(fù)合查詢

前面的例子都是單個(gè)條件查詢,在實(shí)際應(yīng)用中,我們很有可能會(huì)過(guò)濾多個(gè)值或字段。先看一個(gè)簡(jiǎn)單的例子:

?select * from persons where sex = '女' and sect = '明教';

這樣的多條件等值查詢,就要借用到組合過(guò)濾器了,其查詢語(yǔ)句是:

?{
?    "query": {
?        "bool": {
?            "must": [
?                {
?                 ? ?"term": {
?                        "sex": {
?                            "value": "女",
?                            "boost": 1.0
?                        }
?                    }
?                },
?                {
?                    "term": {
?                        "sect.keywords": {
?                            "value": "明教",
?                            "boost": 1.0
?                        }
?                    }
?                }
?            ],
?            "adjust_pure_negative": true,
?            "boost": 1.0
?        }
?    }
?}

Java構(gòu)造查詢語(yǔ)句:

?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 構(gòu)建查詢語(yǔ)句
?searchSourceBuilder.query(QueryBuilders.boolQuery()
? ? ? ?  .must(QueryBuilders.termQuery("sex", "女"))
? ? ? ?  .must(QueryBuilders.termQuery("sect.keyword", "明教"))
?);

2.1 布爾查詢

布爾過(guò)濾器(bool filter)屬于復(fù)合過(guò)濾器(compound filter)的一種 ,可以接受多個(gè)其他過(guò)濾器作為參數(shù),并將這些過(guò)濾器結(jié)合成各式各樣的布爾(邏輯)組合。

elasticsearch java client多字段查詢,elasticsearch

bool 過(guò)濾器下可以有4種子條件,可以任選其中任意一個(gè)或多個(gè)。filter是比較特殊的,這里先不說(shuō)。

?{
? ? "bool" : {
? ? ? ?"must" : ? ? [],
? ? ? ?"should" : ? [],
? ? ? ?"must_not" : [],
? ? }
?}
  • must:所有的語(yǔ)句都必須匹配,與 ‘=’ 等價(jià)。

  • must_not:所有的語(yǔ)句都不能匹配,與 ‘!=’ 或 not in 等價(jià)。

  • should:至少有n個(gè)語(yǔ)句要匹配,n由參數(shù)控制。

精度控制:

所有 must 語(yǔ)句必須匹配,所有 must_not 語(yǔ)句都必須不匹配,但有多少 should 語(yǔ)句應(yīng)該匹配呢?默認(rèn)情況下,沒(méi)有 should 語(yǔ)句是必須匹配的,只有一個(gè)例外:那就是當(dāng)沒(méi)有 must 語(yǔ)句的時(shí)候,至少有一個(gè) should 語(yǔ)句必須匹配。

我們可以通過(guò) minimum_should_match 參數(shù)控制需要匹配的 should 語(yǔ)句的數(shù)量,它既可以是一個(gè)絕對(duì)的數(shù)字,又可以是個(gè)百分比:

?GET /person/_search
?{
?    "query": {
?        "bool": {
?            "must": [
?                {
?                    "term": {
?                        "sex": {
?                            "value": "女",
?                            "boost": 1.0
?                        }
?                    }
?                }
?            ],
?            "should": [
?                {
?                    "term": {
?                        "address.keyword": {
?                            "value": "峨眉山",
?                            "boost": 1.0
?                        }
?                    }
?                },
?                {
?                    "term": {
?                        "sect.keyword": {
?                            "value": "明教",
?                            "boost": 1.0
?                        }
?                    }
?                }
?            ],
?            "adjust_pure_negative": true,
?            "minimum_should_match": "1",
?            "boost": 1.0
?        }
?    }
?}

Java構(gòu)建查詢語(yǔ)句:

?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 構(gòu)建查詢語(yǔ)句
?searchSourceBuilder.query(QueryBuilders.boolQuery()
? ? ? ?  .must(QueryBuilders.termQuery("sex", "女"))
? ? ? ?  .should(QueryBuilders.termQuery("address.word", "峨眉山"))
? ? ? ?  .should(QueryBuilders.termQuery("sect.keyword", "明教"))
? ? ? ?  .minimumShouldMatch(1)
?);

最后,看一個(gè)復(fù)雜些的例子,將bool的各子句聯(lián)合使用:

?select 
?    *
?from
?    persons
?where 
?    sex = '女'
?and
?    age between 30 and 40
?and 
?    sect != '明教'
?and 
?    (address = '峨眉山' OR skill = '暗器')

Elasticsearch 來(lái)表示上面的 SQL 例子:

?GET /person/_search
?{
?    "query": {
?        "bool": {
?            "must": [
?                {
?                    "term": {
?                        "sex": {
?                            "value": "女",
?                            "boost": 1.0
?                        }
?                    }
?                },
?                {
?                    "range": {
?                        "age": {
?                            "from": 30,
?                            "to": 40,
?                            "include_lower": true,
?                            "include_upper": true,
?                            "boost": 1.0
?                        }
?                    }
?                }
?            ],
?            "must_not": [
?                {
?                    "term": {
?                        "sect.keyword": {
?                            "value": "明教",
?                            "boost": 1.0
?                        }
?                    }
?                }
?            ],
?            "should": [
?                {
?                    "term": {
?                        "address.keyword": {
?                            "value": "峨眉山",
?                            "boost": 1.0
?                        }
?                    }
?                },
?                {
?                    "term": {
?                        "skill.keyword": {
?                            "value": "暗器",
?                            "boost": 1.0
?                        }
?                    }
?                }
?            ],
?            "adjust_pure_negative": true,
?            "minimum_should_match": "1",
?            "boost": 1.0
?        }
?    }
?}

用Java構(gòu)建這個(gè)查詢條件:

?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 構(gòu)建查詢語(yǔ)句
?BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
? ? ? ?  .must(QueryBuilders.termQuery("sex", "女"))
? ? ? ?  .must(QueryBuilders.rangeQuery("age").gte(30).lte(40))
? ? ? ?  .mustNot(QueryBuilders.termQuery("sect.keyword", "明教"))
? ? ? ?  .should(QueryBuilders.termQuery("address.keyword", "峨眉山"))
? ? ? ?  .should(QueryBuilders.rangeQuery("power.keyword").gte(50).lte(80))
? ? ? ?  .minimumShouldMatch(1); ?// 設(shè)置should至少需要滿足幾個(gè)條件
??
?// 將BoolQueryBuilder構(gòu)建到SearchSourceBuilder中
?searchSourceBuilder.query(boolQueryBuilder);

2.2 Filter查詢

query和filter的區(qū)別:query查詢的時(shí)候,會(huì)先比較查詢條件,然后計(jì)算分值,最后返回文檔結(jié)果;而filter是先判斷是否滿足查詢條件,如果不滿足會(huì)緩存查詢結(jié)果(記錄該文檔不滿足結(jié)果),滿足的話,就直接緩存結(jié)果,filter不會(huì)對(duì)結(jié)果進(jìn)行評(píng)分,能夠提高查詢效率。

filter的使用方式比較多樣,下面用幾個(gè)例子演示一下。

方式一,單獨(dú)使用:

?{
?    "query": {
?        "bool": {
?            "filter": [
?                {
?                    "term": {
?                        "sex": {
?                            "value": "男",
?                            "boost": 1.0
?                        }
?                    }
?                }
?            ],
?            "adjust_pure_negative": true,
?            "boost": 1.0
?        }
?    }
?}

單獨(dú)使用時(shí),filter與must基本一樣,不同的是filter不計(jì)算評(píng)分,效率更高

Java構(gòu)建查詢語(yǔ)句:

?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 構(gòu)建查詢語(yǔ)句
?searchSourceBuilder.query(QueryBuilders.boolQuery()
? ? ? ?  .filter(QueryBuilders.termQuery("sex", "男"))
?);

方式二,和must、must_not同級(jí),相當(dāng)于子查詢:

?select * from (select * from persons where sect = '明教')) a where sex = '女';

ES查詢語(yǔ)句:

?{
?    "query": {
?        "bool": {
?            "must": [
?                {
?                    "term": {
?                        "sect.keyword": {
?                            "value": "明教",
?                            "boost": 1.0
?                        }
?                    }
?                }
?            ],
?            "filter": [
?                {
?                    "term": {
?                        "sex": {
?                            "value": "女",
?                            "boost": 1.0
?                        }
?                    }
?                }
?            ],
?            "adjust_pure_negative": true,
?            "boost": 1.0
?        }
?    }
?}

Java:

?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 構(gòu)建查詢語(yǔ)句
?searchSourceBuilder.query(QueryBuilders.boolQuery()
? ? ? ?  .must(QueryBuilders.termQuery("sect.keyword", "明教"))
? ? ? ?  .filter(QueryBuilders.termQuery("sex", "女"))
?);

方式三,將must、must_not置于filter下,這種方式是最常用的:

?{
?    "query": {
?        "bool": {
?            "filter": [
?                {
?                    "bool": {
?                        "must": [
?                            {
?                                "term": {
?                                    "sect.keyword": {
?                                        "value": "明教",
?                                        "boost": 1.0
?                                    }
?                                }
?                            },
?                            {
?                                "range": {
?                                    "age": {
?                                        "from": 20,
?                                        "to": 35,
?                                        "include_lower": true,
?                                        "include_upper": true,
?                                        "boost": 1.0
?                                    }
?                                }
?                            }
?                        ],
?                        "must_not": [
?                            {
?                                "term": {
?                                    "sex.keyword": {
?                                        "value": "女",
?                                        "boost": 1.0
?                                    }
?                                }
?                            }
?                        ],
?                        "adjust_pure_negative": true,
?                        "boost": 1.0
?                    }
?                }
?            ],
?            "adjust_pure_negative": true,
?            "boost": 1.0
?        }
?    }
?}

Java:

?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 構(gòu)建查詢語(yǔ)句
?searchSourceBuilder.query(QueryBuilders.boolQuery()
? ? ? ?  .filter(QueryBuilders.boolQuery()
? ? ? ? ? ? ? ?  .must(QueryBuilders.termQuery("sect.keyword", "明教"))
? ? ? ? ? ? ? ?  .must(QueryBuilders.rangeQuery("age").gte(20).lte(35))
? ? ? ? ? ? ? ?  .mustNot(QueryBuilders.termQuery("sex.keyword", "女")))
?);

3 聚合查詢

接下來(lái),我們將用一些案例演示ES聚合查詢。

3.1 最值、平均值、求和

案例:查詢最大年齡、最小年齡、平均年齡。

SQL:

?select max(age) from persons;

ES:

?GET /person/_search
?{
?    "aggregations": {
?        "max_age": {
?            "max": {
?                "field": "age"
?            }
?        }
?    }
?}

Java:

?@Autowired
?private RestHighLevelClient client;
??
?@Test
?public void maxQueryTest() throws IOException {
?    // 聚合查詢條件
? ? ?AggregationBuilder aggBuilder = AggregationBuilders.max("max_age").field("age");
? ? ?SearchRequest searchRequest = new SearchRequest("person");
? ? ?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
? ? ?// 將聚合查詢條件構(gòu)建到SearchSourceBuilder中
? ? ?searchSourceBuilder.aggregation(aggBuilder);
? ? ?System.out.println("searchSourceBuilder----->" + searchSourceBuilder);
??
? ? ?searchRequest.source(searchSourceBuilder);
? ? ?// 執(zhí)行查詢,獲取SearchResponse
? ? ?SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
? ? ?System.out.println(JSONObject.toJSON(response));
?}

使用聚合查詢,結(jié)果中默認(rèn)只會(huì)返回10條文檔數(shù)據(jù)(當(dāng)然我們關(guān)心的是聚合的結(jié)果,而非文檔)。返回多少條數(shù)據(jù)可以自主控制:

?GET /person/_search
?{
?    "size": 20,
?    "aggregations": {
?        "max_age": {
?            "max": {
?                "field": "age"
?            }
?        }
?    }
?}

而Java中只需增加下面一條語(yǔ)句即可:

?searchSourceBuilder.size(20);

與max類似,其他統(tǒng)計(jì)查詢也很簡(jiǎn)單:

?AggregationBuilder minBuilder = AggregationBuilders.min("min_age").field("age");
?AggregationBuilder avgBuilder = AggregationBuilders.avg("min_age").field("age");
?AggregationBuilder sumBuilder = AggregationBuilders.sum("min_age").field("age");
?AggregationBuilder countBuilder = AggregationBuilders.count("min_age").field("age");

3.2 去重查詢

案例:查詢一共有多少個(gè)門派。

SQL:

?select count(distinct sect) from persons;

ES:

?{
?    "aggregations": {
?        "sect_count": {
?            "cardinality": {
?                "field": "sect.keyword"
?            }
?        }
?    }
?}

Java:

?@Test
?public void cardinalityQueryTest() throws IOException {
?    // 創(chuàng)建某個(gè)索引的request
? ? ?SearchRequest searchRequest = new SearchRequest("person");
? ? ?// 查詢條件
? ? ?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
? ? ?// 聚合查詢
? ? ?AggregationBuilder aggBuilder = AggregationBuilders.cardinality("sect_count").field("sect.keyword");
? ? ?searchSourceBuilder.size(0);
? ? ?// 將聚合查詢構(gòu)建到查詢條件中
? ? ?searchSourceBuilder.aggregation(aggBuilder);
? ? ?System.out.println("searchSourceBuilder----->" + searchSourceBuilder);
??
? ? ?searchRequest.source(searchSourceBuilder);
? ? ?// 執(zhí)行查詢,獲取結(jié)果
? ? ?SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
? ? ?System.out.println(JSONObject.toJSON(response));
?}

3.3 分組聚合

3.3.1 單條件分組

案例:查詢每個(gè)門派的人數(shù)

SQL:

?select sect,count(id) from mytest.persons group by sect;

ES:

?{
?    "size": 0,
?    "aggregations": {
?        "sect_count": {
?            "terms": {
?                "field": "sect.keyword",
?                "size": 10,
?                "min_doc_count": 1,
?                "shard_min_doc_count": 0,
?                "show_term_doc_count_error": false,
?                "order": [
?                    {
?                        "_count": "desc"
?                    },
?                    {
?                        "_key": "asc"
?                    }
?                ]
?            }
?        }
?    }
?}

Java:

?SearchRequest searchRequest = new SearchRequest("person");
?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?searchSourceBuilder.size(0);
?// 按sect分組
?AggregationBuilder aggBuilder = AggregationBuilders.terms("sect_count").field("sect.keyword");
?searchSourceBuilder.aggregation(aggBuilder);
3.3.2 多條件分組

案例:查詢每個(gè)門派各有多少個(gè)男性和女性

SQL:

?select sect,sex,count(id) from mytest.persons group by sect,sex;

ES:

?{
?    "aggregations": {
?        "sect_count": {
?            "terms": {
?                "field": "sect.keyword",
?                "size": 10
?            },
?            "aggregations": {
?                "sex_count": {
?                    "terms": {
?                        "field": "sex.keyword",
?                        "size": 10
?                    }
?                }
?            }
?        }
?    }
?}

3.4 過(guò)濾聚合

前面所有聚合的例子請(qǐng)求都省略了 query ,整個(gè)請(qǐng)求只不過(guò)是一個(gè)聚合。這意味著我們對(duì)全部數(shù)據(jù)進(jìn)行了聚合,但現(xiàn)實(shí)應(yīng)用中,我們常常對(duì)特定范圍的數(shù)據(jù)進(jìn)行聚合,例如下例。

案例:查詢明教中的最大年齡。 這涉及到聚合與條件查詢一起使用。

SQL:

?select max(age) from mytest.persons where sect = '明教';

ES:

?GET /person/_search
?{
?    "query": {
?        "term": {
?            "sect.keyword": {
?                "value": "明教",
?                "boost": 1.0
?            }
?        }
?    },
?    "aggregations": {
?        "max_age": {
?            "max": {
?                "field": "age"
?            }
?        }
?    }
?}

Java:

?SearchRequest searchRequest = new SearchRequest("person");
?SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
?// 聚合查詢條件
?AggregationBuilder maxBuilder = AggregationBuilders.max("max_age").field("age");
?// 等值查詢
?searchSourceBuilder.query(QueryBuilders.termQuery("sect.keyword", "明教"));
?searchSourceBuilder.aggregation(maxBuilder);

另外還有一些更復(fù)雜的查詢例子。

案例:查詢0-20,21-40,41-60,61以上的各有多少人。

SQL:

?select 
?    sum(case when age<=20 then 1 else 0 end) ageGroup1,
?    sum(case when age >20 and age <=40 then 1 else 0 end) ageGroup2,
?    sum(case when age >40 and age <=60 then 1 else 0 end) ageGroup3,
?    sum(case when age >60 and age <=200 then 1 else 0 end) ageGroup4
?from 
?    mytest.persons;

ES:

?{
?    "size": 0,
?    "aggregations": {
?        "age_avg": {
?            "range": {
?                "field": "age",
?                "ranges": [
?                    {
?                        "from": 0.0,
?                        "to": 20.0
?                    },
?                    {
?                        "from": 21.0,
?                        "to": 40.0
?                    },
?                    {
?                        "from": 41.0,
?                        "to": 60.0
?                    },
?                    {
?                        "from": 61.0,
?                        "to": 200.0
?                    }
?                ],
?                "keyed": false
?            }
?        }
?    }
?}

查詢結(jié)果:

?"aggregations" : {
? ?"age_avg" : {
? ? ?"buckets" : [
? ? ?  {
? ? ? ? ?"key" : "0.0-20.0",
? ? ? ? ?"from" : 0.0,
? ? ? ? ?"to" : 20.0,
? ? ? ? ?"doc_count" : 3
? ? ?  },
? ? ?  {
? ? ? ? ?"key" : "21.0-40.0",
? ? ? ? ?"from" : 21.0,
? ? ? ? ?"to" : 40.0,
? ? ? ? ?"doc_count" : 13
? ? ?  },
? ? ?  {
? ? ? ? ?"key" : "41.0-60.0",
? ? ? ? ?"from" : 41.0,
? ? ? ? ?"to" : 60.0,
? ? ? ? ?"doc_count" : 4
? ? ?  },
? ? ?  {
? ? ? ? ?"key" : "61.0-200.0",
? ? ? ? ?"from" : 61.0,
? ? ? ? ?"to" : 200.0,
? ? ? ? ?"doc_count" : 1
? ? ?  }
? ?  ]
?  }
?}

以上是ElasticSearch查詢的全部?jī)?nèi)容,豐富詳實(shí),堪比操作手冊(cè),強(qiáng)烈建議收藏!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-783277.html

到了這里,關(guān)于ElasticSearch進(jìn)階:多種查詢操作,各種ES查詢以及在Java中的實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot操作ES進(jìn)行各種高級(jí)查詢(值得收藏)

    SpringBoot操作ES進(jìn)行各種高級(jí)查詢(值得收藏)

    創(chuàng)建SpringBoot項(xiàng)目,導(dǎo)入 ES 6.2.1 的 RestClient 依賴和 ES 依賴。在項(xiàng)目中直接引用 es-starter 的話會(huì)報(bào)容器初始化異常錯(cuò)誤,導(dǎo)致項(xiàng)目無(wú)法啟動(dòng)。如果有讀者解決了這個(gè)問(wèn)題,歡迎留言交流 為容器定義 RestClient 對(duì)象 在 yml 文件中配置 eshost 調(diào)用相關(guān) API 執(zhí)行操作 創(chuàng)建操作索引的對(duì)象

    2024年02月03日
    瀏覽(20)
  • Elasticsearch8.8.0 SpringBoot實(shí)戰(zhàn)操作各種案例(索引操作、聚合、復(fù)雜查詢、嵌套等)

    Elasticsearch8.8.0 全網(wǎng)最新版教程 從入門到精通 通俗易懂 引入依賴 添加配置文件 application.yaml 導(dǎo)入ca證書到項(xiàng)目中 從任意一個(gè)es容器中,拷貝證書到resources目錄下 [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-EXytUrDp-1691330960034)(media/16912196423122/16

    2024年02月13日
    瀏覽(28)
  • SpringBoot操作ES進(jìn)行各種高級(jí)查詢(值得收藏),阿里P7大佬手把手教你

    SpringBoot操作ES進(jìn)行各種高級(jí)查詢(值得收藏),阿里P7大佬手把手教你

    for(SearchHit?hit:searchHits){ //?文檔的主鍵 String?id?=?hit.getId(); //?源文檔內(nèi)容 MapString,?Object?sourceAsMap?=?hit.getSourceAsMap(); String?name?=?(String)?sourceAsMap.get(“name”); //?由于前邊設(shè)置了源文檔字段過(guò)慮,這時(shí)description是取不到的 String?description?=?(String)?sourceAsMap.get(“description”

    2024年04月24日
    瀏覽(24)
  • 一文全覽各種 ES 查詢?cè)?Java 中的實(shí)現(xiàn)

    一文全覽各種 ES 查詢?cè)?Java 中的實(shí)現(xiàn)

    以下為摘錄自用,非本人撰寫 本文基于elasticsearch 7.13.2版本,es從7.0以后,發(fā)生了很大的更新。7.3以后,已經(jīng)不推薦使用TransportClient這個(gè)client,取而代之的是Java High Level REST Client。 首先是,Mysql中的部分測(cè)試數(shù)據(jù): Mysql中的一行數(shù)據(jù)在ES中以一個(gè)文檔形式存在: 簡(jiǎn)單梳理了一

    2024年02月11日
    瀏覽(16)
  • 【ElasticSearch】使用 Java 客戶端 RestClient 實(shí)現(xiàn)對(duì)文檔的查詢操作,以及對(duì)搜索結(jié)果的排序、分頁(yè)、高亮處理

    【ElasticSearch】使用 Java 客戶端 RestClient 實(shí)現(xiàn)對(duì)文檔的查詢操作,以及對(duì)搜索結(jié)果的排序、分頁(yè)、高亮處理

    在 Elasticsearch 中,通過(guò) RestAPI 進(jìn)行 DSL 查詢語(yǔ)句的構(gòu)建通常是通過(guò) HighLevelRestClient 中的 resource() 方法來(lái)實(shí)現(xiàn)的。該方法包含了查詢、排序、分頁(yè)、高亮等所有功能,為構(gòu)建復(fù)雜的查詢提供了便捷的接口。 RestAPI 中構(gòu)建查詢條件的核心部分是由一個(gè)名為 QueryBuilders 的工具類提供

    2024年01月16日
    瀏覽(41)
  • Elasticsearch ES操作:查詢數(shù)據(jù)(全部、分頁(yè)、單條)

    查詢 條件查詢 指定條數(shù) 返回結(jié)果

    2024年02月16日
    瀏覽(25)
  • Elasticsearch基礎(chǔ)學(xué)習(xí)-常用查詢和基本的JavaAPI操作ES

    Elasticsearch基礎(chǔ)學(xué)習(xí)-常用查詢和基本的JavaAPI操作ES

    Elasticsearch是一個(gè)基于 lucene 、分布式、通過(guò)Restful方式進(jìn)行交互的 近實(shí)時(shí)搜索 平臺(tái)框架。 ELK技術(shù)棧是Elasticsearch、Logstash、Kibana三大開(kāi)元框架首字母大寫簡(jiǎn)稱。 而Elasticsearch 是一個(gè) 開(kāi)源的高擴(kuò)展的分布式全文搜索引擎 , 是整個(gè) ELK技術(shù)棧的核心。 Elasticsearch是一個(gè)基于lucene、分

    2024年02月11日
    瀏覽(20)
  • ES es Elasticsearch 十三 Java api 實(shí)現(xiàn)搜索 分頁(yè)查詢 復(fù)雜查詢 過(guò)濾查詢 ids查詢 等

    目錄 Java api 實(shí)現(xiàn)搜索 Pom.xml 建立鏈接 搜索全部記錄 增加規(guī)則值查某些字段 搜索分頁(yè) 全代碼 Ids 搜索 搜索Match搜索 multi_match 搜索 多字段搜索 復(fù)雜查詢 bool查詢 filter? bool 復(fù)雜查詢?cè)黾舆^(guò)濾器查詢 復(fù)雜擦好像加排序 日志 思路 參考 api 寫法 寫Java代碼 請(qǐng)求條件構(gòu)建層次

    2024年02月04日
    瀏覽(24)
  • java使用ElasticSearch的scroll查詢,高效的解決es查詢數(shù)量的限制。

    (1)首先我們要明白es的查詢機(jī)制:ES的搜索是分2個(gè)階段進(jìn)行的,即 Query階段和Fetch階段 。 Query階段 比較輕量級(jí),通過(guò)查詢倒排索引,獲取滿足查詢結(jié)果的文檔ID列表。 Fetch階段 比較重,需要將每個(gè)分片的查詢結(jié)果取回,在協(xié)調(diào)結(jié)點(diǎn)進(jìn)行 全局 排序。 通過(guò)From+size這種方式分批

    2024年02月03日
    瀏覽(41)
  • Elasticsearch實(shí)戰(zhàn)(十七)---ES搜索如何使用In操作查詢及如何Distinct去除重復(fù)數(shù)據(jù)

    Elasticsearch實(shí)戰(zhàn)(十七)---ES搜索如何使用In操作查詢及如何Distinct去除重復(fù)數(shù)據(jù)

    Elasticsearch實(shí)戰(zhàn)-ES搜索如何使用In操作查詢filter過(guò)濾及如何Distinct去除重復(fù)數(shù)據(jù) 場(chǎng)景: ES搜索, 獲取手機(jī)號(hào)是 19000001111 或者 19000003333 后者 19000004444 的人, 并且 性別是男, 且 年齡是[20-30]的人,這種查詢用mysql 如何實(shí)現(xiàn) ? 在mysql中會(huì)用in查詢, 但是在ES中 我們實(shí)現(xiàn)就是 term

    2023年04月09日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包