Elasticsearch Java High Level REST Client(Index API)

Index API

索引請求

IndexRequest須要如下參數:json

IndexRequest request = new IndexRequest(
        "posts", 
        "doc",  
        "1");   
String jsonString = "{" +
        "\"user\":\"kimchy\"," +
        "\"postDate\":\"2013-01-30\"," +
        "\"message\":\"trying out Elasticsearch\"" +
        "}";
request.source(jsonString, XContentType.JSON);
  • posts — 索引。
  • doc — 類型。
  • 1 — 文檔ID。
  • 文檔源以字符串形式提供。

提供文檔源

除了上面顯示的String示例以外,還能夠以不一樣的方式提供文檔源:segmentfault

Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("user", "kimchy");
jsonMap.put("postDate", new Date());
jsonMap.put("message", "trying out Elasticsearch");
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1")
        .source(jsonMap);
  • 文檔源做爲Map提供,可自動轉換爲JSON格式。
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
    builder.field("user", "kimchy");
    builder.timeField("postDate", new Date());
    builder.field("message", "trying out Elasticsearch");
}
builder.endObject();
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1")
        .source(builder);
  • 文檔源做爲XContentBuilder對象提供,Elasticsearch內置輔助生成JSON內容。
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1")
        .source("user", "kimchy",
                "postDate", new Date(),
                "message", "trying out Elasticsearch");
  • 文檔源做爲Object鍵值對提供,轉換爲JSON格式。

可選參數

能夠選擇提供如下參數:異步

request.routing("routing");
  • 路由值。
request.parent("parent");
  • parent值。
request.timeout(TimeValue.timeValueSeconds(1)); 
request.timeout("1s");
  • 等待主碎片可用的做爲TimeValue的超時。
  • 等待主碎片可用的做爲String的超時。
request.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);
request.setRefreshPolicy("wait_for");
  • 刷新策略做爲WriteRequest.RefreshPolicy實例提供。
  • 刷新策略做爲String提供。
request.version(2);
  • 版本。
request.versionType(VersionType.EXTERNAL);
  • 版本類型。
request.opType(DocWriteRequest.OpType.CREATE); 
request.opType("create");
  • 操做類型做爲DocWriteRequest.OpType值提供。
  • 做爲String提供的操做類型:能夠爲createupdate(默認)。
request.setPipeline("pipeline");
  • 索引文檔以前要執行的攝取管道的名稱。

同步執行

如下列方式執行IndexRequest時,客戶端在繼續執行代碼以前等待返回IndexResponseide

IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

異步執行

執行IndexRequest也能夠以異步方式完成,以便客戶端能夠直接返回,用戶須要經過將請求和偵聽器傳遞給異步索引方法來指定響應或潛在故障的處理方式:post

client.indexAsync(request, RequestOptions.DEFAULT, listener);
  • 要執行的IndexRequest和執行完成時要使用的ActionListener

異步方法不會阻塞並當即返回,一旦完成,若是執行成功完成,則使用onResponse方法回調ActionListener,若是失敗則使用onFailure方法。ui

index的典型偵聽器以下所示:code

listener = new ActionListener<IndexResponse>() {
    @Override
    public void onResponse(IndexResponse indexResponse) {
        
    }

    @Override
    public void onFailure(Exception e) {
        
    }
};
  • onResponse — 執行成功完成時調用。
  • onFailure — 當整個IndexRequest失敗時調用。

索引響應

返回的IndexResponse容許檢索有關已執行操做的信息,以下所示:對象

String index = indexResponse.getIndex();
String type = indexResponse.getType();
String id = indexResponse.getId();
long version = indexResponse.getVersion();
if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) {
    
} else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
    
}
ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
    
}
if (shardInfo.getFailed() > 0) {
    for (ReplicationResponse.ShardInfo.Failure failure :
            shardInfo.getFailures()) {
        String reason = failure.reason(); 
    }
}
  • 處理(若是須要)第一次建立文檔的狀況。
  • 處理(若是須要)文檔被重寫的狀況,由於它已經存在。
  • 處理成功碎片數小於總碎片數的狀況。
  • 處理潛在的失敗。

若是存在版本衝突,則拋出ElasticsearchException索引

IndexRequest request = new IndexRequest("posts", "doc", "1")
        .source("field", "value")
        .version(1);
try {
    IndexResponse response = client.index(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) {
    if (e.status() == RestStatus.CONFLICT) {
        
    }
}
  • 引起的異常表示返回了版本衝突錯誤。

若是將opType設置爲create而且已存在具備相同索引、類型和ID的文檔,則會發生相同的狀況:ip

IndexRequest request = new IndexRequest("posts", "doc", "1")
        .source("field", "value")
        .opType(DocWriteRequest.OpType.CREATE);
try {
    IndexResponse response = client.index(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) {
    if (e.status() == RestStatus.CONFLICT) {
        
    }
}
  • 引起的異常表示返回了版本衝突錯誤。

上一篇:Elasticsearch Java High Level REST Client(入門)

下一篇:Get API

相關文章
相關標籤/搜索