继续上一篇,上一篇创建好索引后,就开始操作文档了。
插入或者更新文档
文档,就相当于关系型数据库里的表的行记录。
创建好索引后,就可以开始,将文档索引进索引里。
show code:
/**
* @param idxName index
* @param entity 对象
* @return void
*/
public void insertOrUpdateOne(String idxName, ElasticEntity entity) {
IndexRequest request = new IndexRequest(idxName);
log.info("Data : id={},entity={}", entity.getId(), JSON.toJSONString(entity.getData()));
request.id(entity.getId());
request.source(JSON.toJSONString(entity.getData()), XContentType.JSON);
try {
restHighLevelClient.index(request, RequestOptions.DEFAULT);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
删除文档
类似的,有插入文档,就有对应的删除文档数据。
/**
* @param idxName index
* @param entity 对象
* @return void
*/
public boolean deleteOne(String idxName, ElasticEntity entity) {
DeleteRequest request = new DeleteRequest(idxName);
request.id(entity.getId());
try {
restHighLevelClient.delete(request, RequestOptions.DEFAULT);
} catch (Exception e) {
log.error("删除索引异常,metadataVo={},异常信息={}", entity.toString(), e.getMessage());
throw new RuntimeException(e);
}
return true;
}
批量插入
类似关系型数据库,有批量插入记录。
对应的也可以往 elasticsearch 里 批量插入文档。
注:es 的批量插入一次性最好不要超过 1000 条数据。
/**
* 批量插入数据
*
* @param idxName index
* @param list 带插入列表
* @return void
*/
public void insertBatch(String idxName, List<ElasticEntity> list) {
BulkRequest request = new BulkRequest();
list.forEach(item -> request.add(new IndexRequest(idxName).id(item.getId())
.source(JSON.toJSONString(item.getData()), XContentType.JSON)));
try {
restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
批量删除
同样的,可以根据文档 id,批量删除数据。
这里的前提是,在插入文档时,文档的 id 是由我们指定的,这样才可以知道文档的id。
/**
* 批量删除
*
* @param idxName index
* @param idList 待删除列表
* @return void
*/
public <T> void deleteBatch(String idxName, Collection<T> idList) {
BulkRequest request = new BulkRequest();
idList.forEach(item -> request.add(new DeleteRequest(idxName, item.toString())));
try {
restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
数据存储对象
/**
* @ClassName ElasticEntity
* @Description 数据存储对象
* @author
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ElasticEntity<T> {
/**
* 主键标识,用户ES持久化
*/
private String id;
/**
* JSON对象,实际存储数据
*/
private Map data;
}