1,前期的准備工作。
(1)測試使用的elastic search的版本是2.3.1版的,具體版本可以上官網下載,本地虛擬機配置的是3台服務器的集群。
(2)使用的jar包是2.3.5版本的。
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.3.5</version>
</dependency>
2,獲取transportclient的方式,通過esIp(elastic search集群服務器IP地址,也可以只傳主節點的IP地址),以及elasticClusterName(這個集群的名字是在集群安裝時,在config/elasticsearch.yml 里面可以配置,配置參數為:cluster.name) 獲取transportClient對象,transportClient對象應設置成單例的對象。另外transportclient是通過9300端口來和es集群進行通信的,所以在新建InetSockTransportAddress對象時,需要指定端口號為9300。
private static Byte LOCK = 1 ;
public static TransportClient getTransportClientInstance(String esIp,String elasticClusterName) throws IOException {
if (transportClient == null) {
synchronized (LOCK) {
if (transportClient == null) {
transportClient = getTransportClient(esIp,elasticClusterName);
}
}
}
return transportClient;
}
/**
* 獲取ES的連接client實例;
*/
private static TransportClient getTransportClient(String esIp,String elasticClusterName) throws IOException {
Settings settings = Settings.builder()
.put("cluster.name", "testSearch")
.put("client.transport.sniff", true)
.build();
TransportClient transportClient = TransportClient.builder().settings(settings).build();
String[] ips =esIp.split(",");
for (String ip : ips) {
try {
InetSocketTransportAddress ist = new InetSocketTransportAddress(InetAddress.getByName(ip),9300);
transportClient.addTransportAddress(ist);
}catch (Exception e){
}
}
return transportClient;
}
3, 添加索引,官網上有好幾種添加索引的方式,這邊只介紹其中的兩種。
(1)用Java代碼構造一個XcontenBuilder的對象, 然后通過上面獲得的transportclient來發送http請求來添加索引,其中下面的client.prepareIndex(INDEX, TYPE)方法接受兩個參數INDEX和TYPE,INDEX是指索引庫的名稱,相當於mysql里面的數據庫庫名。TYPE是索引庫的類型,相當於mysql數據庫中的表名。
(需要注意的是,es在為一個文檔創建索引的同時會為你創建好索引庫的INDEX, 以及TYPE。不同於mysql,mysql中你需要先創建數據庫以及數據庫的表,然后你才能向相應的表中插入數據;es的話,不用提前創建好INDEX以及TYPE,你在向es添加數據的同時,INDEX和TYPE就創建完成了。)
/**
* 添加索引,結果查看 http://192.168.183.111:9200/_plugin/head/
*
*/
@Test
public void addIndex() {
TransportClient client = null;
try {
client = ESConnectFactory.getTransportClient("192.168.25.101",“esname”);
client.prepareIndex("cars", "transactions")
.setSource(jsonBuilder()
.startObject()
.field("price", 30000)
.field("color", "red")
.field("make", "benz")
.field("sold", "2014-10-25")
.endObject()
)
.get();
} catch (IOException e) {
e.printStackTrace();
}
}
(2)在linux的平台上,通過curl命令,直接發送put請求來添加索引。其中上述所說的INDEX對應下面例子中的cars, TYPE對應下面例子中的transaction,另外car/transactions/1 中的1代表創建索引指定的id=1。
curl -XPUT 'http://192.168.25.101:9200/cars/transactions/1' -d '{
"price": 30000,
"color" : "red",
"make":"benz",
"sold":"2015-10-01",
}'
4,刪除索引(刪除一個文檔),也有兩種方式
(1) 通過java代碼構造一個Delete的請求。其中prepareDelete(INDEX, TYPE, ID)方法接受三個參數,分別是索引庫的INDEX, TYPE以及需要刪除文檔的ID。
@Test
public void deleteIndex() {
TransportClient client = null;
try {
client = ESConnectFactory.getTransportClient("192.168.25.101");
DeleteResponse deleteResponse = client.prepareDelete(INDEX,TYPE,"AWGEs4y2jvUUEBNtYcCs").get();
System.out.println(deleteResponse.isFound());//return true if a doc was found to delete
} catch (IOException e) {
e.printStackTrace();
}
}
(2) 通過curl命令刪除
#刪除一個文檔 curl -XDELETE 'http://192.168.25.101:9200/cars/transactions/AWGDE486jvUUEBNtYcCp'
5,更新索引。
(1) java代碼進行更新,調用prepareUpdate(INDEX, TYPE, ID)的方法
@Test
public void prepareUpdate(){
TransportClient client = null;
try {
client = ESConnectFactory.getTransportClient("192.168.25.101");
client.prepareUpdate(INDEX, TYPE, "AWD46dWwaZGQx7zF0th7")
.setDoc(jsonBuilder()
.startObject()
.field("color", "red")
.endObject())
.get();
} catch (Exception e) {
e.printStackTrace();
}
}
(2)使用curl命令, 發送post請求
curl -XPOST 'http://172.16.0.14:9200/cars/transaction/AWD46dWwaZGQx7zF0th7/_update' -d '{
"doc": {
"color" :"red"
}
}'
6,簡單的查詢方法
(1)構造get請求
/**
* 通過id獲取索引文檔
*/
@Test
public void getDoc() {
TransportClient client = null;
try {
client = ESConnectFactory.getTransportClient("192.168.25.101");
GetResponse response = client.prepareGet(INDEX, TYPE, "AWD46PG8aZGQx7zF0th6").get();
String sourceAsString = response.getSourceAsString();
System.out.println(sourceAsString);
System.out.println(response.getSourceAsString());
} catch (IOException e) {
e.printStackTrace();
}
}
(2) 使用curl命令發送get請求
curl -XGET 'http://192.168.25.101:9200/cars/transaction/AWD46PG8aZGQx7zF0th6'
