1.1. 與集羣交互
可以通過兩種方式來連接到elasticsearch(簡稱es)集羣,第一種是通過在你的程序中創建一個嵌入es節點(Node),使之成爲es集羣的一部分,然後通過這個節點來與es集羣通信。第二種方式是用TransportClient這個接口和es集羣通信。
1.1.1. Node方式
創建嵌入節點的方式如下:
import static org.elasticsearch.node.NodeBuilder.*;
//啓動節點
Node node = nodeBuilder().node();
Client client = node.client();
//關閉節點
node.close();
當你啓動一個節點,它會自動加入同網段的es集羣,一個前提就是es的集羣名(cluster.name)這個參數要設置一致。
默認的話啓動一個節點,es集羣會自動給它分配一些索引的分片,如果你想這個節點僅僅作爲一個客戶端而不去保存數據,你就可以設置把node.data設置成false或 node.client設置成true。下面是例子:
Node node = nodeBuilder().clusterName(clusterName).client(true).node();
還有一種情況是你並不想把節點加入集羣,只想用它進行單元測試時,就要啓動一個“本地”的es,這裏“本地”指的是在jvm的級別下運行,即兩個不同的es節點運行在同一個JVM中時會組成一個集羣。它需要把節點的local參數設置成true,下面是例子:
Node node = nodeBuilder().local(true).node();
1.1.2. TransportClient方式(較直觀,推薦)
通過TransportClient這個接口,我們可以不啓動節點就可以和es集羣進行通信,它需要指定es集羣中其中一臺或多臺機的ip地址和端口,例子如下:
Client client = new TransportClient()
.addTransportAddress(new InetSocketTransportAddress("host1", 9300))
.addTransportAddress(new InetSocketTransportAddress("host2", 9300));
client.close();
如果你需要更改集羣名(默認是elasticsearch),需要如下設置:
Settings settings = ImmutableSettings.settingsBuilder()
.put("cluster.name", "myClusterName").build();
Client client = new TransportClient(settings);
你可以設置client.transport.sniff爲true來使客戶端去嗅探整個集羣的狀態,把集羣中其它機器的ip地址加到客戶端中,這樣做的好處是一般你不用手動設置集羣裏所有集羣的ip到連接客戶端,它會自動幫你添加,並且自動發現新加入集羣的機器。代碼實例如下:
Settings settings = ImmutableSettings.settingsBuilder()
.put("client.transport.sniff", true).build();
TransportClient client = new TransportClient(settings);
1.2. put Mapping定義索引字段屬性
Mapping,就是對索引庫中索引的字段名及其數據類型進行定義,類似於關係數據庫中表建立時要定義字段名及其數據類型那樣,不過es的mapping比數據庫靈活很多,它可以動態添加字段。一般不需要要指定mapping都可以,因爲es會自動根據數據格式定義它的類型,如果你需要對某些字段添加特殊屬性(如:定義使用其它分詞器、是否分詞、是否存儲等),就必須手動添加mapping。有兩種添加mapping的方法,一種是定義在配置文件中,一種是運行時手動提交mapping,兩種選一種就行了。
先介紹在配置文件中定義mapping,你可以把[mapping名].json文件放到config/mappings/[索引名]目錄下,這個目錄要自己創建,一個mapping和一個索引對應,你也可以定義一個默認的mapping,把自己定義的default-mapping.json放到config目錄下就行。json格式如下:
{
"mappings":{
"properties":{
"title":{
"type":"string",
"store":"yes"
},
"description":{
"type":"string",
"index":"not_analyzed"
},
"price":{
"type":"double"
},
"onSale":{
"type":"boolean"
},
"type":{
"type":"integer"
},
"createDate":{
"type":"date"
}
}
}
}
當然,也可以通過請求添加mapping,可以在官方文檔中搜索相關api示例。
同時,可以使用elasticssearch的rest api進行CURD(創建/create、檢索/retrieve、更新/update、刪除/delete)操作。HTTP協議中給出了可在API調用中作爲謂詞使用的一個相當長的請求類型列表。全速的選擇是使用GET獲取所請求的對象當前對象,使用POST來改變當前對象的狀態,使用PUT來創建對象,使用DELETE來銷燬對象,另外還有HEAD用於提取對象的基本信息。