天天看點

Document APIs

本節描述以下CRUD api:

單文檔api

生成JSON文檔

生成JSON文檔有幾種不同的方法:

  • 手動(也就是自己使用)使用本機byte[]或作為字元串。
String json = "{" +
        "\"user\":\"kimchy\"," +
        "\"postDate\":\"2013-01-30\"," +
        "\"message\":\"trying out Elasticsearch\"" +
    "}";
           
  • 使用一個映射,該映射将自動轉換為它的JSON等效項
//Map是一個鍵:值對集合。它表示一個JSON結構
Map<String, Object> json = new HashMap<String, Object>();
json.put("user","kimchy");
json.put("postDate",new Date());
json.put("message","trying out Elasticsearch");
           
  • 使用第三方庫對bean(如Jackson)進行序列化

    可以使用Jackson将bean序列化為JSON。請将Jackson Databind添加到您的項目中。然後您可以使用ObjectMapper來序列化您的bean

import com.fasterxml.jackson.databind.*;

// 執行個體一個json映射器
ObjectMapper mapper = new ObjectMapper(); // 建立一次,重用

// 生成json
byte[] json = mapper.writeValueAsBytes(yourbeaninstance);
String jsonStr = new String(json);
           
  • 使用内置的助手XContentFactory.jsonBuilder()
//Elasticsearch提供内置的幫助程式來生成JSON内容。
import static org.elasticsearch.common.xcontent.XContentFactory.*;

XContentBuilder builder = jsonBuilder()
    .startObject()
        .field("user", "kimchy")
        .field("postDate", new Date())
        .field("message", "trying out Elasticsearch")
    .endObject()
    /**注意,您還可以使用startArray(String)和endArray()方法添加數組。順便說一下,field方法接受許多對象類型。您可以直接傳遞數字、日期甚至其他XContentBuilder對象。
如果需要檢視生成的JSON内容,可以使用string . tostring()方法。*/
import org.elasticsearch.common.Strings;

String json = Strings.toString(builder);
           

在内部,每個類型轉換為byte[],是以一個字元串被轉換為一個byte[]。是以,如果對象已經以這種形式存在,那麼就使用它。jsonBuilder是高度優化的JSON生成器,它直接構造一個byte[]。

1. Index API

Index API 允許将類型化的JSON文檔索引到特定的索引中,并使其可搜尋。

示例:将JSON文檔索引到一個名為twitter的索引,其類型為tweet, id值為1

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

IndexResponse response = client.prepareIndex("twitter", "tweet", "1")
        .setSource(jsonBuilder()
                    .startObject()
                        .field("user", "kimchy")
                        .field("postDate", new Date())
                        .field("message", "trying out Elasticsearch")
                    .endObject()
                  )
        .get();
           

注意,您還可以将文檔索引為JSON字元串,并且不需要提供ID

String json = "{" +
        "\"user\":\"kimchy\"," +
        "\"postDate\":\"--\"," +
        "\"message\":\"trying out Elasticsearch\"" +
    "}";

IndexResponse response = client.prepareIndex("twitter", "tweet")
        .setSource(json, XContentType.JSON)
        .get();
           

IndexResponse對象會給你一個報告

// Index name
String _index = response.getIndex();
// Type name
String _type = response.getType();
// Document ID (generated or not)
String _id = response.getId();
// 版本(如果這是您第一次索引此文檔,您将得到:1)
long _version = response.getVersion();
// status has stored current instance statement.
RestStatus status = response.status();
           

有關索引操作的更多資訊,請檢視REST index文檔。

2. Get API

get API允許根據其id從索引中擷取類型JSON文檔。示例:從名為twitter的索引中擷取一個JSON文檔,該索引的類型為tweet, id值為1

有關get操作的更多資訊,請檢視其他的get文檔。

3. Delete API

delete API允許基于id從特定索引中删除類型化的JSON文檔。

示例:從名為twitter的索引中删除JSON文檔,該索引的類型名為tweet, id值為1

有關删除操作的更多資訊,請參閱Delete API文檔。

通過查詢API的删除,可以根據查詢的結果删除給定的文檔集

BulkByScrollResponse response = DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
    .filter(QueryBuilders.matchQuery("gender", "male")) //query
    .source("persons")                                  //index
    .get();                                             //執行操作
long deleted = response.getDeleted();                   //删除數量
           

由于它可能是一個長時間運作的操作,如果您希望異步執行,您可以調用execute而不是get并提供類似的偵聽器

DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
    .filter(QueryBuilders.matchQuery("gender", "male"))    //query 
    .source("persons")                                     //index 
    .execute(new ActionListener<BulkByScrollResponse>() {  //Listener 
        @Override
        public void onResponse(BulkByScrollResponse response) {
            long deleted = response.getDeleted();          //删除數量 
        }
        @Override
        public void onFailure(Exception e) {
            // Handle the exception
        }
    });
           

4. Update API

您可以建立UpdateRequest并将其發送給用戶端

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();
           

new Script()你的腳本。它也可以是本地存儲的腳本名。在這種情況下,您需要使用ScriptService.ScriptType.FILE,注意,您不能同時提供腳本和doc。

Update API允許基于提供的腳本更新文檔

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

update API還支援傳遞一個部分文檔,該文檔将被合并到現有文檔中(簡單的遞歸合并、對象的内部合并、替換核心的“鍵/值”和數組)。例如

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

也有對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();
           

如果文檔索引/類型/1已經存在,那麼在此操作之後,我們将獲得類似的文檔

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

如果它不存在,我們将有一個新的文檔

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

多文檔api

1. Multi Get API

2. Bulk API

3. Reindex API

4. Update By Query API

5. Delete By Query API

繼續閱讀