第一次寫博客,有什麼問問還請多多指教
參考:(2017-11-07)
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-api.htmlhtml
1、前言
該文檔爲es的java API,全部操做本質上都是徹底異步執行,在客戶端的操做能夠被累計而且批量執行。
5.6.0版本被設計於用來在java應用中代替TransportClient,TransportClient將會在未來的版本中被棄用。
2、安裝部署
es5.6.3包直接去官網下載
安裝head插件參考:http://www.cnblogs.com/hunttown/p/6723286.html
pom:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
3、安裝過程遇到的問題
1.org.elasticsearch.plugins.NetworkPlugin: elastic search版本低 儘可能讓transport和其版本一致
2.java.lang.IllegalStateException: Message not fully read (request) for requestId [1], action [], readerIndex [21] vs expected [45]; resetting和
java.io.IOException: Invalid string; unexpected character: 180 hex: b4 :若是出現相似這種,通常是客戶端版本和依賴包版本不一致形成的
3.參考http://www.cnblogs.com/softidea/p/6080086.html
4、Transport Clientjava
1.初始化client:
//TransportClient不加入到集羣中,而只是獲得一個或多個傳輸地址而且在每次訪問的時候循環的進行交互
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));
client.close();node
2.若是你用了一個不一樣於elastic search的集羣名字,那你就得設置一下:
Settings settings = Settings.builder().put("cluster.name", "myClusterName").build();
TransportClient client = new PreBuiltTransportClient(settings);
//Add transport addresses and do something with the client...apache
3.傳輸客戶端自帶一個集羣嗅探特性,能夠動態地添加新主機並刪除舊主機,當啓用這個特性時,傳輸客戶端將鏈接到其內部節點列表中的節點(即經過1中
addTransportAddress添加的節點),此後,客戶端將調用這些節點上的內部集羣API來發現可用的數據節點。客戶端的內部節點列表將僅被這些數據節點替換。默認狀況下,該列表5秒鐘刷新一次。請注意,嗅探器鏈接的IP地址是在節點的es的配置文件中聲明的做爲發佈的地址。
若是該節點不是一個數據節點,列表可能不包括它鏈接到的原始節點。例如,若是您最初鏈接到一個主節點,在嗅探以後,不會再有請求訪問該主節點,而是訪問其餘只要有數據的節點。傳輸客戶端不包含非數據節點的緣由是爲了不將搜索流量發送到主節點。
嗅探器開啓方式:
Settings settings = Settings.builder() .put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings);json
其餘transport client的設置包括:
client.transport.ignore_cluster_name :設置爲true 能夠忽略節點鏈接時對集羣名字的校驗
client.transport.ping_timeout :設置一個節點在獲得response時的等待時間,默認5秒
client.transport.nodes_sampler_interval:多久進行獲取/ping 列出的節點而且鏈接,默認5秒
5、Index API
Index API容許將一個json類型的文檔索引到一個特定的索引中而且使其能夠被搜索到
1.Use Elasticsearch helpers
這裏json化咱們用es提供的內置助手:
import static org.elasticsearch.common.xcontent.XContentFactory.*;
XContentBuilder builder = jsonBuilder().startObject().field("user", "kimchy")
.field("postDate", new Date()) .field("message", "trying out Elasticsearch") .endObject()api
你也能夠用tartArray(String) 和 endArray()添加arrays數組,field支持數值、日期、甚至其餘XContentBuilder類型,String json = builder.string()能夠查看json
2.Index document
//將一個json格式的文檔索引到一個叫megacorp的索引中,其類型爲employee,id爲5
import static org.elasticsearch.common.xcontent.XContentFactory.*;
IndexResponse response = client.prepareIndex("megacorp","employee","5")
.setSource(jsonBuilder().startObject().field("sex","male").field("age",100).endObject()).get();
//若是是已經格式化好的json文檔,不用給出id
IndexResponse response = client.prepareIndex("megacorp", "employee").setSource(jsonString, XContentType.JSON) .get();
// 索引名字
String _index = response.getIndex();
//類型
String _type = response.getType();
// 文檔id
String _id = response.getId();
// 版本 (第一次索引文檔返回1)
long _version = response.getVersion();
// 狀態
RestStatus status = response.status();
6、Get API
//經過索引、類型、id進行查詢
GetResponse response = client.prepareGet("megacorp", "employee", "5").get();
異步特性:當API的實際執行在同一個節點上時,能夠設置線程模型來執行操做,operationThreaded設爲true操做將在不一樣的線程下執行,false表明在調用線程
執行, GetResponse response = client.prepareGet("twitter", "tweet", "1").setOperationThreaded(false).get();
7、Delete API
//經過索引、類型、id進行刪除
DeleteResponse response = client.prepareDelete("megacorp", "employee", "5").get(); 支持設置線程模型
8、Delete By Query API數組
//經過條件過濾來批量刪除索引中的文檔異步
BulkByScrollResponse response =DeleteByQueryAction.INSTANCE.newRequestBuilder(esClient.client)
.filter(QueryBuilders.matchQuery("age", 18)).source("megacorp").get();
long deleted = response.getDeleted();elasticsearch
//若是運行時間長,但願異步執行,能夠使用execute代替get而且提供一個監聽器ide
DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchQuery("age", "99"))
.source("megacorp")
.execute(new ActionListener<BulkByScrollResponse>() {
public void onResponse(BulkByScrollResponse response) {
long deleted = response.getDeleted();
logger.info("number of deleted documents: {}",deleted);
}
public void onFailure(Exception e) {
// Handle the exception
}
});
9、Update API(博客園的文檔編輯實在太難用了,我放棄了,有想看的直接看API文檔吧)https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-update.html