Elasticsearch 之(43) Java API 實現 ES 的 增刪改查、聚合分析
需求:(1)首先按照country國家來進行分組(2)然後在每個country分組內,再按照入職年限進行分組(3)最後計算每個分組內的平均薪資package com.es.app; import java.net.InetAddress; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.transport.client.PreBuiltTransportClient; /** * 員工搜尋應用程式 * @author Administrator * */ public class EmployeeSearchApp { @SuppressWarnings({ "unchecked", "resource" }) public static void main(String[] args) throws Exception { Settings settings = Settings.builder() .put("cluster.name", "elasticsearch") .build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); // prepareData(client); executeSearch(client); client.close(); } /** * 執行搜尋操作 * @param client */ private static void executeSearch(TransportClient client) { SearchResponse response = client.prepareSearch("company") .setTypes("employee") .setQuery(QueryBuilders.matchQuery("position", "technique")) .setPostFilter(QueryBuilders.rangeQuery("age").from(30).to(40)) .setFrom(0).setSize(1) .get(); SearchHit[] searchHits = response.getHits().getHits(); for(int i = 0; i < searchHits.length; i++) { System.out.println(searchHits[i].getSourceAsString()); } } /** * 準備資料 * @param client */ private static void prepareData(TransportClient client) throws Exception { client.prepareIndex("company", "employee", "1") .setSource(XContentFactory.jsonBuilder() .startObject() .field("name", "jack") .field("age", 27) .field("position", "technique software") .field("country", "china") .field("join_date", "2017-01-01") .field("salary", 10000) .endObject()) .get(); client.prepareIndex("company", "employee", "2") .setSource(XContentFactory.jsonBuilder() .startObject() .field("name", "marry") .field("age", 35) .field("position", "technique manager") .field("country", "china") .field("join_date", "2017-01-01") .field("salary", 12000) .endObject()) .get(); client.prepareIndex("company", "employee", "3") .setSource(XContentFactory.jsonBuilder() .startObject() .field("name", "tom") .field("age", 32) .field("position", "senior technique software") .field("country", "china") .field("join_date", "2016-01-01") .field("salary", 11000) .endObject()) .get(); client.prepareIndex("company", "employee", "4") .setSource(XContentFactory.jsonBuilder() .startObject() .field("name", "jen") .field("age", 25) .field("position", "junior finance") .field("country", "usa") .field("join_date", "2016-01-01") .field("salary", 7000) .endObject()) .get(); client.prepareIndex("company", "employee", "5") .setSource(XContentFactory.jsonBuilder() .startObject() .field("name", "mike") .field("age", 37) .field("position", "finance manager") .field("country", "usa") .field("join_date", "2015-01-01") .field("salary", 15000) .endObject()) .get(); } }
package com.es.app; import java.net.InetAddress; import java.util.Iterator; import java.util.Map; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.search.aggregations.Aggregation; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.StringTerms; import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket; import org.elasticsearch.search.aggregations.metrics.avg.Avg; import org.elasticsearch.transport.client.PreBuiltTransportClient; /** * 員工聚合分析應用程式 * @author Administrator * */ public class EmployeeAggrApp { @SuppressWarnings({ "unchecked", "resource" }) public static void main(String[] args) throws Exception { Settings settings = Settings.builder() .put("cluster.name", "elasticsearch") .build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); SearchResponse searchResponse = client.prepareSearch("company") .addAggregation(AggregationBuilders.terms("group_by_country").field("country") .subAggregation(AggregationBuilders .dateHistogram("group_by_join_date") .field("join_date") .dateHistogramInterval(DateHistogramInterval.YEAR) .subAggregation(AggregationBuilders.avg("avg_salary").field("salary"))) ) .execute().actionGet(); Map<String, Aggregation> aggrMap = searchResponse.getAggregations().asMap(); StringTerms groupByCountry = (StringTerms) aggrMap.get("group_by_country"); Iterator<Bucket> groupByCountryBucketIterator = groupByCountry.getBuckets().iterator(); while(groupByCountryBucketIterator.hasNext()) { Bucket groupByCountryBucket = groupByCountryBucketIterator.next(); System.out.println(groupByCountryBucket.getKey() + ":" + groupByCountryBucket.getDocCount()); Histogram groupByJoinDate = (Histogram) groupByCountryBucket.getAggregations().asMap().get("group_by_join_date"); Iterator<org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Bucket> groupByJoinDateBucketIterator = groupByJoinDate.getBuckets().iterator(); while(groupByJoinDateBucketIterator.hasNext()) { org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Bucket groupByJoinDateBucket = groupByJoinDateBucketIterator.next(); System.out.println(groupByJoinDateBucket.getKey() + ":" +groupByJoinDateBucket.getDocCount()); Avg avg = (Avg) groupByJoinDateBucket.getAggregations().asMap().get("avg_salary"); System.out.println(avg.getValue()); } } client.close(); } }
正排索引沒開啟時候,會報錯:
重新構建mappingException in thread "main" Failed to execute phase [query], all shards failed; shardFailures {[yLv8gDZQQ5eMlHYMN0lKTg][company][0]: RemoteTransportException[[yLv8gDZ][127.0.0.1:9300][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[Fielddata is disabled on text fields by default. Set fielddata=true on [country] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.]; }{[yLv8gDZQQ5eMlHYMN0lKTg][company][1]: RemoteTransportException[[yLv8gDZ][127.0.0.1:9300][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[Fielddata is disabled on text fields by default. Set fielddata=true on [country] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.]; }{[yLv8gDZQQ5eMlHYMN0lKTg][company][2]: RemoteTransportException[[yLv8gDZ][127.0.0.1:9300][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[Fielddata is disabled on text fields by default. Set fielddata=true on [country] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.]; }{[yLv8gDZQQ5eMlHYMN0lKTg][company][3]: RemoteTransportException[[yLv8gDZ][127.0.0.1:9300][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[Fielddata is disabled on text fields by default. Set fielddata=true on [country] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.]; }{[yLv8gDZQQ5eMlHYMN0lKTg][company][4]: RemoteTransportException[[yLv8gDZ][127.0.0.1:9300][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[Fielddata is disabled on text fields by default. Set fielddata=true on [country] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.]; }
GET /company/_mapping/employee
DELETE /company
PUT /company
{
"mappings": {
"employee": {
"properties": {
"age": {
"type": "long"
},
"country": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"fielddata": true
},
"join_date": {
"type": "date"
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"position": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"salary": {
"type": "long"
}
}
}
}
}
相關推薦
Elasticsearch 之(43) Java API 實現 ES 的 增刪改查、聚合分析
package com.es.app; import java.net.InetAddress; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.transport.Transpo
Spring Boot(五)基於restful風格的增刪改查
簡介 傳統的SSM專案,如果想要編寫基於restful風格的介面,需要在web.xml配置檔案中配置HiddenHttpMethodFilter過濾器,將頁面普通的put請求轉換成delete、put請求。而spring boot則已經幫我們配置好了,故使用spring boot編寫restfu
Android中使用OrmLite(一):表建立及增刪改查
OrmLite是一個輕量級的ORM框架,面向JAVA語言。也是時下流行的Android的ORM框架之一。在Android中使用Sqlite資料,如果又不想寫SQL,OrmLite或許是個不錯的選擇。 使用OrmLite,首先要在gradle
mongoDB 學習筆記純乾貨(mongoose、增刪改查、聚合、索引、連線、備份與恢復、監控等等)
MongoDB - 簡介 MongoDB 是一個基於分散式檔案儲存的資料庫,由 C++ 語言編寫,旨在為 WEB 應用提供可擴充套件的高效能資料儲存解決方案。 MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富
HBase概念學習(四)Java API之掃描和過濾器
影響 產生 str 實例 分享 get 批量 java api track HBase主要的CRUD操作就不多介紹了,無非就是Put,Get。Delete三個類的運用。 本文相當於是閱讀HBase權威指南的總結。 一、掃描(Scan) 如今看一下掃
ElasticSearch學習筆記(九)Java AP實現搜尋,排序,高亮,分頁
雖然上一篇中的對索引的搜尋可以在一定程度上獲取索引的資訊,但是畢竟功能是有限的,本篇主要是對elasticsearch使用javaAPI實現搜尋功能的筆記。 一、搜尋 package test; import static org.elastics
elasticsearch學習總結(三) Java API的使用範例1
一、關鍵詞查詢 /** * es中查詢日誌* @param page* @param esAppLog* @return*/public List<EsAppLog> getEsAppLogs(Page<EsAppLog> page, EsAppLo
elasticsearch系列(七)java定義score
集群 scrip image search 支持 name dsr 計算方法 dynamic 概述 ES支持groovy 和 java兩種語言自定義score的計算方法,groovy甚至可以嵌套在請求的參數中,有點厲害,不過不在本篇討論範圍。 如何用自定義的java代碼來定
MongoDB學習之(二)java連接
代碼 core UC mongo bte 就是 ava jar包 lan 上一章完了下mongodb的安裝和IDE工具,現在開始使用java進行連接。 第一步:使用jar包, 這裏需要三個包,具體為啥我也不清楚,反正因為報錯,我就按照官方文檔一個個的都下載了。 鏈接:htt
ElasticSearch6(二)-- Java API連接es
RR work monitor 才會 你會 art 端口 有用 erro 此ElasticSearch系列基於最新版的6.2.4版本。 一、pom.xml依賴 <dependencies> <dependency>
springboot上傳下載檔案(3)--java api 操作HDFS叢集+叢集配置
只有光頭才能變強! 前一篇文章講了nginx+ftp搭建獨立的檔案伺服器 但這個伺服器宕機了怎麼辦? 我們用hdfs分散式檔案系統來解決這個問題(同時也為hadoop系列開個頭) 目錄 1、Ubuntu14.04下配置Hadoop(2.8.5)叢集環境詳解(完全分
Linux(centos 7)系列之(三)----Java環境的搭建
上篇博文中,我已經介紹了XShell遠端連線虛擬機器的過程和要注意的一些事項,這篇博文,我就通過XShell遠端連線虛擬機器來搭建java環境,下面是搭建的一些過程。 首先,既然是安裝jdk,那麼肯定是要下載jdk的了,本人不喜歡在linux下用命令線上
【朝花夕拾】記憶體篇之(三)Java GC
在上一篇日誌中有講到,JVM記憶體由程式計數器、虛擬機器棧、本地方法棧、GC堆,方法區五個部分組成。其中GC堆是一塊多執行緒的共享區域,它存在的作用就是存放物件例項。本節中所要講述的各種場景,就發生在這塊區域,垃圾回收也主要發生在GC堆記憶體中。本章內容為高質量面試中幾乎是必問的知識點,尤其是
Zookeeper使用(二)--Java API
一、前言 上一篇部落格我們通過命令列來操作Zookeper的客戶端和服務端並進行相應的操作,這篇主要介紹如何通過API(JAVA)來操作Zookeeper。 二、開發環境配置 首先開啟Zookeeper服務端(上一篇部落格有具體的方法),方便客戶端連線。 配置開發環境環境
Java程式設計師從笨鳥到菜鳥之(四)java開發常用類(包裝,數字處理集合等)(上)
一:首談java中的包裝類 Java為基本型別提供包裝類,這使得任何接受物件的操作也可以用來操作基本型別,直接將簡單型別的變量表示為一個類,在執行變數型別的相互轉換時,我們會大量使用這些包裝類。java是一種面嚮物件語言,java中的類把方法與資料連線在一起,並構成了自
Java程式設計師從笨鳥到菜鳥之(五)java開發常用類(包裝,數字處理集合等)(下)
寫在前面:由於前天專案老師建設局的專案快到驗收階段,所以,前天晚上通宵,昨天睡了大半天,下午我們宿舍聚會,所以時間有點耽誤,希望大家見諒上接:3.Set接 口也是Collection的一種擴充套件,而與List不同的時,在Set中的物件元素不能重複,也就是說你不能把同樣的東西兩
Time in the Subway: 猜數字小遊戲(GuessNum)--Java程式碼實現
/* 需求:開發一個猜數字的小遊戲; * 描述:系統產生一個1-100之間的隨機數(含0和100),請猜出這個數字是多少。 * 1.產生隨機數 * 2.接收鍵盤輸入數字
Elasticsearch 之(25)重寫IK分詞器原始碼來基於mysql熱更新詞庫
熱更新在上一節《IK分詞器配置檔案講解以及自定義詞庫》自定義詞庫,每次都是在es的擴充套件詞典中,手動新增新詞語,很坑(1)每次新增完,都要重啟es才能生效,非常麻煩(2)es是分散式的,可能有數百個節點,你不能每次都一個一個節點上面去修改es不停機,直接我們在外部某個地方新
Elasticsearch 之(12)query string的分詞,修改分詞器以及自定義分詞器
query string分詞query string必須以和index建立時相同的analyzer進行分詞query string對exact value和full text的區別對待 (第10節中詳細闡述過)date:exact value_all:full text比如我
Elasticsearch 之(21)字首搜尋、萬用字元搜尋、正則搜尋、推薦搜尋 和 模糊搜尋
1、字首搜尋搜尋包含KDKE字首的articleID GET /forum/article/_search { "query": { "prefix": { "articleID": { "value": "KDKE" }