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

ElasticSearch進(jìn)階:一文全覽各種ES查詢(xún)?cè)贘ava中的實(shí)現(xiàn)

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

ElasticSearch進(jìn)階:一文全覽各種ES查詢(xún)?cè)贘ava中的實(shí)現(xiàn)

ElasticSearch進(jìn)階:一文全覽各種ES查詢(xún)?cè)贘ava中的實(shí)現(xiàn)

es基本語(yǔ)句詳解 查詢(xún)語(yǔ)句詳解

前言

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

完整項(xiàng)目已上傳至:ElasticSearch Demo 項(xiàng)目,該項(xiàng)目是關(guān)于springboot的集成項(xiàng)目,ElasticSearch部分請(qǐng)關(guān)注【elasticSearch-demo】模塊。覺(jué)得有幫助的隨手點(diǎn)個(gè)start!

這篇博文的主題是ES的查詢(xún),因此我整理了盡可能齊全的ES查詢(xún)場(chǎng)景,形成下面的圖:
java es,Java,elasticsearch,java,大數(shù)據(jù)
本文基于elasticsearch 7.13.2版本,es從7.0以后,發(fā)生了很大的更新。7.3以后,已經(jīng)不推薦使用TransportClient這個(gè)client,取而代之的是Java High Level REST Client RestHighLevelClient。

測(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

es 數(shù)據(jù)

POST test/_doc/1
{
  "id": 1,
  "name": "張無(wú)忌",
  "age": 18,
  "sex": "男",
  "address": "光明頂",
  "sect": "明教",
  "skill": "九陽(yáng)神功",
  "power": 99,
  "create_time": "2021-05-14 16:50:33",
  "modify_time": "2021-06-29 16:48:56"
}

POST test/_doc/2
{
  "id": 2,
  "name": "周芷若",
  "age": 17,
  "sex": "女",
  "address": "峨眉山",
  "sect": "峨嵋派",
  "skill": "九陰真經(jīng)",
  "power": 88,
  "create_time": "2021-05-14 11:37:07",
  "modify_time": "2021-06-29 16:56:40"
}

POST test/_doc/3
{
  "id": 3,
  "name": "趙敏",
  "age": 14,
  "sex": "女",
  "address": "大都",
  "sect": "朝廷",
  "skill": "無(wú)",
  "power": 40,
  "create_time": "2021-05-14 11:37:07",
  "modify_time": "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" : "宋青書(shū)",
    "id" : 4,
    "power" : 50,
    "age" : 21
  }
}

簡(jiǎn)單梳理了一下ES JavaAPI的相關(guān)體系,感興趣的可以自己研讀一下源碼。
java es,Java,elasticsearch,java,大數(shù)據(jù)
接下來(lái),我們用十幾個(gè)實(shí)例,迅速上手ES的查詢(xún)操作,每個(gè)示例將提供SQL語(yǔ)句、ES語(yǔ)句和Java代碼。

1 詞條查詢(xún)

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

1.1 等值查詢(xún)-term

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

SQL:

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

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

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

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

