首先我不贊成再采用一些中間件(jar包)來解決和 Elasticsearch 之間的交互,比如 Spring-data-elasticsearch.jar
系列一樣,用就得依賴它。而 Elasticsearch 本身的用法就是很簡潔的,也很容易,只要稍微加一下封裝,即可解決。下面上我的簡單封裝的批量處理。
package com.sojson.core.elasticsearch.manager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequestBuilder;
import com.sojson.common.utils.StringUtils;
import com.sojson.core.elasticsearch.utils.ESTools;
public class InsertManager {
/**
* 添加數據到Elasticsearch
* @param index 索引
* @param type 類型
* @param idName Id字段名稱
* @param json 存儲的JSON,可以接受Map
* @return
*/
public static Map save(String index, String type, String idName,JSONObject json) {
List list = new ArrayList();
list.add(json);
return save(index, type, idName, list);
}
/**
* 添加數據到Elasticsearch
* @param index 索引
* @param type 類型
* @param idName Id字段名稱
* @param listData 一個對象集合
* @return
*/
@SuppressWarnings("unchecked")
public static Map save(String index, String type, String idName,List listData) {
BulkRequestBuilder bulkRequest = ESTools.client.prepareBulk().setRefresh(true);
Map resultMap = new HashMap();
for (Object object : listData) {
JSONObject json = JSONObject.fromObject(object);
//沒有指定idName 那就讓Elasticsearch自動生成
if(StringUtils.isBlank(idName)){
IndexRequestBuilder lrb = ESTools.client.prepareIndex(index, type).setSource(json);
bulkRequest.add(lrb);
}
else{
String idValue = json.optString(idName);
IndexRequestBuilder lrb = ESTools.client.prepareIndex(index, type,idValue).setSource(json);
bulkRequest.add(lrb);
}
}
BulkResponse bulkResponse = bulkRequest.execute().actionGet();
if (bulkResponse.hasFailures()) {
// process failures by iterating through each bulk response item
System.out.println(bulkResponse.getItems().toString());
resultMap.put("500", "保存ES失敗!");
return resultMap;
}
bulkRequest = ESTools.client.prepareBulk();
resultMap.put("200", "保存ES成功!");
return resultMap;
}
}