文档操作
有了索引库,接下来就可以向索引库中添加数据了。
Elasticsearch中的数据其实就是JSON风格的文档。操作文档自然保护增
、删
、改
、查
等几种常见操作,我们分别来学习。
1.新增语法
POST /索引库名/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
"字段3": {
"子属性1": "值3",
"子属性2": "值4"
},
}
java中新增文档
/**
* 新增文档
*
* @throws IOException
*/
@Test
void testConnect() throws IOException {
// 从服务中获取Item对象
Item item = iItemService.getById("317578");
item.setName("靠你娘");
// 创建索引请求,指定索引名称和文档ID
IndexRequest request = new IndexRequest("items").id(item.getId().toString());
// 创建ItemDTO2对象,并拷贝Item对象的属性
ItemDTO2 itemDTO2 = new ItemDTO2();
BeanUtils.copyProperties(item, itemDTO2); // 直接拷贝属性到 itemDTO2
// 将 itemDTO2 转换为 JSON 字符串
// String jsonString = JSONObject.toJSONString(itemDTO2);
String jsonString = JSONObject.toJSONString(itemDTO2);
// 设置请求的JSON内容
request.source(jsonString, XContentType.JSON);
// 执行索引请求,添加文档到索引中
IndexResponse index = client.index(request, RequestOptions.DEFAULT);
// 你可以根据需要打印或验证索引响应结果
System.out.println("Index Response: " + index.getId());
}
2.查询文档
根据rest风格,新增是post,查询应该是get,不过查询一般都需要条件,这里我们把文档id带上。
GET /{索引库名称}/_doc/{id}
/**
* 查询文档
*
* @throws IOException
*/
@Test
public void get() throws IOException {
GetRequest getRequest = new GetRequest("items", "317578");
GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);
String sourceAsString = response.getSourceAsString();
log.info("{}", sourceAsString);
}
3.删除文档
DELETE /{索引库名}/_doc/id值
4.修改文档
修改有两种方式:
-
全量修改:直接覆盖原来的文档
-
局部修改:修改文档中的部分字段
1.全量修改
全量修改是覆盖原来的文档,其本质是两步操作:
-
根据指定的id删除文档
-
新增一个相同id的文档
注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。
PUT /{索引库名}/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
// ... 略
}
2.局部修改
局部修改是只修改指定id匹配的文档中的部分字段。
POST /{索引库名}/_update/文档id
{
"doc": {
"字段名": "新的值",
}
}
java中代码
/**
* 局部修改
*
* @throws IOException
*/
@Test
public void update() throws IOException {
UpdateRequest request = new UpdateRequest("items", "317578");
request.doc("name", "密码箱", "price", 38900);
client.update(request, RequestOptions.DEFAULT);
}
4.批量导入
java中批量导入代码
/**
* 批量导入
*/
@Test
public void addList() throws IOException {
int pageNo = 1;
int pageSize = 1000;
while (true) {
Page<Item> page = iItemService.lambdaQuery()
.eq(Item::getStatus, 1).page(new Page<>(pageNo, pageSize));
List<Item> items = page.getRecords();
if (CollUtils.isEmpty(
items)) {
log.info("没有更多记录可处理,退出");
break; // 更清晰的退出条件
}
log.info("第{}次处理,当前页记录数: {}", pageNo, items.size());
BulkRequest request = new BulkRequest("items");
// 批量操作
for (Item item : items) {
ItemDTO2 itemDTO2 = new ItemDTO2();
BeanUtils.copyProperties(item, itemDTO2);
request.add(
new IndexRequest().id(item.getId().toString())
.source(JSONObject.toJSONString(itemDTO2), XContentType.JSON)
);
}
// 执行批量操作并处理结果
BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
if (bulkResponse.hasFailures()) {
log.error("批量索引时发生错误: {}", bulkResponse.buildFailureMessage());
} else {
log.info("第{}次批量索引成功,共处理记录数: {}", pageNo, items.size());
}
// 下一页
pageNo++;
}
}
标签:items,request,索引,DSL,文档,itemDTO2,id,ES
From: https://www.cnblogs.com/freps/p/18473288