Elasticsearch 升級之后,發(fā)現(xiàn)有很多以前用的API過期了。如elasticRepository中的search方法,ElasticsearchTemplate 等,因此記錄一下使用高版本API 操作,并組裝了一個簡單的工具類供后續(xù)使用。
首先是配置文件
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")
// 如果是集群,可以構建多個
/*,new HttpHost("localhost", 9201, "http")*/
)
);
return restHighLevelClient;
}
1、CRUD
我定義了一個CRUD的接口
public interface HignLevelDocumentHandler<T, ID> {
public void save(T t) throws Exception;
public String detail(ID id) throws IOException;
public void update(T t) throws Exception;
public void delete(ID id) throws IOException;
}
其次,實現(xiàn)一個默認的可操作的工具類,在使用前需要將工具類注入Bean,并復制索引名稱indexName
/**
* author: ZGF
* context : 默認實現(xiàn)
*/
public class DefaultHignLevelDocumentHandler<T, ID> implements HignLevelDocumentHandler<T, ID> {
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client;
@Getter
@Setter
private String indexName;
public DefaultHignLevelDocumentHandler(String indexName){
this.indexName = indexName;
}
@Override
public void save(T t) throws Exception {
if (judgeId(t)) {
Field id = t.getClass().getDeclaredField("id");
save(t, id.toString());
return;
}
save(t, null);
}
public void save(T t, String id) throws IOException {
jsonSave(t, id, TimeValue.timeValueSeconds(1));
}
public void jsonSave(T t, String id, TimeValue timeValue) throws IOException {
IndexRequest indexRequest = new IndexRequest(indexName);
indexRequest.id(id);
indexRequest.timeout(timeValue);
indexRequest.source(JSON.toJSONString(t), XContentType.JSON);
client.index(indexRequest, RequestOptions.DEFAULT);
}
@Override
public String detail(ID id) throws IOException {
GetRequest request = new GetRequest(indexName, id.toString());
GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
return getResponse.getSourceAsString();
}
@Override
public void update(T t) throws Exception {
if (judgeId(t)) {
Field id = t.getClass().getDeclaredField("id");
save(t, id.toString());
} else {
update(t, null);
}
}
public void update(T t, String id) throws Exception {
update(t, id, TimeValue.timeValueSeconds(1));
}
public void update(T t, String id, TimeValue timeValue) throws Exception {
UpdateRequest updateRequest = new UpdateRequest(indexName, id);
updateRequest.timeout(timeValue);
updateRequest.doc(JSON.toJSONString(t), XContentType.JSON);
client.update(updateRequest, RequestOptions.DEFAULT);
}
@Override
public void delete(ID id) throws IOException {
delete(id, TimeValue.timeValueSeconds(1));
}
public void delete(ID id, String timeout) throws IOException {
DeleteRequest deleteRequest = new DeleteRequest(indexName);
deleteRequest.timeout(timeout);
deleteRequest.id(id.toString());
client.delete(deleteRequest, RequestOptions.DEFAULT);
}
public void delete(ID id, TimeValue timeValue) throws IOException {
DeleteRequest deleteRequest = new DeleteRequest(indexName);
deleteRequest.timeout(timeValue);
deleteRequest.id(id.toString());
client.delete(deleteRequest, RequestOptions.DEFAULT);
}
private boolean judgeId(T t){
//獲取這個類的所有屬性
Field[] fields = t.getClass().getDeclaredFields();
boolean flag = false;
//循環(huán)遍歷所有的fields
for (int i = 0; i < fields.length; i++) {
if (fields[i].getName().equals("id")) {
flag = true;
break;
}
}
return flag;
}
}
2、批量操作
注意將增刪改的Request接口通過add方法進BulkRequest對象,就可以進行批量操作了
@PostMapping("bulk")
public String bulk() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout(TimeValue.timeValueSeconds(10));
ArrayList<Item> items = new ArrayList<>();
items.add(new Item(6L, "狂神說Java", "B站", "愛奇藝", 23D, "b.jpg"));
items.add(new Item(7L, "馬保國解說日本萌妹子擂臺賽", "Bilibili", "騰訊", 44D, "e.jpg"));
items.add(new Item(8L, "進擊的巨人", "Bilibili", "騰訊", 55D, "g.jpg"));
for (int i = 0; i < items.size(); i++) {
bulkRequest.add(new IndexRequest("naga")
// 不指定ID的話,新增時ID是隨機的
.id(items.get(i).getId().toString())
.source(JSON.toJSONString(items.get(i)), XContentType.JSON)
);
// bulkRequest.add(UpdateRequest) 批量更新
// bulkRequest.add(DeleteRequest) 批量刪除
}
// BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
return "bulk insert OK";
}
3、復雜查詢操作
僅僅列舉兩個最簡單的例子,在新版本的API中,查詢的組裝就像是用代碼,來拼接出在kibana上輸入的JSON參數(shù)一樣。
/**
* 分頁,條件查詢
* @param brandName
* @return
*/
@PostMapping("/get")
public String get(String brandName, int from, int size) throws IOException {
// 條件構造器
SearchSourceBuilder builder = new SearchSourceBuilder();
// 查詢構建器 QueryBuilders工具類可以快速構建
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("brand", brandName);
builder.query(matchQueryBuilder);
builder.timeout(TimeValue.timeValueSeconds(10));
/** 分頁查詢 */
builder.from(from);
builder.size(size);
SearchRequest searchRequest = new SearchRequest("naga");
searchRequest.source(builder);
SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
for (SearchHit temp : result.getHits().getHits()) {
System.out.println(temp.getSourceAsMap());
}
return "query OK";
}
/**
* 查詢價格在20以上的
*/
@PostMapping("/range")
public String query() throws IOException {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
.filter(new RangeQueryBuilder("price").gte(20.0D));
sourceBuilder.query(queryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.source(sourceBuilder);
SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
for (SearchHit temp : result.getHits().getHits()) {
System.out.println(temp.getSourceAsMap());
}
return "query OK";
}