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