查詢(xún)結(jié)果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : { // 分片信息
    "total" : 1, // 總計(jì)分片數(shù)
    "successful" : 1, // 查詢(xún)成功的分片數(shù)
    "skipped" : 0, // 跳過(guò)查詢(xún)的分片數(shù)
    "failed" : 0  // 查詢(xún)失敗的分片數(shù)
  },
  "hits" : { // 命中結(jié)果
    "total" : {
      "value" : 1, // 數(shù)量
      "relation" : "eq"  // 關(guān)系:等于
    },
    "max_score" : 2.8526313,  // 最高分?jǐn)?shù)
    "hits" : [
      {
        "_index" : "person", // 索引
        "_type" : "_doc", // 類(lèi)型
        "_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精確查詢(xún)
 *
 * @throws IOException
 */

@Autowired
private RestHighLevelClient client;

@Test
public void queryTerm() throws IOException {
	// 根據(jù)索引創(chuàng)建查詢(xún)請(qǐng)求
    SearchRequest searchRequest = new SearchRequest("person");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    // 構(gòu)建查詢(xún)語(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ì)觀(guān)察查詢(xún)結(jié)果,會(huì)發(fā)現(xiàn)ES查詢(xún)結(jié)果中會(huì)帶有_score這一項(xiàng),ES會(huì)根據(jù)結(jié)果匹配程度進(jìn)行評(píng)分。打分是會(huì)耗費(fèi)性能的,如果確認(rèn)自己的查詢(xún)不需要評(píng)分,就設(shè)置查詢(xún)語(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)建查詢(xún)語(yǔ)句:

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

1.2 多值查詢(xún)-terms

多條件查詢(xún)類(lèi)似Mysql里的IN查詢(xún),例如:

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

ES查詢(xún)語(yǔ)句:

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

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

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

1.3 范圍查詢(xún)-range

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

SQL:

select * from pesons where age between 18 and 22;

ES查詢(xún)語(yǔ)句:

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

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

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

1.4 前綴查詢(xún)-prefix

前綴查詢(xún)類(lèi)似于SQL中的模糊查詢(xún)。

SQL:

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

ES查詢(xún)語(yǔ)句:

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

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

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

1.5 通配符查詢(xún)-wildcard

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

SQL:

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

ES查詢(xún)語(yǔ)句:

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

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

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

2 復(fù)合查詢(xún)

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

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

這樣的多條件等值查詢(xún),就要借用到組合過(guò)濾器了,其查詢(xún)語(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)造查詢(xún)語(yǔ)句:

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

2.1 布爾查詢(xún)

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

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)建查詢(xún)語(yǔ)句:

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 構(gòu)建查詢(xún)語(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è)查詢(xún)條件:

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 構(gòu)建查詢(xún)語(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至少需要滿(mǎn)足幾個(gè)條件

// 將BoolQueryBuilder構(gòu)建到SearchSourceBuilder中
searchSourceBuilder.query(boolQueryBuilder);

2.2 Filter查詢(xún)

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

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)建查詢(xún)語(yǔ)句:

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

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

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

ES查詢(xún)語(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)建查詢(xún)語(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)建查詢(xún)語(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 聚合查詢(xún)

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

3.1 最值、平均值、求和

案例:查詢(xún)最大年齡、最小年齡、平均年齡。

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 {
	// 聚合查詢(xún)條件
    AggregationBuilder aggBuilder = AggregationBuilders.max("max_age").field("age");
    SearchRequest searchRequest = new SearchRequest("person");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    // 將聚合查詢(xún)條件構(gòu)建到SearchSourceBuilder中
    searchSourceBuilder.aggregation(aggBuilder);
    System.out.println("searchSourceBuilder----->" + searchSourceBuilder);

    searchRequest.source(searchSourceBuilder);
    // 執(zhí)行查詢(xún),獲取SearchResponse
    SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    System.out.println(JSONObject.toJSON(response));
}

使用聚合查詢(xún),結(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類(lèi)似,其他統(tǒng)計(jì)查詢(xún)也很簡(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 去重查詢(xún)

案例:查詢(xún)一共有多少個(gè)門(mén)派。

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");
    // 查詢(xún)條件
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    // 聚合查詢(xún)
    AggregationBuilder aggBuilder = AggregationBuilders.cardinality("sect_count").field("sect.keyword");
    searchSourceBuilder.size(0);
    // 將聚合查詢(xún)構(gòu)建到查詢(xún)條件中
    searchSourceBuilder.aggregation(aggBuilder);
    System.out.println("searchSourceBuilder----->" + searchSourceBuilder);

    searchRequest.source(searchSourceBuilder);
    // 執(zhí)行查詢(xún),獲取結(jié)果
    SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    System.out.println(JSONObject.toJSON(response));
}

3.3 分組聚合

3.3.1 單條件分組

案例:查詢(xún)每個(gè)門(mén)派的人數(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 多條件分組

案例:查詢(xún)每個(gè)門(mén)派各有多少個(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)行聚合,例如下例。

案例:查詢(xún)明教中的最大年齡。 這涉及到聚合與條件查詢(xú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();
// 聚合查詢(xún)條件
AggregationBuilder maxBuilder = AggregationBuilders.max("max_age").field("age");
// 等值查詢(xún)
searchSourceBuilder.query(QueryBuilders.termQuery("sect.keyword", "明教"));
searchSourceBuilder.aggregation(maxBuilder);

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

案例:查詢(xún)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
			}
		}
	}
}

Java:

查詢(xún)結(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查詢(xún)的全部?jī)?nèi)容,豐富詳實(shí),堪比操作手冊(cè),強(qiáng)烈建議收藏!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-787678.html

es 執(zhí)行語(yǔ)句記錄

# indices下所有數(shù)據(jù)
GET /person/_search
{
  "query": {
    "match_all": {}
  }
}

# 等值查詢(xún)-term
GET /person/_search
{
  "query": {
    "term": {
      "name.keyword": {
        "value": "張無(wú)忌"
      }
    }
  }
}

# 不進(jìn)行score計(jì)算,從而提高查詢(xún)效率
GET /person/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "name.keyword": "張無(wú)忌"
        }
      },
      "boost": 1.2
    }
  }
}

