一、文档新增(Index)
新增文档分为三个主要步骤:
- 准备
request
对象; - 准备请求体(参数),如果需要;
- 发送请求。
新增文档的 Java 客户端代码与请求步骤是完全一致的。具体步骤如下:
- 请求对象:
IndexRequest
- 方法调用:
index
方法 - 请求体:文档内容(通常为 JSON 格式)
@Test
void testIndexDoc() throws IOException {
// 0.准备文档数据
// 0.1 根据id查询数据库数据
Item item = iItemService.getById(317578L);
// 0.2把数据库数据转为文档数据
ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class)
// 1.准备Request,指定索引库名称和文档ID
IndexRequest request = new IndexRequest("items").id(itemDoc.getId());
// 2.准备请求参数
request.source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON);
// 3.发送请求
client.index(request, RequestOptions.DEFAULT);
}
新增文档时,不仅可以进行新增,还可以进行覆盖操作(如果文档 ID 已经存在)。
二、文档查询(Get)
查询文档时,Java 客户端代码与删除操作非常相似,但需要做一些额外的处理来解析结果。
步骤:
- 准备
request
对象:GetRequest
- 调用
get
方法:获取查询结果 - 处理响应结果:从响应结果中提取
source
字段
查询文档的 Java 客户端代码如下:
- 请求对象:
GetRequest
- 方法调用:
get
方法 - 结果解析:获取
source
字段的值
@Test
void testGetDoc() throws IOException {
// 1.准备Request
GetRequest request = new GetRequest("items", "317578"); // 索引库名称和文档ID
// 2.发送请求
GetResponse response = client.get(request, RequestOptions.DEFAULT);
// 3.解析响应结果,提取 source 字段
String json = response.getSourceAsString(); // 获取源数据
ItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);
System.out.println("doc = " + doc);
}
响应结果: 查询返回的结果是一个 JSON 文档,其中包含 source
字段,source
即原始存储的文档内容。
三、文档删除(Delete)
删除文档的 API 设计与查询非常类似。区别仅在于请求方法变为 delete
。
步骤:
- 准备
request
对象:DeleteRequest
- 调用
delete
方法:删除文档
删除文档的 Java 客户端代码如下:
- 请求对象:
DeleteRequest
- 方法调用:
delete
方法
@Test
void testDeleteDoc() throws IOException {
// 1.准备Request
DeleteRequest request = new DeleteRequest("items", "317578"); // 索引库名称和文档ID
// 2.发送请求
client.delete(request, RequestOptions.DEFAULT);
}
删除成功后,通常不会返回文档内容,但可以通过查询操作来确认删除操作是否成功,可以看到,查询操作返回 404 状态码,说明删除成功。
四、文档修改
文档修改分为全量更新和局部更新。
4.1 全量更新(Index 更新)
全量更新是指提供一个完整的文档替换原有文档。操作与新增文档相似,但如果文档 ID 已存在,ES 会先删除旧文档,再插入新文档。
步骤:
- 准备
request
对象:IndexRequest
(与新增相同) - 方法调用:
index
方法 - 请求体:新文档的内容
@Test
void testIndexDoc() throws IOException {
// 0.准备文档数据
// 0.1 根据id查询数据库数据
Item item = iItemService.getById(317578L);
// 0.2把数据库数据转为文档数据
ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class);
// 文档存在时,修改文档中价格字段(若文档不存在,则是新增操作)
itemDoc.setPrice(99999);
// 1.准备Request
IndexRequest request = new IndexRequest("items").id(itemDoc.getId());
// 2.准备请求参数
request.source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON);
// 3.发送请求
client.index(request, RequestOptions.DEFAULT);
}
如果文档 ID 已存在,执行时会覆盖原文档。
4.2 局部更新(Update)
局部更新指只修改文档中的部分字段,不会覆盖整个文档。在 Java 客户端中,局部更新需要使用 UpdateRequest
。
步骤:
- 准备
request
对象:UpdateRequest
- 请求体:指定要更新的字段
- 调用
update
方法:执行更新操作
局部更新的 Java 客户端代码如下:
- 请求对象:
UpdateRequest
- 方法调用:
update
方法
@Test
void testUpdateDoc() throws IOException {
// 1.准备Request
UpdateRequest request = new UpdateRequest("items", "317578");
// 2.准备请求参数
request.doc(
"price", 88888
);
// 3.发送请求
client.update(request, RequestOptions.DEFAULT);
}
局部更新不需要提供完整的文档,只需提供要更新的字段。
五、API 使用总结与规律
- 初始化请求对象:
- 新增文档:
IndexRequest
- 查询文档:
GetRequest
- 删除文档:
DeleteRequest
- 修改文档(全量更新):
IndexRequest
- 局部更新:
UpdateRequest
- 新增文档:
- 请求方法:
- 新增文档:
index()
方法 - 查询文档:
get()
方法 - 删除文档:
delete()
方法 - 修改文档:
index()
方法(全量更新),update()
方法(局部更新)
- 新增文档:
- 请求体:
- 新增和全量更新需要提供完整的文档内容。
- 局部更新只需要提供更新的字段。
- 响应处理:
- 查询文档时,需要提取响应中的
source
字段。 - 删除文档时,通常没有返回文档内容,只有操作成功与否的状态。
- 修改文档时,根据操作结果判断是新增还是更新。
- 查询文档时,需要提取响应中的
六、示例代码
以下是一个完整的示例,展示了查询、删除、修改文档的代码实现:
@SpringBootTest(properties = "spring.profiles.active=local")
public class ElasticTest {
private RestHighLevelClient client;
@Autowired
private IItemService iItemService;
// 新增/全量修改
@Test
void testIndexDoc() throws IOException {
// 0.准备文档数据
// 0.1 根据id查询数据库数据
Item item = iItemService.getById(317578L);
// 0.2把数据库数据转为文档数据
ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class);
// 文档存在时,修改文档中价格字段
itemDoc.setPrice(99999);
// 1.准备Request
IndexRequest request = new IndexRequest("items").id(itemDoc.getId());
// 2.准备请求参数
request.source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON);
// 3.发送请求
client.index(request, RequestOptions.DEFAULT);
}
// 查询
@Test
void testGetDoc() throws IOException {
// 1.准备Request
GetRequest request = new GetRequest("items", "317578");
// 2.发送请求
GetResponse response = client.get(request, RequestOptions.DEFAULT);
// 3.解析响应结果
String json = response.getSourceAsString();
ItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);
System.out.println("doc = " + doc);
}
// 删除
@Test
void testDeleteDoc() throws IOException {
// 1.准备Request
DeleteRequest request = new DeleteRequest("items", "317578");
// 2.发送请求
client.delete(request, RequestOptions.DEFAULT);
}
// 局部修改/增量修改
@Test
void testUpdateDoc() throws IOException {
// 1.准备Request
UpdateRequest request = new UpdateRequest("items", "317578");
// 2.准备请求参数
request.doc(
"price", 88888
);
// 3.发送请求
client.update(request, RequestOptions.DEFAULT);
}
@BeforeEach
void setUp() {
client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.100.212:9200")
));
}
@AfterEach
void tearDown() throws IOException {
if (client != null) {
client.close();
}
}
}