package cn.hong.elastic.util;
import cn.hong.elastic.model.BulkVo;
import net.sf.json.JSON;
import net.sf.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.entity.ContentType;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.ResponseException;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import java.io.IOException;
import java.util.*;
/**
*
* elasticsearch rest 工具类
*
* @author hong
*/
public class RestUtil {
// RestClient对象,用于es链接
private static volatile RestClient client;
public static final String PUT = "PUT";
public static final String POST = "POST";
public static final String GET = "GET";
public static final String HEAD = "HEAD";
public static final String DELETE = "DELETE";
public static final String HANDLE_INDEX = "index";
public static final String HANDLE_UPDATE = "update";
public static final String HANDLE_DELETE = "delete";
public static final String HANDLE_CREATE = "create";
/**
* 获取Rest Client 对象
*/
public static RestClient getClient() {
if(null != client) {
return client;
}
try {
// credentialsProvider为用户密码验证, 如阿里云的elasticsearch 需要用户密码验证,
// 若不需要则注释掉credentialsProvider对象及setHttpClientConfigCallback
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "elasic"));
// HttpHost可多个,直接逗号隔开即可
client = RestClient.builder(new HttpHost("localhost", 9200))
.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
// 设置建立连接超时时间 客户端从服务器读取数据的timeout
requestConfigBuilder.setConnectTimeout(5000);
requestConfigBuilder.setSocketTimeout(40000);
requestConfigBuilder.setConnectionRequestTimeout(3000);
return requestConfigBuilder;
}
})
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
})
.setMaxRetryTimeoutMillis(60000)
.build();
} catch (Exception e) {
e.printStackTrace();
}
return client;
}
/**
* 创建查询字符串
* @param fields 要显示的字段名数组 null为显示全部
* @param query 查询规则
* @param pageNo 页码
* @param pageSize 每页数量
* @param sort 排序规则
* @return
*/
public static String createQuery(List<String> fields, Object query, Integer pageNo, Integer pageSize, Object sort) {
Map<String, Object> map = new HashMap<>();
if(null != fields && !fields.isEmpty()) {
map.put("_source", fields);
}
if(null != query) {
map.put("query", JSONObject.fromObject(query));
}
if(null != pageNo && null != pageSize) {
map.put("from", (pageNo - 1) * pageSize);
map.put("size", pageSize);
}
if(null != sort) {
map.put("sort", JSONObject.fromObject(sort));
}
return JSONObject.fromObject(map).toString();
}
/**
* 根据sql直接搜索 仅限于 select查询
* 若要使用sql直接select查询,需安装sql插件 https://github.com/NLPchina/elasticsearch-sql
* 另 http://essql.nlpcn.org/ 该网址可将select sql语句转化为 elastic 写法的查询
*/
public static String searchSql(String sql) {
try {
Response response = getClient().performRequest(POST, "/_sql", Collections.singletonMap("sql", sql));
return EntityUtils.toString(response.getEntity());
} catch (ResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 单索引查询
*/
public static String search(String index, String type, String query) {
List<String> indexs = new ArrayList<>();
indexs.add(index);
List<String> types = new ArrayList<>();
types.add(type);
return search(indexs, types, query);
}
/**
* 查询 可多索引 多类型 查询
* @param indexs
* @param types
* @param query 查询条件json字符串
* @return
*/
public static String search(List<String> indexs, List<String> types, String query) {
try {
String index = StringUtils.join(indexs, ",");
String type = "/";
if(null != types && !types.isEmpty()) {
type += StringUtils.join(types, ",") + "/";
}
System.out.println("/" + index + type + "_search");
System.out.println(query);
HttpEntity entity = new NStringEntity(query, ContentType.APPLICATION_JSON);
Response response = getClient().performRequest(POST, "/" + index + type + "_search", Collections.singletonMap("pretty", "true"), entity);
return EntityUtils.toString(response.getEntity());
} catch (ResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 批量操作 最后一行也要带\n
* create 当文档不存在时自动创建
* index 创建新文档或更新已有文档
* update 局部更新文档
* delete 删除一个文档
*
* POST /_bulk
* { "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
* { "create": { "_index": "website", "_type": "blog", "_id": "123" }}
* { "title": "My first blog post" }
* { "index": { "_index": "website", "_type": "blog" }}
* { "title": "My second blog post" }
* { "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
* { "doc" : {"title" : "My updated blog post"} }
*
*/
public static String sendBulk(List<BulkVo> list) {
try {
List<String> bodys = new ArrayList<>();
for (BulkVo bean : list) {
bodys.add("{ \"" + bean.getHandle() + "\": {\"_index\": \"" + bean.getIndexName() + "\", \"_type\": \"" + bean.getType() + "\", \"_id\": \"" + bean.getId() + "\"} }");
if(HANDLE_CREATE.equals(bean.getHandle()) || HANDLE_INDEX.equals(bean.getHandle())) {
bodys.add
没有合适的资源?快使用搜索试试~ 我知道了~
elasticsearch rest客户端连接工具类
共4个文件
java:3个
xml:1个
4星 · 超过85%的资源 需积分: 43 36 下载量 50 浏览量
2018-07-18
15:19:45
上传
评论
收藏 9KB ZIP 举报
温馨提示
maven项目编写的一个elasticsearch rest方式进行增删改查的api工具类含测试代码,rest方式仅需10多个jar即可实现,比elasticsearch client可以少引用数十个jar,有兴趣的可以看看
资源推荐
资源详情
资源评论
收起资源包目录
esapi.zip (4个子文件)
pom.xml 1KB
src
test
java
cn
hong
ElasticTest.java 8KB
main
resource
java
cn
hong
elastic
model
BulkVo.java 1KB
util
RestUtil.java 14KB
共 4 条
- 1
资源评论
- qazxliyang2020-08-21没有解决我的问题, 可以参考一下
莫流离
- 粉丝: 1
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Pytorch复现Point-Transformer,用于ShapeNet数据集点云分割
- 【医学影像分析】2D超声图像的分割检测(Ultrasound Nerve Segmentation - Kaggle数据集)
- 嘎嘎香的五款神仙谷歌插件
- .arch书源导入教程.mp4
- 贪心算法介绍及代码示例讲解
- CR13SP35MSI64 Crystal 水晶报表运行组件最后版本64位
- 图像分类数据集:玉米叶是否感染分类数据集(2分类,包含训练集、验证集)
- 小U商城.zip
- 高光谱图像计算机视觉分类图像预处理工具集,包含去除图片无关背景,数据增强,生成标签文件等功能
- (顶刊复现)基于配电网韧性提升的应急移动电源预配置和动态调度(下)-MPS动态调度
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功