ES數據庫 經常使用 java api

1、獲取類api

get API容許根據其id從索引中獲取類型化的JSON文檔。json

如下示例從名爲twitter的索引中獲取一個JSON文檔,該索引名爲tweet,id值爲1:api

GetResponse response = client.prepareGet(「twitter」,「tweet」,「1」)。get();

一、get API容許設置線程模型,當在同一節點上執行API的實際執行時將執行操做(API在同一服務器上分配的分片上執行)。數組

二、選項是在不一樣的線程上執行操做,或者在調用線程上執行它(注意API仍然是異步的)。默認狀況下,operationThreaded設置爲true表示在不一樣的線程上執行操做。如下示例將其設置爲 false服務器

GetResponse response = client.prepareGet("twitter", "tweet", "1")
        .setOperationThreaded(false)
        .get();

2、刪除類api

delete API容許用戶根據其id從特定索引中刪除類型化的JSON文檔。如下示例從名爲twitter的索引中刪除JSON文檔,該索引名爲tweet,id爲1:異步

DeleteResponse response = client.prepareDelete(「twitter」,「tweet」,「1」)。get();

一、delete API容許設置線程模型,當在同一節點上執行API的實際執行時,將執行操做(API在同一服務器上分配的分片上執行)。elasticsearch

二、選項是在不一樣的線程上執行操做,或者在調用線程上執行它(注意API仍然是異步的)。默認狀況下,operationThreaded設置爲true表示在不一樣的線程上執行操做。如下示例將其設置爲 falseide

DeleteResponse response = client.prepareDelete("twitter", "tweet", "1")
        .setOperationThreaded(false)
        .get();

3、經過查詢api刪除

經過查詢API刪除容許人們根據查詢結果刪除給定的文檔集:post

BulkByScrollResponse response = DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
    .filter(QueryBuilders.matchQuery("gender", "male")) //詢問
    .source("persons")                           //指數       
    .get();                                             //執行
long deleted = response.getDeleted();   //刪除的數據數

由於它能夠是一個長時間運行的操做,若是你想異步地執行它,你能夠調用execute而不是get 提供一個監聽器,如:ui

DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
    .filter(QueryBuilders.matchQuery("gender", "male"))     //詢問
    .source("persons")                                      //指數
    .execute(new ActionListener<BulkByScrollResponse>() {   //監聽者
        @Override
        public void onResponse(BulkByScrollResponse response) {
            long deleted = response.getDeleted();           //已刪除的文件數量
        }
        @Override
        public void onFailure(Exception e) {
            // Handle the exception
        }
    });

4、更新api

您能夠建立UpdateRequest並將其發送到客戶端:spa

UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index("index");
updateRequest.type("type");
updateRequest.id("1");
updateRequest.doc(jsonBuilder()
        .startObject()
            .field("gender", "male")
        .endObject());
client.update(updateRequest).get();

或者您可使用prepareUpdate()方法:

client.prepareUpdate("ttl", "doc", "1")
        .setScript(new Script("ctx._source.gender = \"male\""  , ScriptService.ScriptType.INLINE, null, null))
        .get();

client.prepareUpdate("ttl", "doc", "1")
        .setDoc(jsonBuilder()               
            .startObject()
                .field("gender", "male")
            .endObject())
        .get();

請注意,您不能同時提供scriptdoc

經過腳本更新:

更新API容許基於提供的腳本更新文檔:

UpdateRequest updateRequest = new UpdateRequest("ttl", "doc", "1")
        .script(new Script("ctx._source.gender = \"male\""));
client.update(updateRequest).get();

經過合併文檔進行更新:

更新API還支持傳遞部分文檔,該部分文檔將合併到現有文檔中(簡單的遞歸合併,對象的內部合併,替換核心「鍵/值」和數組)。例如:

UpdateRequest updateRequest = new UpdateRequest("index", "type", "1")
        .doc(jsonBuilder()
            .startObject()
                .field("gender", "male")
            .endObject());
client.update(updateRequest).get();

Upsert

也有支持upsert。若是文檔不存在,則upsert 元素的內容將用於索引新文檔:

IndexRequest indexRequest = new IndexRequest("index", "type", "1")
        .source(jsonBuilder()
            .startObject()
                .field("name", "Joe Smith")
                .field("gender", "male")
            .endObject());
UpdateRequest updateRequest = new UpdateRequest("index", "type", "1")
        .doc(jsonBuilder()
            .startObject()
                .field("gender", "male")
            .endObject())
        .upsert(indexRequest);              //若是該文檔不存在,indexRequest則將添加 該文檔
client.update(updateRequest).get();

若是文檔index/type/1已經存在,咱們將在此操做後得到以下文檔:

{
    "name"  : "Joe Dalton",
    "gender": "male"        //此字段由更新請求添加
}

若是它不存在,咱們將有一個新文件:

{
    "name" : "Joe Smith",
    "gender": "male"
}

5、批量api

批量API容許在單個請求中索引和刪除多個文檔。如下是一個示例用法:

import static org.elasticsearch.common.xcontent.XContentFactory.*;

BulkRequestBuilder bulkRequest = client.prepareBulk();

// either use client#prepare, or use Requests# to directly build index/delete requests
bulkRequest.add(client.prepareIndex("twitter", "tweet", "1")
        .setSource(jsonBuilder()
                    .startObject()
                        .field("user", "kimchy")
                        .field("postDate", new Date())
                        .field("message", "trying out Elasticsearch")
                    .endObject()
                  )
        );

bulkRequest.add(client.prepareIndex("twitter", "tweet", "2")
        .setSource(jsonBuilder()
                    .startObject()
                        .field("user", "kimchy")
                        .field("postDate", new Date())
                        .field("message", "another post")
                    .endObject()
                  )
        );

BulkResponse bulkResponse = bulkRequest.get();
if (bulkResponse.hasFailures()) {
    // process failures by iterating through each bulk response item
}

可使用BulkRequestBuilder來批量存儲請求而後批量執行

BulkRequestBuilder nulk = client.prepareBulk();
bulk.add(updateRequest)  //能夠是其餘請求
BulkResponse resp = null;
resp = bulk.execute().get();  //提交請求
相關文章
相關標籤/搜索