没什么多说的,直接上代码
package cn.pkulaw.fblx.util.es;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import io.searchbox.client.JestClient;
import io.searchbox.client.JestResult;
import io.searchbox.core.*;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @Author: WXM
* @Description: jestclient的es基础操作
* @Date: create in 2020/12/9 9:55
*/
@Repository
public class EsBaseOperate {
@Autowired
JestClient jestClient;
//根据指定列colum 的值定位获取id,好多时候用到es的_id,用这个方法可以直接获取
public String getEsId(String indexName, String type,String colum ,String value){
String id = null;
SearchSourceBuilder ssb = new SearchSourceBuilder();
TermQueryBuilder tq = QueryBuilders.termQuery(colum, value);
ssb.query(tq);
Search search = new Search.Builder(ssb.toString()).addIndex(indexName).addType(type).build();
try {
SearchResult res = jestClient.execute(search);
if(res.isSucceeded()){
JsonArray asJsonArray = res.getJsonObject().get("hits").getAsJsonObject().get("hits").getAsJsonArray();
//只有查询出结果,并且只有一个结果对应才正常,否则报错
if(1==asJsonArray.size()){
id = asJsonArray.get(0).getAsJsonObject().get("_id").getAsString();
}
}
} catch (IOException e) {
e.printStackTrace();
}
if(null != id){
return id;
}else {
throw new RuntimeException("EsBaseOperate-getEsidByGid:从es中根据gid查询id错误");
}
}
//插入新数据,可以把需要的bean存入dataList 传进来
public void addToEs(String indexName, String type, List<Object> dataList ){
Bulk.Builder builder = new Bulk.Builder()
.defaultIndex(indexName)
.defaultType(type);
for (Object data :dataList){
builder.addAction(new Index.Builder(data).build());
}
Bulk bulk = builder.build();
try {
BulkResult execute = jestClient.execute(bulk);
System.out.println(execute);
} catch (IOException e) {
e.printStackTrace();
}
}
//根据id更新一条数据
public void updateToEsById(String indexName, String type, String id, Map<String,Object> params){
if(null!=params && 0!=params.size()){
StringBuffer param = new StringBuffer();
//string类型需要加引号,时间和数字等其他类型不需要
params.forEach((key,value)->{
if(value instanceof String){
//这里replace可以给string中的""特殊字符加上反斜杠,防止特殊字符报错
param.append("\""+key+"\":\""+((String)value).replaceAll("\\\"", "\\\\\"")+"\",");
}else {
param.append("\""+key+"\" : "+value+",");
}
});
param.deleteCharAt(param.lastIndexOf(","));
String script = "{\"doc\" : {" +param +"}}";
try {
DocumentResult res = jestClient.execute(new Update.Builder(script).index(indexName).type(type).id(id).build());
System.out.println("更新结果"+res);
} catch (IOException e) {
e.printStackTrace();
}
}else {
throw new RuntimeException("EsBaseOperate-updateToEsById:更新数据的参数为空");
}
}
//根据id查询es对应条
public JsonObject selectByEsid(String indexName, String type, String id){
JsonObject source = null;
Get get = new Get.Builder(indexName, id).type(type).build();
try {
JestResult res = jestClient.execute(get);
if(res.getJsonObject().has("_source")){
source = res.getJsonObject().get("_source").getAsJsonObject();
}
} catch (IOException e) {
e.printStackTrace();
}
return source;
}
//es支持的时间格式,根据自己的es服务器进行格式化配置
public String getTimeForEs(Date date){
if(null != date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String format = sdf.format(new Date());
return format;
}else {
throw new RuntimeException("EsBaseOperate-getTimeForEs:转换为es支持的时间时错误");
}
}
}