# 多值查詢(xún)-terms
GET /person/_search
{
  "query": {
    "terms": {
      "sect.keyword": [
        "明教",
        "武當(dāng)派"
      ]
    }
  }
}

# 范圍查詢(xún)-range
GET /person/_search
{
  "query": {
    "range": {
      "age": {
        "from": 10,
        "to": 20
      }
    }
  }
}

GET /person/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

# 1.4 前綴查詢(xún)-prefix
GET /person/_search
{
  "query": {
    "prefix": {
      "sect.keyword": {
        "value": "武當(dāng)"
      }
    }
  }
}

# 1.5 通配符查詢(xún)-wildcard
GET /person/_search
{
  "query": {
    "wildcard": {
      "name.keyword": {
        "value": "張*"
      }
    }
  }
}

# 2 復(fù)合查詢(xún)
GET /person/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "sex": {
              "value": "女"
            }
          }
        },
        {
          "term": {
            "sect.keyword": {
              "value": "朝廷"
            }
          }
        }
      ]
    }
  }
}

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

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(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)文章

  • ES es Elasticsearch 十三 Java api 實(shí)現(xiàn)搜索 分頁(yè)查詢(xún) 復(fù)雜查詢(xún) 過(guò)濾查詢(xún) ids查詢(xún) 等

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

    2024年02月04日
    瀏覽(25)
  • Elasticsearch:ES|QL 查詢(xún)中的元數(shù)據(jù)字段及多值字段

    Elasticsearch:ES|QL 查詢(xún)中的元數(shù)據(jù)字段及多值字段

    在今天的文章里,我來(lái)介紹一下 ES|QL 里的元數(shù)據(jù)字段以及多值字段。我們可以利用這些元數(shù)據(jù)字段以及多值字段來(lái)針對(duì)我們的查詢(xún)進(jìn)行定制。這里例子的數(shù)據(jù)集,請(qǐng)參考文章 “Elasticsearch:ES|QL 快速入門(mén)”。 ES|QL 可以訪(fǎng)問(wèn)元數(shù)據(jù)字段。 目前支持的有: _index :文檔所屬的索引

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

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

    2024年02月03日
    瀏覽(41)
  • 【ElasticSearch】ES自動(dòng)補(bǔ)全查詢(xún)與Java接口實(shí)現(xiàn)

    【ElasticSearch】ES自動(dòng)補(bǔ)全查詢(xún)與Java接口實(shí)現(xiàn)

    自動(dòng)補(bǔ)全就是當(dāng)用戶(hù)在搜索框輸入字符時(shí),我們應(yīng)該提示出與該字符有關(guān)的搜索項(xiàng)。 要實(shí)現(xiàn)根據(jù)字母做補(bǔ)全,就必須對(duì)文檔按照拼音分詞。GitHub上有相關(guān)插件,地址:https://github.com/medcl/elasticsearch-analysis-pinyin,下載和ES對(duì)應(yīng)的版本。 安裝步驟: 解壓 上傳到虛擬機(jī)中,elasti

    2024年02月15日
    瀏覽(19)
  • Elasticsearch“滾動(dòng)查詢(xún)“(Scrolling)的機(jī)制的與Java使用ES Client 調(diào)用滾動(dòng)查詢(xún)

    Elasticsearch“滾動(dòng)查詢(xún)“(Scrolling)的機(jī)制的與Java使用ES Client 調(diào)用滾動(dòng)查詢(xún)

    ES在進(jìn)行普通的查詢(xún)時(shí),默認(rèn)只會(huì)查詢(xún)出來(lái)10條數(shù)據(jù)。我們通過(guò)設(shè)置es中的size可以將最終的查詢(xún)結(jié)果從10增加到10000。如果需要查詢(xún)數(shù)據(jù)量大于es的翻頁(yè)限制或者需要將es的數(shù)據(jù)進(jìn)行導(dǎo)出又當(dāng)如何? Elasticsearch提供了一種稱(chēng)為 \\\"滾動(dòng)查詢(xún)\\\"(Scrolling) 的機(jī)制,用于處理大型數(shù)據(jù)集的

    2024年02月11日
    瀏覽(18)
  • ES各種查詢(xún)語(yǔ)法及響應(yīng)結(jié)果

    目錄 查詢(xún) 創(chuàng)建 刪除請(qǐng)求 1. 刪除索引 ?數(shù)據(jù)類(lèi)型 一、創(chuàng)建索引 ?? ?1.1 創(chuàng)建book_test索引 ?? ?1.2 查看索引映射 ?? ?1.3 添加文檔記錄 ?? ?1.4 查詢(xún)文檔 ?? ?1.6 刪除文檔中某一條數(shù)據(jù) 二、查詢(xún)語(yǔ)法 2.1 termterms查詢(xún) 2.2 match查詢(xún)屬于高層查詢(xún),他會(huì)根據(jù)你查詢(xún)的字段類(lèi)型不一樣

    2023年04月09日
    瀏覽(24)
  • SpringBoot 整合 ES 進(jìn)行各種高級(jí)查詢(xún)搜索

    SpringBoot 整合 ES 進(jìn)行各種高級(jí)查詢(xún)搜索

    上一章:《ElasticSearch集群的搭建》 如果你還未安裝es的相關(guān)信息,請(qǐng)先移步至:《ElasticSearch安裝》進(jìn)行安裝 如果您的SpringBoot項(xiàng)目還未整合es,請(qǐng)移步至:《SpringBoot整合ElasticSearch實(shí)現(xiàn)模糊查詢(xún),批量CRUD,排序,分頁(yè),高亮》 同時(shí)本文的操作中涉及到ElasticSearchRepository和Ela

    2023年04月15日
    瀏覽(23)
  • PyTorch 各種池化層函數(shù)全覽與用法演示

    目錄 torch.nn.functional子模塊Pooling層詳解 avg_pool1d 用法與用途 參數(shù) 注意事項(xiàng) 示例代碼 avg_pool2d 用法與用途 參數(shù) 注意事項(xiàng) 示例代碼 avg_pool3d 用法與用途 參數(shù) 注意事項(xiàng) 示例代碼 max_pool1d 用法與用途 參數(shù) 注意事項(xiàng) 示例代碼 max_pool2d 用法與用途 參數(shù) 注意事項(xiàng) 示例代碼 max_pool

    2024年02月01日
    瀏覽(53)
  • SpringBoot操作ES進(jìn)行各種高級(jí)查詢(xún)(值得收藏)

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

    創(chuàng)建SpringBoot項(xiàng)目,導(dǎo)入 ES 6.2.1 的 RestClient 依賴(lài)和 ES 依賴(lài)。在項(xiàng)目中直接引用 es-starter 的話(huà)會(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)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包