繼續上一篇,上一篇創建好索引後,就開始操作文檔了。
插入或者更新文檔
文檔,就相當於關係型數據庫裏的表的行記錄。
創建好索引後,就可以開始,將文檔索引進索引裏。
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;
}