Elasticsearch(二)elasticsearch索引資料與簡單檢索GET一個文件
本文參考elasticsearch權威指南。
是一個學習筆記,按照裡面的示例進行學習,在此記錄跟蹤。
與elasticsearch互動的兩種方式
JAVA API
如果你和我一樣,使用java,在程式碼中你可以使用 Elasticsearch 內建的兩個客戶端:
節點客戶端(Node client)
節點客戶端作為一個非資料節點加入到本地叢集中。換句話說,它本身不儲存任何資料,但是它知道資料在叢集中的哪個節點中,並且可以把請求轉發到正確的節點。
傳輸客戶端(Transport client)
輕量級的傳輸客戶端可以可以將請求傳送到遠端叢集。它本身不加入叢集,但是它可以將請求轉發到叢集中的一個節點上。
兩個 Java 客戶端都是通過 9300 埠並使用本地 Elasticsearch 傳輸 協議和叢集互動。叢集中的節點通過埠 9300 彼此通訊。如果這個埠沒有開啟,節點將無法形成一個叢集。
PS:Java 客戶端作為節點必須和 Elasticsearch 有相同的 主要 版本;否則,它們之前將無法互相理解。即客戶端使用的版本要與伺服器相對應。
推薦使用傳輸客戶端,下面是一個連線客戶端的小例子:
Settings settings = Settings.builder().put("cluster.name", "bdrg")//叢集名稱
.put("client.transport.sniff" , true)//sniff功能
.put("client.transport.ping_timeout","100s")//連線超時
.build();
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));//連線IP和PORT
RESTFUL API WITH JSON OVER HTTP
所有其他語言可以使用 RESTful API 通過埠 9200 和 Elasticsearch 進行通訊,你可以用你最喜愛的 web 客戶端訪問 Elasticsearch 。事實上,正如你所看到的,你甚至可以使用 curl 命令來和 Elasticsearch 互動。
Elasticsearch 為以下語言提供了官方客戶端 –Groovy、JavaScript、.NET、 PHP、 Perl、 Python 和 Ruby–還有很多社群提供的客戶端和外掛,所有這些都可以在 Elasticsearch Clients 中找到。
一個 Elasticsearch 請求和任何 HTTP 請求一樣由若干相同的部件組成:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
被 < > 標記的部件:
VERB :
適當的 HTTP 方法 或 謂詞 : GET、
POST、
PUT、
HEAD 或者 DELETE
。
PROTOCOL:
http 或者 https(如果你在 Elasticsearch 前面有一個
https 代理)
HOST :
Elasticsearch 叢集中任意節點的主機名,或者用 localhost 代表本地機器上的節點。
PORT :
執行 Elasticsearch HTTP 服務的埠號,預設是 9200 。
PATH :
API 的終端路徑(例如 _count 將返回叢集中文件數量)。Path 可能包含多個元件,例如:_cluster/stats 和 _nodes/stats/jvm 。
QUERY_STRING :
任意可選的查詢字串引數 (例如 ?pretty 將格式化地輸出 JSON 返回值,使其更容易閱讀)
BODY :
一個 JSON 格式的請求體 (如果請求需要的話)
例如,計算叢集中文件的數量,我們可以用這個:
curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
"query": {
"match_all": {}
}
}
Elasticsearch 返回一個 HTTP 狀態碼(例如:200 OK)和(除
HEAD請求)一個 JSON 格式的返回值。前面的
curl 請求將返回一個像下面一樣的 JSON 體:
{
"count" : 0,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
}
}
在返回結果中沒有看到 HTTP 頭資訊是因為我們沒有要求curl顯示它們。想要看到頭資訊,需要結合
-i 引數來使用 curl 命令:
curl -i -XGET 'localhost:9200/'
面向文件
假如一個User物件其中包含了另一個地址物件,關係型資料庫不能放在一個地方,需要放在另一張表中。elasticsearch卻吧User包含的地址也放在User當中,因為它根據文件來索引資料。
對文件進行索引、檢索、排序和過濾–而不是對行列資料。這是一種完全不同的思考資料的方式,也是 Elasticsearch 能支援複雜全文檢索的原因。
例如一個JSON 文件,它代表了一個 user 物件:
{
"email": "[email protected]",
"first_name": "John",
"last_name": "Smith",
"info": {
"bio": "Eco-warrior and defender of the weak",
"age": 25,
"interests": [ "dolphins", "whales" ]
},
"join_date": "2014/05/01"
}
雖然原始的 user 物件很複雜,但這個物件的結構和含義在 JSON 版本中都得到了體現和保留。在 Elasticsearch 中將物件轉化為 JSON 並做索引要比在一個扁平的表結構中做相同的事情簡單的多。
幾乎所有的語言都有相應的模組可以將任意的資料結構或物件 轉化成 JSON 格式,只是細節各不相同。具體請檢視 serialization 或者 marshalling 這兩個 處理 JSON 的模組。官方 Elasticsearch 客戶端 自動為您提供 JSON 轉化。
下面是一個elasticsearch自動提供json轉化的示例:
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.field("vehicleId", "BCAAAD0005")
.endObject();
String json4 = builder.string();
System.out.println(json4);
顯示如下:
{"vehicleId":"BCAAAD0005"}
接下來我們學習怎樣操作資料,以一個僱員目錄為例:
我們受僱於 Megacorp 公司,作為 HR 部門新的 “熱愛無人機” (“We love our drones!”)激勵專案的一部分,我們的任務是為此建立一個僱員目錄。該目錄應當能培養僱員認同感及支援實時、高效、動態協作,因此有一些業務需求:
• 支援包含多值標籤、數值、以及全文字的資料
• 檢索任一僱員的完整資訊
• 允許結構化搜尋,比如查詢 30 歲以上的員工
• 允許簡單的全文搜尋以及較複雜的短語搜尋
• 支援在匹配文件內容中高亮顯示搜尋片段
• 支援基於資料建立和管理分析儀表盤
建立僱員文件
也稱索引僱員文件。
第一個業務需求就是儲存僱員資料。 這將會以 僱員文件 的形式儲存:一個文件代表一個僱員。儲存資料到 Elasticsearch 的行為叫做 索引 ,但在索引一個文件之前,需要確定將文件儲存在哪裡。
一個 Elasticsearch 叢集可以 包含多個 索引(類比資料庫) ,相應的每個索引可以包含多個 型別 (類比表)。 這些不同的型別儲存著多個 文件 (類比資料),每個文件又有 多個 屬性 (類比欄位)。
對於僱員目錄,我們將做如下操作:
• 每個僱員索引一個文件,包含該僱員的所有資訊。
• 每個文件都將是 employee 型別 。
• 該型別位於 索引 megacorp 內。
• 該索引儲存在我們的 Elasticsearch 叢集中。
實踐中這非常簡單(儘管看起來有很多步驟),我們可以通過一條命令完成所有這些動作:
PUT /megacorp/employee/1
{
“first_name” : “John”,
“last_name” : “Smith”,
“age” : 25,
“about” : “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}
注意,路徑 /megacorp/employee/1 包含了三部分的資訊:
megacorp 索引名稱
employee 型別名稱
1 特定僱員的ID
請求體 —— JSON 文件 —— 包含了這位員工的所有詳細資訊,他的名字叫 John Smith ,今年 25 歲,喜歡攀巖。
很簡單!無需進行執行管理任務,如建立一個索引或指定每個屬性的資料型別之類的,可以直接只索引一個文件。Elasticsearch 預設地完成其他一切,因此所有必需的管理任務都在後臺使用預設設定完成。
進行下一步前,讓我們增加更多的員工資訊到目錄中:
PUT /megacorp/employee/2
{
“first_name” : “Jane”,
“last_name” : “Smith”,
“age” : 32,
“about” : “I like to collect rock albums”,
“interests”: [ “music” ]
}
PUT /megacorp/employee/3
{
“first_name” : “Douglas”,
“last_name” : “Fir”,
“age” : 35,
“about”: “I like to build cabinets”,
“interests”: [ “forestry” ]
}
用客戶端連線的方式完成以上操作的示例
POM檔案
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- <dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.2.0</version>
</dependency> -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.3.0</version>
</dependency>
<!-- logger for client -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.8</version>
</dependency>
</dependencies>
其中如果你的elasticsearch伺服器沒有對應的客戶端傳輸org.elasticsearch.client,請使用類似於2.0.0版本的依賴。
initData.java–客戶端連線
public class InitialData {
private static Logger logger = (Logger) LogManager.getLogger(InitialData.class);
/**
* 獲得連線
* @param clusterName 叢集名稱
* @param sniff 是否增加嗅探功能
* @param time 設定超時時間
* @param ip 連線IP
* @param port 連線port,傳輸埠一般都是9300
* @return
* @throws UnknownHostException
*/
public static Client connect(String clusterName,boolean sniff,int time,String ip,int port) throws UnknownHostException {
//叢集名稱 -- 預設"elasticsearch"
String cluster = null;
if(null == clusterName || ("").equals(clusterName.trim())) {
cluster = "elasticsearch";
}else {
cluster = clusterName;
}
//是否增加嗅探功能
//連線超時時間 -- 最小5s
if(time < 5) {
time = 5;
}
Settings settings = Settings.builder().put("cluster.name", cluster)//叢集名稱
.put("client.transport.sniff", sniff)//sniff功能
.put("client.transport.ping_timeout",time+"s")//連線超時時限
.build();
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip),port));//連線IP和PORT
logger.info("連線成功...");
return client;
}
}
ClientDemo2 .java–模擬僱員示例
public class ClientDemo2 {
/*
* 索引僱員文件,相當於我們傳統資料庫的insert操作
* 對於僱員目錄,我們將做如下操作:
每個僱員索引一個文件,包含該僱員的所有資訊。 --doc
每個文件都將是 employee 型別 。 --type
該型別位於 索引 megacorp 內。 --index
該索引儲存在我們的 Elasticsearch 叢集中。
*/
private static void insertEmployee (Client client) throws Exception{
//1.插入第一個員工,員工id為1,插在當前叢集下的megacorp索引(類比資料庫)employee型別(類比表)下
IndexResponse response = client.prepareIndex("megacorp","employee","1")//index type id(表特定僱員)
.setSource(XContentFactory.jsonBuilder()
.startObject()
.field("first_name","John")
.field("last_name","Smith")
.field("age",25)
.field("about","I love to go rock climbing")
.array("interests", new String[] {"sports","music"})
.endObject()).get();
//索引名稱
String _index = response.getIndex();
//鍵入名稱
String _type = response.getType();
//檔案ID(生成與否)
String _id = response.getId();
//版本(如果這是您首次索引此文件,您將獲得:1)--- 每次執行版本數都會+1
long _version = response.getVersion();
// status has stored current instance statement。
RestStatus status = response.status();
System.out.println("index:"+_index+";type:"+_type+";id:"+_id+";version:"+_version+";status:"+status);//
System.out.println(response.getResult().toString());//第一次執行是CREATED,同一個id第二次開始是UPDATED
//2.插入第二個員工
//你也可以手工寫入自己的json
String json ="{"+
"\"first_name\":\"Jane\","+
"\"last_name\":\"Smith\","+
"\"age\":\"32\","+
"\"about\":\"I like to collect rock albums\","+
"\"interests\":[\"music\"]"+
"}";
IndexResponse response2 = client.prepareIndex("megacorp","employee","2")
.setSource(json,XContentType.JSON)
.get();
System.out.println(response2.getResult().toString());//CREATED
//3.插入第三個員工,不想獲得結果可以直接呼叫
client.prepareIndex("megacorp","employee","3")//index type id(表特定僱員)
.setSource(XContentFactory.jsonBuilder()
.startObject()
.field("first_name","Douglas")
.field("last_name","Fir")
.field("age",35)
.field("about","I like to build cabinets")
.array("interests", "forestry")
.endObject()).get();
}
public static void main(String[] args) {
// 獲得客戶端連線
Client client = null;
try {
client = InitialData.connect("bdrg", true, 100, "127.0.0.1", 9300);
// 1.索引僱員文件
insertEmployee (client);
} catch (UnknownHostException e) {
System.out.println("伺服器地址錯誤:"+e.getMessage());
} catch (Exception e) {
System.out.println("客戶端操作錯誤:"+e.getMessage());
e.printStackTrace();
} finally {
// 關閉客戶端
if(null != client) {
client.close();
}
}
}
}
可以多次執行,插入操作第一次會執行插入,第二次或以上會執行為更新操作。
結果顯示:
no modules loaded
loaded plugin [org.elasticsearch.index.reindex.ReindexPlugin]
loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
loaded plugin [org.elasticsearch.script.mustache.MustachePlugin]
loaded plugin [org.elasticsearch.transport.Netty3Plugin]
loaded plugin [org.elasticsearch.transport.Netty4Plugin]
連線成功…
index:megacorp;type:employee;id:1;version:5;status:OK
UPDATED
UPDATED
Head外掛操作示例
再次點選:
看我們索引中的資料:
我們的interets資料呢?
(還可以選擇json格式的,只有table格式的出不來)
它沒有表示成一個欄位顯示出來。也很符合邏輯。
簡單檢索一個文件
目前我們已經在 Elasticsearch 中儲存了一些資料, 接下來就能專注於實現應用的業務需求了。第一個需求是可以檢索到單個僱員的資料。
這在 Elasticsearch 中很簡單。簡單地執行 一個 HTTP GET 請求並指定文件的地址——索引庫、型別和ID。 使用這三個資訊可以返回原始的 JSON 文件:
GET /megacorp/employee/1
返回結果包含了文件的一些元資料,以及 _source 屬性,內容是 John Smith 僱員的原始 JSON 文件:
{
"_index" : "megacorp",
"_type" : "employee",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
}
用客戶端連線的方式完成以上操作的示例
接著上一個示例中寫,我們增加一個檢索方法:
main方法中增加呼叫
// 1.索引僱員文件
//insertEmployee(client);
// 2.簡單檢索一個文件 GET
getOneEmployee(client,"megacorp","employee","1");
增加的方法
/* 簡單檢索一個文件 GET
* 簡單地執行 一個 HTTP GET 請求並指定文件的地址——索引庫、型別和ID。 使用這三個資訊可以返回原始的 JSON 文件:
* {
"_index" : "megacorp",
"_type" : "employee",
"_id" : "1",
"_version" : 5,
"found" : true,
"_source" : {
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
}
*/
private static void getOneEmployee(Client client,String index,String type,String id)throws Exception {
GetResponse response3 = client.prepareGet(index, type, id).execute().actionGet();
System.out.println(response3.getSourceAsString());//這是_source部分
//{"first_name":"John","last_name":"Smith","age":25,"about":"I love to go rock climbing","interests":["sports","music"]}
System.out.println(response3.getIndex()+"--"+response3.getType()+"--"+response3.getId()+"--"+response3.getVersion());
}
結果顯示:
連線成功…
{“first_name”:”John”,”last_name”:”Smith”,”age”:25,”about”:”I love to go rock climbing”,”interests”:[“sports”,”music”]}
megacorp–employee–1—5
Head外掛操作示例
相關推薦
Elasticsearch(二)elasticsearch索引資料與簡單檢索GET一個文件
本文參考elasticsearch權威指南。 是一個學習筆記,按照裡面的示例進行學習,在此記錄跟蹤。 與elasticsearch互動的兩種方式 JAVA API 如果你和我一樣,使用java,在程式碼中你可以使用 Elasticsearch 內建的
搜尋引擎elasticsearch(二)--http介面資料操作
一、簡介這裡將介紹,通過http請求,對es進行索引和資料操作。es中使用的是REST api方式,即通知http的方法不同來執行不同的操作。操作主要有兩塊,一是對索引本身的操作;二是對索引資料的操作。都包含了增刪改查操作。二、操作這裡直接上程式碼,解釋請參考註釋。#!/us
(轉)虛擬內存與內存映射文件區別與聯系
程序 指令 ref 知識庫 緩沖 網站架構 文件的 計算機 聯系 虛擬內存與內存映射文件是操作系統內存管理的重要部分,二者有相似也有不同的地方,本文是作者學習與應用中得到的一些體會,有錯誤的地方,請提點。 二者的聯系:虛擬內存與內存映射文件都是將一部分內容加載的內存,另
(24)Python實現遞歸生成或者刪除一個文件目錄及文件
path 生成 std fun created elif ror spa else import os,errno #基本工具類 #①遞歸生成輸入的路徑下面的文件夾或文件 #②遞歸刪除輸入的路徑下面的文件夾及文件 ‘‘‘ param : dirPath return :
Elasticsearch 通關教程(二): 索引對映Mapping問題
資料庫建表的時候,我們的DDL語句一般都會指定每個欄位的儲存型別,例如:varchar,int,datetime等等,目的很明確,就是更精確的儲存資料,防止資料型別格式混亂。 CREATE TABLE `shop_` ( `id_` varchar(36) NOT NULL COMMENT 'id',
ElasticSearch學習總結(二):ES介紹與架構說明
本文主要從概念以及架構層面對Elasticsearch做一個簡單的介紹,在介紹ES之前,會先對ES的“發動機”Lucene做一個簡單的介紹 1. Lucene介紹 為了更深入地理解ElasticSearch的工作原理,特別是索引和查詢這兩個過程,理解Lucene的工作原理至關重要。本
win環境下把MySql中的資料匯入到Elasticsearch(二)
環境問題參考我上文: 環境問題已經好了,接下來,我們講實戰。 該壓縮包幫助mysql與其他平臺連線。看到很多資源都要積分,不能選0分,所以選1分了 在bin目錄下建立jdbc.config 根據需求改連線,賬號,密碼,名字,埠等等。 input {
Yii2整合Elasticsearch(二)
背景知識: 全文搜尋可以簡單地分為兩類,一種是順序掃描,即我們常見的使用 like %keyword% 方式,掃描整張資料表,在每一條記錄中查詢;另一種就是索引掃描。elasticsearch就是後者。 索引掃描分為兩部分:建立索引和搜尋索引。建立索引的主要步驟是:對原資料進行分詞處
Elasticsearch學習(二)Elasticsearch核心概念
核心概念 (1)Near Realtime(NRT):近實時,兩個意思,從寫入資料到資料可以被搜尋到有一個小延遲(大概1秒);基於es執行搜尋和分析可以達到秒級 (2)Cluster:叢集,包含多個節點,每個節點屬於哪個叢集是通過一個配置(叢集名稱,預設是elasticsearc
elasticsearch(二)java 使用同步步方法進行查詢操作
一、 基本步驟: 1)建立連線物件: RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(
深入理解ElasticSearch(八):索引管理
索引管理 1、建立一個索引 到目前為止, 我們已經通過索引一篇文件建立了一個新的索引 。這個索引採用的是預設的配置,新的欄位通過動態對映的方式被新增到型別對映。現在我們需要對這個建立索引的過程做更多的控制:我們想要確保這個索引有數量適中的主分片,並且在我們索引任何資料 之
Elasticsearch(二)基礎API
叢集健康 curl localhost:9200/_cat/health?v epoch timestamp cluster status node.total node.data shards pri relo init unassi
windows 10 在docker下安裝elasticsearch(二)
ElasticSearch6.3版本中增加了elasticsearch sql, 最近為了研究elasticsearch sql,突發奇想的想在docker中安裝es。 本文主要介紹的就是在windo
資料結構(二)之順序佇列與鏈佇列
順序佇列 運用陣列結構來構建的線性佇列就是順序佇列。 本例實現了順序佇列的入隊、出隊、判斷隊空、初始化佇列、列印佇列等操作。 #include<iostream> using namespace std; const int m=1000; struct
ElasticSearch教程(二)——ElasticSearch基本外掛head
公司一直在使用ES作為分散式的搜尋引擎,由於資料量的不斷升高,ES出現了效能瓶頸。公司決定進一步的優化ES配置,所以最近幾天在研究ES,最近會更新一系列ES的教程,希望大家持續關注。不多說了,Action。 前言 這篇文章我們介紹一個非常好的工具:ela
ElasticSearch(二)Kibana、版本控制
Kibana簡介: Kibana視覺化介面 Kibana是一個開源的分析和視覺化平臺,設計用於和Elasticsearch一起工作。 你用Kibana來搜尋,檢視,並和儲存在Elasticsearch索引中的資料進行互動。 你可以輕鬆地執行高階資料分析,並且以各種圖示、表格和地圖的形式視覺化資料。 Ki
小微企業阿里雲最佳實踐系列(二):RDS 資料庫與DMS 資料庫管理(資料管理)
關聯博文小微企業阿里雲最佳實踐系列(一):ECS 伺服器與 RDS 資料庫 概述 閱讀物件 本博文主要寫給創業團隊、技術團隊人數 < 5 人、沒有專業運維等小微企業作為參考,需要掌握基礎的伺服器管理、軟體開發等經驗。 博文主要內容 在上一篇博文中主要介紹了 ECS 伺服器與 RDS 資料庫,在
ElasticSearch 菜鳥筆記(二)ElasticSearch 安裝
環境 Red Hat 4.4.7-4 ElasticSearch 5.1.1 java 1.8.0_40 環境說明:ElasticSearch 在跳躍到版本號 5.1.1 之後 ,要求 java 版本號至少為 1.8 。
Elasticsearch(二):使用JAVA API實現簡單查詢、聚合查詢
ES版本:2.3.1 JDK:1.8 所需要的jar包請在ES安裝路徑下的jars包中獲得,不要使用其他的jar否則容易出現版本問題! 注意:程式碼中TransportClient client=ESLink.getTransportClient()
Elasticsearch(2):索引詳談
在上一篇部落格中,介紹了ES中的一些核心概念和ES、Kibana安裝方法。本節開始,我們從索引開始來學習ES的操作方法。 1 建立索引¶ 建立一個索引的方法很簡單,在Kibana中執行下行請求即可建立一個名為“i