es~ElasticsearchTemplate的查(cha)詢(xun)和聚(ju)合(he)
查詢條件
主要包含了以下幾個
- match_all
- match
- term
- range
match
match類型查(cha)詢,會把(ba)查(cha)詢條(tiao)件進(jin)行(xing)分(fen)詞(ci),然后再查(cha)詢,詞(ci)條(tiao)之間是or關系,按照(zhao)相關性(xing)得分(fen)排(pai)序。
GET /lind/_search
{
"query": {
"match":{
"name": "hello world"
}
}
}
改(gai)成and,并且的關系
GET /lind/_search
{
"query":{
"match":{
"title":{
"query":"中國生活",
"operator":"and"
}
}
}
}
minimum_should_match參數:match支持使用minimum_should_match 最小匹配參數,通常設置為一個百分數.
用戶給定(ding)的(de)條件分詞后,有3個(ge)詞,但是其中的(de)2個(ge)是在描述他想要搜索的(de)內容,那我們使用minimum_should_match就(jiu)是最好(hao)的(de)選擇!
GET /lind/_search
{
"query":{
"match":{
"title":{
"query":"中國人",
"minimum_should_match":"75%"
}
}
}
}
多字段查詢 muti_match
muti_match和match一樣,但是(shi)不同的是(shi)它可(ke)以(yi)同時在多個字段中(zhong)檢索
GET /lind/_search
{
"query":{
"multi_match":{
"query":"國產",
"fields":["title","name"]
}
}
詞條查詢term
它被用作精確查詢,比如數字,時間,布爾,和字段屬性為keyword類型的關鍵字,后面講的聚合也只支持精確字段,而分詞字段text是不被支持的。
GET /lind/_search
{
"query": {
"term": {
"sex": {
"value": "中國"
}
}
}
}

聚合
聚(ju)合操作,我們可以對數據進(jin)行(xing)分組的(de)(de)求(qiu)和,求(qiu)數,最大值(zhi),最小值(zhi),或(huo)者其它的(de)(de)自定(ding)義的(de)(de)統(tong)計功能(neng),es對聚(ju)合有著(zhu)不(bu)錯的(de)(de)支持,需要(yao)注意的(de)(de)是,在對某(mou)字段(duan)進(jin)行(xing)聚(ju)合之后,需要(yao)開啟這(zhe)個(ge)字段(duan)的(de)(de)fielddata我,或(huo)者會出現(xian)如下錯誤:
Fielddata is disabled on text fields by default.
通過postman等工作像es api發送請(qing)求,可以將字段的這個特性打開(kai).
PUT /esdto/esdto/_mapping
{
"properties": {
"sex": {
"type": "text",
"fielddata": true
}
}
}

使用ElasticsearchTemplate對sex字段進行(xing)聚(ju)合
// 創建一個查詢條件對象
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
// 拼接查詢條件
queryBuilder.should(QueryBuilders.termQuery("creator", "1"));
// 創建聚合查詢條件
TermsAggregationBuilder agg = AggregationBuilders.terms("sex").field("sex.keyword");//keyword表示不使用分詞進行聚合
// 創建查詢對象
SearchQuery build = new NativeSearchQueryBuilder()
.withQuery(queryBuilder) //添加查詢條件
.addAggregation(agg) // 添加聚合條件
.withPageable(PageRequest.of(0, 10)) //符合查詢條件的文檔分頁(不是聚合的分頁)
.build();
// 執行查詢
AggregatedPage<TestEsDto> testEntities = elasticsearchTemplate.queryForPage(build, TestEsDto.class);
// 取出聚合結果
Aggregations entitiesAggregations = testEntities.getAggregations();
Terms terms = (Terms) entitiesAggregations.asMap().get("sex");
// 遍歷取出聚合字段列的值,與對應的數量
for (Terms.Bucket bucket : terms.getBuckets()) {
String keyAsString = bucket.getKeyAsString(); // 聚合字段列的值
long docCount = bucket.getDocCount();// 聚合字段對應的數量
log.info("keyAsString={},value={}", keyAsString, docCount);
}