java api使用ElastichSearch指南

AggregationBuilders.terms:一段時間內,某個字段取值的數量排名前幾的聚合

/ ** 	@param startTime 開始的時間* @param endTime 結束的時間* @param termAggName term過濾* @param fieldName 要做count的字段* @param top 返回的數量*/
RangeQueryBuilder actionPeriod = QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second");
TermsBuilder termsBuilder = AggregationBuilders.terms(termAggName).field(fieldName).size(top).order(Terms.Order.count(false));
return client.prepareSearch(INDICE).setQuery(actionPeriod).addAggregation(termsBuilder).setSize(0).execute().actionGet();     
復制代碼

order(Terms.Order.count(false)):表示降序

size(top):top表示只要排序的數量

prepareSearch(INDICE):INDICE表示索引的名字

setSize(0):表示只要聚合結果

如果需要去掉某些特殊字段取值 client為構建的ES客戶端

 BoolQueryBuilder actionPeriodMustNot = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second")).mustNot(QueryBuilders.termQuery(field, value));
復制代碼

如果是單個字段特定的多個值

//values是個List
BoolQueryBuilder actioPeriodMust = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second")).must(QueryBuilders.termsQuery(field, values));
復制代碼

使用結果

Terms clickCount= sr.getAggregations().get(termAggName);
for (Terms.Bucket term:clickCount.getBuckets()){int key = term.getKeyAsNumber().intValue(); //要排序字段的值long docCount = term.getDocCount(); //數量
}
復制代碼

date_histogram: 一段時間之內,時間字段按照時間間隔的聚合

BoolQueryBuilder actioPeriodMust = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second"));
DateHistogramBuilder actionInterval = AggregationBuilders.dateHistogram(dateNickName).field("myTimeField").timeZone("Asia/Shanghai");
if (timeInterval<MINUTE){actionTimeInterval.interval(DateHistogramInterval.seconds(timeInterval)).format("HH:mm:ss");
}else if (timeInterval<HOUR){actionTimeInterval.interval(DateHistogramInterval.minutes(timeInterval / MINUTE)).format("dd HH:mm");
}else if (timeInterval < DAY){actionTimeInterval.interval(DateHistogramInterval.hours(timeInterval / HOUR)).format("HH:mm");
}else if (timeInterval < THIRTY_DAY){actionTimeInterval.interval(DateHistogramInterval.days(timeInterval / DAY));
}else{actionTimeInterval.interval(DateHistogramInterval.MONTH);
}
actionInterval.format("yyyy-MM-dd HH:mm:ssZ");
return client.prepareSearch(INDICE).setQuery(actioPeriodMust).addAggregation(actionInterval).setSize(0).execute().actionGet();
復制代碼

es本身默認設置的時間戳是 UTC形式,在國內要設置TimeZone(“Asia/Shanghai”);

java的SimpleDateFormate會默認獲取虛擬機所在時區的時間戳,所以存時間的時候,最好存與時區無關的時間,再做本地化顯示

使用結果

Histogram histogram=sr.getAggregations().get(dateNickName);
for(Histogram.Bucket entry:histogram.getBuckets()){String key = entry.getKeyAsString();//時間間隔long count = entry.getDocCount();//數量
}
復制代碼

subAggregation:一段時間內,按照一定的時間間隔,每個間隔段內字段每個取值的數量聚合

相當于合并上述兩個場景

BoolQueryBuilder query = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second")).must(QueryBuilders.termsQuery("action", orderValue));
DateHistogramBuilder actionTimeInterval = AggregationBuilders.dateHistogram(dateNickName).field("myTimeField").timeZone("Asia/Shanghai");
actionTimeInterval.subAggregation(AggregationBuilders.terms(termNickName).field("action").size(size));
return client.prepareSearch(INDICE).setQuery(query).addAggregation(actionTimeInterval).setSize(0).execute().actionGet();
復制代碼

使用結果

Histogram hitogram = sr.getAggregations().get(dateAggName);
for (Histogram.Bucket date : hitogram.getBuckets()) {String intervalName = date.getKeyAsString();long timeIntervalCount = date.getDocCount();if (timeIntervalCount != 0) {Terms terms = date.getAggregations().get(termAggName);for (Terms.Bucket entry : terms.getBuckets()) {int key=	entry.getKeyAsNumber().intValue();long childCount = entry.getDocCount();}}
}
復制代碼

分頁獲取數據

