1. 程式人生 > >Elasticsearch 之(43) Java API 實現 ES 的 增刪改查、聚合分析

Elasticsearch 之(43) Java API 實現 ES 的 增刪改查、聚合分析

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();
	}
	
}
需求:(1)首先按照country國家來進行分組(2)然後在每個country分組內,再按照入職年限進行分組(3)最後計算每個分組內的平均薪資
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();
	}
	
}

正排索引沒開啟時候,會報錯:

Exception 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.]; }
重新構建mapping
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)叢集環境詳解(完全分

Linuxcentos 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 12query 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" }