第一次寫博客,有什么問問還請多多指教
參考:(2017-11-07)
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-api.html
一、前言
該文檔為es的java API,所有操作本質上都是完全異步執行,在客戶端的操作可以被累計並且批量執行。
5.6.0版本被設計於用來在java應用中代替TransportClient,TransportClient將會在將來的版本中被棄用。
二、安裝部署
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>
三、安裝過程遇到的問題
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
四、Transport Client
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();
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...
3.傳輸客戶端自帶一個集群嗅探特性,可以動態地添加新主機並刪除舊主機,當啟用這個特性時,傳輸客戶端將連接到其內部節點列表中的節點(即通過1中
addTransportAddress添加的節點),此后,客戶端將調用這些節點上的內部集群API來發現可用的數據節點。客戶端的內部節點列表將僅被這些數據節點替換。默認情況下,該列表5秒鍾刷新一次。請注意,嗅探器連接的IP地址是在節點的es的配置文件中聲明的作為發布的地址。
如果該節點不是一個數據節點,列表可能不包括它連接到的原始節點。例如,如果您最初連接到一個主節點,在嗅探之后,不會再有請求訪問該主節點,而是訪問其他只要有數據的節點。傳輸客戶端不包含非數據節點的原因是為了避免將搜索流量發送到主節點。
嗅探器開啟方式:
Settings settings = Settings.builder() .put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings);
其他transport client的設置包括:
client.transport.ignore_cluster_name :設置為true 可以忽略節點連接時對集群名字的校驗
client.transport.ping_timeout :設置一個節點在得到response時的等待時間,默認5秒
client.transport.nodes_sampler_interval:多久進行獲取/ping 列出的節點並且連接,默認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()
你也可以用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();
六、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();
七、Delete API
//通過索引、類型、id進行刪除
DeleteResponse response = client.prepareDelete("megacorp", "employee", "5").get(); 支持設置線程模型
八、Delete By Query API
//通過條件過濾來批量刪除索引中的文檔
BulkByScrollResponse response =DeleteByQueryAction.INSTANCE.newRequestBuilder(esClient.client)
.filter(QueryBuilders.matchQuery("age", 18)).source("megacorp").get();
long deleted = response.getDeleted();
//如果運行時間長,希望異步執行,可以使用execute代替get並且提供一個監聽器
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
}
});
九、Update API
(博客園的文檔編輯實在太難用了,我放棄了,有想看的直接看API文檔吧)
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-update.html