BoolQueryBuilder actionPeriodMust = QueryBuilders.boolQuery().must(QueryBuilders.termQuery(key, value)).must(QueryBuilders.rangeQuery("myTimeField").gte(startTime).lte(endTime).format("epoch_second"));
return client.prepareSearch(INDICE).setQuery(actionPeriodMust).addSort(SortBuilders.fieldSort("myTimeField").order(SortOrder.ASC)).setFrom(from).setSize(size).execute().actionGet();        
復制代碼

使用

Iterator<SearchHit> iterator = sr.getHits().iterator();
while (iterator.hasNext()) {SearchHit next = iterator.next();JSONObject jo = JSONObject.parseObject(next.getSourceAsString());
}
復制代碼

AggregationBuilders.cardinality:獲取某個字段的唯一取值數量

BoolQueryBuilder query = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("myTimeField").gte(startTimeInSec*1000).lte(endTimeInSec*1000).format("epoch_millis"));
CardinalityBuilder fieldCardinality = AggregationBuilders.cardinality(cardinalityAggName).field(field);//field 要獲取的字段
return client.prepareSearch(INDICE).setQuery(query).addAggregation(fieldCardinality).execute().actionGet();
復制代碼

使用結果

Cardinality cardinality = sr.getAggregations().get(cardinalityAggName);
long value = cardinality.getValue();
復制代碼

bool查詢

比如想要addr是beijing的,同時必須滿足條件:name是 paxi,或者,phoneNumber是 1234567890

BoolQueryBuilder searchIdQuery = QueryBuilders.boolQuery();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
while (kvs.hasNext()){Map.Entry<String, String> fieldValue = kvs.next();String field=fieldValue.getKey();String value=fieldValue.getValue();searchIdQuery.should(QueryBuilders.termQuery(field, value));
}
boolQueryBuilder.must(searchIdQuery);
boolQueryBuilder.must(QueryBuilders.termsQuery(key, values));
return client.prepareSearch(INDICE).setQuery(boolQueryBuilder).execute().actionGet();
復制代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451174.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451174.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于JavaScript的數組隨機排序

昨天了解了一下Fisher–Yates shuffle費雪耶茲隨機置亂算法&#xff0c;現在再來看看下面這個曾經網上常見的一個寫法&#xff1a; function shuffle(arr) { arr.sort(function () { return Math.random() - 0.5; }); } 或者使用更簡潔的 ES6 的寫法&#xff1a; function shu…

通用唯一識別碼UUID

UUID是通用唯一識別碼&#xff08;Universally Unique Identifier&#xff09;的縮寫。UUID 的目的&#xff0c;是讓分布式系統中的所有元素&#xff0c;都能有唯一的辨識資訊&#xff0c;而不需要透過中央控制端來做辨識資訊的指定。如此一來&#xff0c;每個人都可以建立不與…

java內省機制 + 內省是什么 + 內省實現方式 + 和反射的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、內省是什么、實現方式&#xff1a; 內省&#xff08;Introspector&#xff09;是Java語言對Bean類屬性、事件的一種缺省處理方法。…

百度聯合長虹發布第二款云手機 售價900元以下

摘要&#xff1a;【搜狐IT消息】5月15日消息&#xff0c;百度今天宣布聯合長虹發布第二款智能手機&#xff0c;采用3.5英寸屏幕、300萬像素攝像頭&#xff0c;650MHz主頻處理器&#xff0c;零售價格在700-899元之間&#xff0c;中國聯通將為其提供話費補貼。 【搜狐IT消息】5月…

vmware workstation17環境安裝centos7

打開控制面板&#xff0c;搜索“服務”&#xff0c;啟動vmware authorize service -------解決無法開啟虛擬機問題之無法連接MKS 2.虛擬機硬盤擴展為15G------解決安裝centos7時出現的“檢查存儲配置出錯”問題 3.硬盤分區----/boot 300mb&#xff08;不能小于200mb&#xff0…

博客園中的源代碼格式顯示

昨天寫了一篇文章&#xff0c;但是在寫的時候呢&#xff0c;沒有注意&#xff0c;直接將代碼復制上去了&#xff0c;今天正好有人提醒&#xff0c;看到了格式的混亂&#xff0c;借此記錄整理一下&#xff0c;如何能直接粘貼代碼&#xff0c;而且格式&#xff08;縮進&#xff0…

static的使用

類中的靜態變量在程序運行期間&#xff0c;其內存空間對所有該類的對象實例而言是共享的&#xff0c;為了節省系統內存開銷、共享資源&#xff0c;應該對一些適合使用static的變量聲明為靜態變量。 變量聲明為static的使用場景&#xff1a; &#xff08;1&#xff09;變量所…

Linux內核的裁剪和移植

linux內核的裁剪和移植具體都在這個網址里面。https://blog.csdn.net/xie0812/article/details/10816059https://blog.csdn.net/xie0812/article/details/10821779轉載于:https://blog.51cto.com/13401435/2145947

