Elasticsearch查詢操作
索引中最基本的單元叫做文檔 document. 在es中文檔的示例如下:
{
"_index": "questions",
"_type": "baichebao",
"_id": "4",
"_score": 1,
"_version" : 1,
"_source": {
"id": 4,
"content": "汽車常見故障的解決辦法有哪些?",
"uid": 1,
"all_answer_count": 2,
"series_id": 0,
"score": 0,
"answer_count": 2
}
文檔中下劃線開頭的是es自帶的字段
_index 代表索引名_type 代表類型_id 代表文檔id,如果插入文檔的時候沒有設置id的話,那么es會自動生成一個唯一id_score 這個不是文檔自帶的,而是進行搜索的時候返回的,代表這個文檔和搜索的相關匹配分值_source 儲存原始文本及分類好的字段_version 代表這個文檔的版本一:terms查詢
如果你想要找到所有售價等于10000美刀的車,那么可以使用一個terms查詢:
GET /cars/transactions/_search
{
"query": {
"term": {
" PRice ": "10000"
}
}
}
二:filtered查詢
如果你想要找到所有售價高于10000美刀的車,那么可以使用一個filtered查詢:
POST /cars/transactions/_search
{
"query" : {
"filtered": {
"filter": {
"range": {
"price": {
"gte": 10000
}
}
}
}
}
}
該查詢(包含了一個過濾器)返回文檔的一個特定子集,然后聚合工作在該子集上。
三:agg聚合查詢
對索引中全部的車計算其平均價格
POST /cars/transactions/_search
{
"aggs": {
"car_avg": {
"avg": {
"field": "price"
}
}
}
}
四:過濾聚合聯合查詢
如果你想要找到所有售價高于10000美刀的車,同時也對這些車計算其平均價格,那么可以這樣查詢:
POST /cars/transactions/_search
{
"query" : {
"filtered": {
"filter": {
"range": {
"price": {
"gte": 10000
}
}
}
}
},
"aggs" : {
" car_avg ": {
"avg" : { "field" : "price" }
}
}
五:聚合嵌套查詢
如果你想要找到不同顏色的車的數量,并且計算不同顏色的車的平均價錢,那么可以這樣查詢
POST /cars/transactions/_search
{
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
六:聚合并列查詢
如果你想要找到不同顏色的車的數量,還要知道全部車的平均價錢,那么可以這樣查詢
{
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
},
"colors": {
"terms": {
"field": "color"
}
}
}
}
七:綜合查詢
場景:查詢出某一天adtype(廣告位id)為2的數據每小時有幾條,每小時的總收益和平均收益
{
"query": {
"bool": {
"must": [
{
"term": {
"adtype": "2"
}
},
{
"match_all": {}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 20,
"sort": [],
"aggs": {
"adxtime": {
"date_histogram": {
"field": "adx_reporttime",
"interval": "1h",
"min_doc_count": 0
},
"aggs": {
"sum_price": {
"sum": {
"field": "price"
}
},
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
一:獲取es客戶端
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "pangu")
.put("client.transport.sniff", true) //允許嗅探
.build();
Client client = TransportClient.builder()
.settings(settings) //設置部分
.build()
.addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName("192.168.33.203"), 9300));
.addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName("192.168.33.204"), 9300));
二:簡單查詢(對應restful查詢第一點)
BoolQueryBuilder qb = QueryBuilders.boolQuery();
qb.must(new QueryStringQueryBuilder("10000").field("" price "));
SearchResponse response = client
.prepareSearch("cars ")
.setTypes("transactions ")
.setSearchType(SearchType.DEFAULT).setFrom(0).setSize(10)
.setQuery(qb)
.execute().actionGet();
for (SearchHit hit : response.getHits().getHits()) {
System.out.println(hit.getSource().get("price"));
}
三:聚合嵌套查詢(對應restful查詢第五點)
AggregationBuilder aggs = AggregationBuilders.terms("colors").field(
"color");
aggs.subAggregation(AggregationBuilders.avg("avg_price").field("price"));
SearchResponse response = client
.prepareSearch("cars")
.setTypes("transactions")
.setSearchType(SearchType.DEFAULT)
.addAggregation(aggs)
.execute().actionGet();
Terms terms = response.getAggregations().get("colors");
for (Bucket b : terms.getBuckets()) {
System.out.print(b.getKey() + "有:");
System.out.println(b.getDocCount() + " 輛");
Avg avg = b.getAggregations().get("avg_price");
System.out.print(b.getKey() + "平均:");
System.out.println(avg.getValue()+ "元");
}
四:聚合并列查詢(對應restful查詢第六點)
AggregationBuilder aggs1 = AggregationBuilders.terms("avg_price").field(
"price");
AggregationBuilder aggs2 = AggregationBuilders.terms("colors").field(
"color");
SearchResponse response = client
.prepareSearch("cars")
.setTypes("transactions")
.setSearchType(SearchType.DEFAULT)
.addAggregation(aggs1)
.addAggregation(aggs2)
.execute().actionGet();
Avg avg = response.getAggregations().get("avg_price");
System.out.println(avg.getValue()+ "元");
Terms terms = response.getAggregations().get("colors");
for (Bucket b : terms.getBuckets()) {
System.out.print(b.getKey() + "有:");
System.out.println(b.getDocCount() + " 輛");
}
五:綜合查詢
場景:查詢出某一天adtype(廣告位id)為2的數據每小時有幾條,每小時的總收益和平均收益
String str = "ad_detail_model";
String indexs[] = str.split(",");
BoolQueryBuilder qb = QueryBuilders.boolQuery();
qb.must(new QueryStringQueryBuilder("2").field("adtype"));
DateHistogramInterval d1 = new DateHistogramInterval("1h");
AggregationBuilder aggs1 = AggregationBuilders.dateHistogram("timeAgg")
.field("adx_reporttime").interval(d1).minDocCount(0);
aggs1.subAggregation(AggregationBuilders.sum("sumAgg").field("price"));
aggs1.subAggregation(AggregationBuilders.avg("avgAgg").field("price"));
SearchResponse response = client
.prepareSearch(indexs)
.setSearchType(SearchType.DEFAULT)
.setQuery(qb)
.addAggregation(aggs1)
.execute().actionGet();
Histogram agg = response.getAggregations().get("timeAgg");
System.out.println("===================================");
for (Histogram.Bucket entry : agg.getBuckets()) {
System.out.println("*******************************************");
Sum sum = entry.getAggregations().get("sumAgg");
System.out.print(entry.getKey() + "總共有:");
System.out.println(sum.getValue()+ "元");
Avg avg = entry.getAggregations().get("avgAgg");
System.out.print(entry.getKey() + "平均有:");
System.out.println(avg.getValue()+ "元");
String key = ""+ entry.getKey(); // Key
String keyAsString = entry.getKeyAsString(); // Key as String
long docCount = entry.getDocCount(); // Doc count
System.out.println(keyAsString+"有:"+docCount+" 個");
System.out.println("*******************************************");
}
System.out.println("===================================");
新聞熱點
疑難解答
圖片精選