本節描述以下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