李開復唱衰互聯網手機:大部分公司會失敗

摘要&#xff1a;互聯網企業和手機制造企業之間巨大的鴻溝也被李開復鮮明地指出來&#xff1a;“兩個產業差別巨大&#xff0c;企業基因不同。”百度此前也坦誠表示&#xff0c;與長虹合作的千元機&#xff0c;主要是針對2000元以下的用戶體驗&#xff0c;不能與四五千元的蘋果…

【POJ】3268 Silver Cow Party

題目鏈接&#xff1a;http://poj.org/problem?id3268 題意 &#xff1a;有N頭奶牛&#xff0c;M條單向路。X奶牛開party&#xff0c;其他奶牛要去它那里。每頭奶牛去完X那里還要返回。去回都是走的最短路。現在問這里面哪頭奶牛走的路最長。 題解&#xff1a;對每個奶牛i與X做…

java.util.ConcurrentModificationException異常分析

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Java在操作ArrayList、HashMap、TreeMap等容器類時&#xff0c;遇到了java.util.ConcurrentModificationException異常。以ArrayList為例…

redis基本數據類型之String

redis基本數據類型之String redis一共分為5中基本數據類型&#xff1a;String,Hash,List,Set,ZSet String String類型是包含很多種類型的特殊類型&#xff0c;并且是二進制安全的。比如序列化的對象進行儲存&#xff0c;比如一張圖片進行二進制儲存&#xff0c;比如一個簡單…

Laravel5.5之事件監聽、任務調度、隊列

一、事件監聽 流程&#xff1a; 1.1 創建event php artisan make:event UserLogin LoginController.php /*** The user has been authenticated.** param \Illuminate\Http\Request $request* param mixed $user* return mixed*/protected function authenticated(Request …

朱江洪功成身退 朱董配解體誰主格力(圖)

摘要&#xff1a;中國家電營銷委員會副理事長洪仕斌向時代周報記者表示&#xff1a;“朱江洪和董明珠已經完成了他們在格力發展前二十年的使命。“朱董配”解體之后&#xff0c;有人質疑格力“技術營銷”的格局必將被打破&#xff0c;難以延續&#xff0c;“董氏班底”與朱江洪…

一些dos下簡單命令

(1)切換盤符 d: 回車 (2)顯示某目錄下的所有文件或者文件夾(掌握) dir 回車 (3)創建文件夾 md 文件夾名稱 回車 (4)刪除文件夾 rd 文件夾名稱 回車 (5)進入目錄(掌握) 單級進入 cd 目錄名稱 多級進入 cd 目錄名稱1\目錄名稱2\... (6)回退目錄(掌握) 單級回退 cd.. …

ssh服務器拒絕了密碼 請再試一次 Xftp5連接失敗

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我的情況都很簡單&#xff1a; 第一回主機 ip 不對&#xff0c; 第二次 是賬號、密碼都不對。 最后 IP、賬號、密碼都對了 就連上了。

后端DTO(數據傳輸對象)與DAO(數據庫數據源對象)解耦的好處

我們在后端的開發中經常會將DO對象傳到Service層直接作為DTO傳給前端&#xff0c;這樣做其實會有很多弊端。 &#xff08;一&#xff09;DO對象一般其成員域和數據庫字段是對應的&#xff0c;所以不能添加額外的字段&#xff0c;但是有時候端就是需要這個字段。反之前端要向后…

【刷算法】字符串的全排列

題目描述 輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。 分析 沒啥好分析的了&#xff0c;這個題不會&#xff0c;上網查的思路&#xff0c;大概就是&#xff1a; abc分化…

BZOJ.2741.[FOTILE模擬賽]L(分塊 可持久化Trie)

題目鏈接 首先記\(sum\)為前綴異或和&#xff0c;那么區間\(s[l,r]sum[l-1]^{\wedge}sum[r]\)。即一個區間異或和可以轉為求兩個數的異或和。 那么對\([l,r]\)的詢問即求\([l-1,r]\)中某兩個數異或的最大值。 區間中某一個數和已知的一個數異或的最大值可以用可持久化Trie \(O(…

傳騰訊人事大地震 馬化騰將重整公司架構

摘要&#xff1a;5月17日消息&#xff0c;傳騰訊董事長馬化騰將重新組織公司架構&#xff0c;為騰訊大換血。據悉&#xff0c;騰訊之所以選擇互動娛樂部門負責人接任這一重要崗位&#xff0c;也是因為互娛部門業績持續快速發展&#xff0c;成為了“騰訊帝國”發展的核心驅動力之…