本节描述以下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\":\"2013-01-30\"," +
"\"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
GetResponse response = client.prepareGet("twitter", "tweet", "1").get();
有关get操作的更多信息,请查看其他的get文档。
3. Delete API
delete API允许基于id从特定索引中删除类型化的JSON文档。
示例:从名为twitter的索引中删除JSON文档,该索引的类型名为tweet, id值为1
DeleteResponse response = client.prepareDelete("twitter", "tweet", "1").get();
有关删除操作的更多信息,请参阅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