java接口api封装_ElasticSearch java API 封装
这是针对ES查询的一套封装。 因为时间有限仅仅能够支持一些简单查询,但能满足大部分开发需求。
同时也封装了对索引以及数据的CRUD、批量处理。
public static void main(String[] args) {
try {
ElasticSearchService service = new ElasticSearchService("es", "192.168.1.1", 9300);
ESQueryBuilderConstructor constructor = new ESQueryBuilderConstructor();
constructor.must(new ESQueryBuilders().term("gender", "f").range("age", 20, 50));
constructor.should(new ESQueryBuilders().term("gender", "f").range("age", 20, 50).fuzzy("age", 20));
constructor.mustNot(new ESQueryBuilders().term("gender", "m"));
constructor.setSize(15); //查询返回条数,最大 10000
constructor.setFrom(11); //分页查询条目起始位置, 默认0
constructor.setAsc("age"); //排序
List> list = service.search("bank", "account", constructor);
Map map = service.statSearch("bank", "account", constructor, "state");
} catch (Exception e) {
e.printStackTrace();
}
}
条件接口
import org.elasticsearch.index.query.QueryBuilder;
import java.util.List;
public interface ESCriterion {
public enum Operator {
TERM, TERMS, RANGE, FUZZY, QUERY_STRING, MISSING
}
public enum MatchMode {
START, END, ANYWHERE
}
public enum Projection {
MAX, MIN, AVG, LENGTH, SUM, COUNT
}
public List listBuilders();
}
查询条件容器
import org.apache.commons.collections.CollectionUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import java.util.ArrayList;
import java.util.List;
public class ESQueryBuilderConstructor {
private int size = Integer.MAX_VALUE;
private int from = 0;
private String asc;
private String desc;
//查询条件容器
private List mustCriterions = new ArrayList<>();
private List shouldCriterions = new ArrayList<>();
private List mustNotCriterions = new ArrayList<>();
//构造builder
public QueryBuilder listBuilders() {
int count = mustCriterions.size() + shouldCriterions.size() + mustNotCriterions.size();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
QueryBuilder queryBuilder = null;
if (count >= 1) {
//must容器
if (!CollectionUtils.isEmpty(mustCriterions)) {
for (ESCriterion criterion : mustCriterions) {
for (QueryBuilder builder : criterion.listBuilders()) {
queryBuilder = boolQueryBuilder.must(builder);
}
}
}
//should容器
if (!CollectionUtils.isEmpty(shouldCriterions)) {
for (ESCriterion criterion : shouldCriterions) {
for (QueryBuilder builder : criterion.listBuilders()) {
queryBuilder = boolQueryBuilder.should(builder);
}
}
}
//must not 容器
if (!CollectionUtils.isEmpty(mustNotCriterions)) {
for (ESCriterion criterion : mustNotCriterions) {
for (QueryBuilder builder : criterion.listBuilders()) {
queryBuilder = boolQueryBuilder.mustNot(builder);
}
}
}
return queryBuilder;
} else {
return null;
}
}
/**
* 增加简单条件表达式
*/
public ESQueryBuilderConstructor must(ESCriterion criterion){
if(criterion!=null){
mustCriterions.add(criterion);
}
return this;
}
/**
* 增加简单条件表达式
*/
public ESQueryBuilderConstructor should(ESCriterion criterion){
if(criterion!=null){
shouldCriterions.add(criterion);
}
return this;
}
/**
* 增加简单条件表达式
*/
public ESQueryBuilderConstructor mustNot(ESCriterion criterion){
if(criterion!=null){
mustNotCriterions.add(criterion);
}
return this;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String getAsc() {
return asc;
}
public void setAsc(String asc) {
this.asc = asc;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public int getFrom() {
return from;
}
public void setFrom(int from) {
this.from = from;
}
}
条件构造器
import org.elasticsearch.index.query.QueryBuilder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ESQueryBuilders implements ESCriterion{
private List list = new ArrayList<>();
/**
* 功能描述:Term 查询
* @param field 字段名
* @param value 值
*/
public ESQueryBuilders term(String field, Object value) {
list.add(new ESSimpleExpression (field, value, Operator.TERM).toBuilder());
return this;
}
/**
* 功能描述:Terms 查询
* @param field 字段名
* @param values 集合值
*/
public ESQueryBuilders terms(String field, Collection values) {
list.add(new ESSimpleExpression (field, values).toBuilder());
return this;
}
/**
* 功能描述:fuzzy 查询
* @param field 字段名
* @param value 值
*/
public ESQueryBuilders fuzzy(String field, Object value) {
list.add(new ESSimpleExpression (field, value, Operator.FUZZY).toBuilder());
return this;
}
/**
* 功能描述:Range 查询
* @param from 起始值
* @param to 末尾值
*/
public ESQueryBuilders range(String field, Object from, Object to) {
list.add(new ESSimpleExpression (field, from, to).toBuilder());
return this;
}
/**
* 功能描述:Range 查询
* @param queryString 查询语句
*/
public ESQueryBuilders queryString(String queryString) {
list.add(new ESSimpleExpression (queryString, Operator.QUERY_STRING).toBuilder());
return this;
}
public List listBuilders() {
return list;
}
}
条件表达式
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import java.util.Collection;
import static com.scistor.label.labelstore.elasticsearch.ESCriterion.Operator;
public class ESSimpleExpression {
private String fieldName; //属性名
private Object value; //对应值
private Collection values; //对应值
private ESCriterion.Operator operator; //计算符
private Object from;
private Object to;
protected ESSimpleExpression(String fieldName, Object value, Operator operator) {
this.fieldName = fieldName;
this.value = value;
this.operator = operator;
}
protected ESSimpleExpression(String value, Operator operator) {
this.value = value;
this.operator = operator;
}
protected ESSimpleExpression(String fieldName, Collection values) {
this.fieldName = fieldName;
this.values = values;
this.operator = Operator.TERMS;
}
protected ESSimpleExpression(String fieldName, Object from, Object to) {
this.fieldName = fieldName;
this.from = from;
this.to = to;
this.operator = Operator.RANGE;
}
public QueryBuilder toBuilder() {
QueryBuilder qb = null;
switch (operator) {
case TERM:
qb = QueryBuilders.termQuery(fieldName, value);
break;
case TERMS:
qb = QueryBuilders.termsQuery(fieldName, values);
break;
case RANGE:
qb = QueryBuilders.rangeQuery(fieldName).from(from).to(to).includeLower(true).includeUpper(true);
break;
case FUZZY:
qb = QueryBuilders.fuzzyQuery(fieldName, value);
break;
case QUERY_STRING:
qb = QueryBuilders.queryStringQuery(value.toString());
}
return qb;
}
}
ES检索封装
import com.scistor.label.common.exception.MessageException;
import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class ElasticSearchService {
private final static int MAX = 10000;
TransportClient client;
/**
* 功能描述:服务初始化
* @param clusterName 集群名称
* @param ip 地址
* @param port 端口
*/
public ElasticSearchService (String clusterName, String ip, int port) {
try {
Settings settings = Settings.builder()
.put("cluster.name", clusterName).build();
this.client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), port));
} catch (UnknownHostException e) {
throw new MessageException("es init failed!", e);
}
}
/**
* 功能描述:新建索引
* @param indexName 索引名
*/
public void createIndex(String indexName) {
client.admin().indices().create(new CreateIndexRequest(indexName))
.actionGet();
}
/**
* 功能描述:新建索引
* @param index 索引名
* @param type 类型
*/
public void createIndex(String index, String type) {
client.prepareIndex(index, type).setSource().get();
}
/**
* 功能描述:删除索引
* @param index 索引名
*/
public void deleteIndex(String index) {
if (indexExist(index)) {
DeleteIndexResponse dResponse = client.admin().indices().prepareDelete(index)
.execute().actionGet();
if (!dResponse.isAcknowledged()) {
throw new MessageException("failed to delete index.");
}
} else {
throw new MessageException("index name not exists");
}
}
/**
* 功能描述:验证索引是否存在
* @param index 索引名
*/
public boolean indexExist(String index) {
IndicesExistsRequest inExistsRequest = new IndicesExistsRequest(index);
IndicesExistsResponse inExistsResponse = client.admin().indices()
.exists(inExistsRequest).actionGet();
return inExistsResponse.isExists();
}
/**
* 功能描述:插入数据
* @param index 索引名
* @param type 类型
* @param json 数据
*/
public void insertData(String index, String type, String json) {
IndexResponse response = client.prepareIndex(index, type)
.setSource(json)
.get();
}
/**
* 功能描述:插入数据
* @param index 索引名
* @param type 类型
* @param _id 数据id
* @param json 数据
*/
public void insertData(String index, String type, String _id, String json) {
IndexResponse response = client.prepareIndex(index, type).setId(_id)
.setSource(json)
.get();
}
/**
* 功能描述:更新数据
* @param index 索引名
* @param type 类型
* @param _id 数据id
* @param json 数据
*/
public void updateData(String index, String type, String _id, String json) throws Exception {
try {
UpdateRequest updateRequest = new UpdateRequest(index, type, _id)
.doc(json);
client.update(updateRequest).get();
} catch (Exception e) {
throw new MessageException("update data failed.", e);
}
}
/**
* 功能描述:删除数据
* @param index 索引名
* @param type 类型
* @param _id 数据id
*/
public void deleteData(String index, String type, String _id) {
DeleteResponse response = client.prepareDelete(index, type, _id)
.get();
}
/**
* 功能描述:批量插入数据
* @param index 索引名
* @param type 类型
* @param data (_id 主键, json 数据)
*/
public void bulkInsertData(String index, String type, Map data) {
BulkRequestBuilder bulkRequest = client.prepareBulk();
data.forEach((param1, param2) -> {
bulkRequest.add(client.prepareIndex(index, type, param1)
.setSource(param2)
);
});
BulkResponse bulkResponse = bulkRequest.get();
}
/**
* 功能描述:批量插入数据
* @param index 索引名
* @param type 类型
* @param jsonList 批量数据
*/
public void bulkInsertData(String index, String type, List jsonList) {
BulkRequestBuilder bulkRequest = client.prepareBulk();
jsonList.forEach(item -> {
bulkRequest.add(client.prepareIndex(index, type)
.setSource(item)
);
});
BulkResponse bulkResponse = bulkRequest.get();
}
/**
* 功能描述:查询
* @param index 索引名
* @param type 类型
* @param constructor 查询构造
*/
public List> search(String index, String type, ESQueryBuilderConstructor constructor) {
List> result = new ArrayList<>();
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index).setTypes(type);
//排序
if (StringUtils.isNotEmpty(constructor.getAsc()))
searchRequestBuilder.addSort(constructor.getAsc(), SortOrder.ASC);
if (StringUtils.isNotEmpty(constructor.getDesc()))
searchRequestBuilder.addSort(constructor.getDesc(), SortOrder.DESC);
//设置查询体
searchRequestBuilder.setQuery(constructor.listBuilders());
//返回条目数
int size = constructor.getSize();
if (size < 0) {
size = 0;
}
if (size > MAX) {
size = MAX;
}
//返回条目数
searchRequestBuilder.setSize(size);
searchRequestBuilder.setFrom(constructor.getFrom() < 0 ? 0 : constructor.getFrom());
SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHists = hits.getHits();
for (SearchHit sh : searchHists) {
result.add(sh.getSource());
}
return result;
}
/**
* 功能描述:统计查询
* @param index 索引名
* @param type 类型
* @param constructor 查询构造
* @param groupBy 统计字段
*/
public Map statSearch(String index, String type, ESQueryBuilderConstructor constructor, String groupBy) {
Map map = new HashedMap();
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index).setTypes(type);
//排序
if (StringUtils.isNotEmpty(constructor.getAsc()))
searchRequestBuilder.addSort(constructor.getAsc(), SortOrder.ASC);
if (StringUtils.isNotEmpty(constructor.getDesc()))
searchRequestBuilder.addSort(constructor.getDesc(), SortOrder.DESC);
//设置查询体
if (null != constructor) {
searchRequestBuilder.setQuery(constructor.listBuilders());
} else {
searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
}
int size = constructor.getSize();
if (size < 0) {
size = 0;
}
if (size > MAX) {
size = MAX;
}
//返回条目数
searchRequestBuilder.setSize(size);
searchRequestBuilder.setFrom(constructor.getFrom() < 0 ? 0 : constructor.getFrom());
SearchResponse sr = searchRequestBuilder.addAggregation(
AggregationBuilders.terms("agg").field(groupBy)
).get();
Terms stateAgg = sr.getAggregations().get("agg");
Iterator iter = stateAgg.getBuckets().iterator();
while (iter.hasNext()) {
Terms.Bucket gradeBucket = iter.next();
map.put(gradeBucket.getKey(), gradeBucket.getDocCount());
}
return map;
}
/**
* 功能描述:统计查询
* @param index 索引名
* @param type 类型
* @param constructor 查询构造
* @param agg 自定义计算
*/
public Map statSearch(String index, String type, ESQueryBuilderConstructor constructor, AggregationBuilder agg) {
if (agg == null) {
return null;
}
Map map = new HashedMap();
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index).setTypes(type);
//排序
if (StringUtils.isNotEmpty(constructor.getAsc()))
searchRequestBuilder.addSort(constructor.getAsc(), SortOrder.ASC);
if (StringUtils.isNotEmpty(constructor.getDesc()))
searchRequestBuilder.addSort(constructor.getDesc(), SortOrder.DESC);
//设置查询体
if (null != constructor) {
searchRequestBuilder.setQuery(constructor.listBuilders());
} else {
searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
}
int size = constructor.getSize();
if (size < 0) {
size = 0;
}
if (size > MAX) {
size = MAX;
}
//返回条目数
searchRequestBuilder.setSize(size);
searchRequestBuilder.setFrom(constructor.getFrom() < 0 ? 0 : constructor.getFrom());
SearchResponse sr = searchRequestBuilder.addAggregation(
agg
).get();
Terms stateAgg = sr.getAggregations().get("agg");
Iterator iter = stateAgg.getBuckets().iterator();
while (iter.hasNext()) {
Terms.Bucket gradeBucket = iter.next();
map.put(gradeBucket.getKey(), gradeBucket.getDocCount());
}
return map;
}
/**
* 功能描述:关闭链接
*/
public void close() {
client.close();
}
}
java接口api封装_ElasticSearch java API 封装相关推荐
- java接口设计规范_关于团队API接口规范设计
这篇文章主要介绍我在一家移动互联网企业的做的接口规范文档,这篇文档帮助团队内部的协作起到很大的作用.可能文章内容会掺杂个人对接口的理解,各位大佬望批评指正. 更新记录 2019-09-21 marke ...
- 在php中调用java接口吗,php 调用 java 接口
php 需要开启 curl模块 /* * HTTP 请求函数封装 */ function http_request_cloudzone($url, $data){ //var_dump($url.&q ...
- java接口安全怎么处理_Restful API 接口安全性设计
1.API接口设计规范 2.安全性设计 a.白名单限制 仅接受特定系统的请求响应,调用方的IP地址需要在本系统中报备,否则无法调用 b.合法身份合法性验证 Basic Authentication : ...
- revit java 接口_如何使用Revit API获取axis属性?
我试图使用Revit Interactive Python Shell在Revit中旋转对象 . 我挂了如何指定旋转轴 . 我不知道如何使用API创建一行,然后在ElementTransformUti ...
- jmeter java接口,jmeter并发测试java接口 | 学步园
Sample 这里我用到主要JMeter的线程和报表,扩展了他的"Java请求"这个应用类别.要扩展此应用,要用到lib/ext/ApacheJMeter_java.jar,他封装 ...
- java 接口定义(翻译自Java Tutorials)
原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/12/04/2802120.html 英文出自 http://docs.oracle.com/ja ...
- java接口返回类,Java接口和返回类型 - java
考虑我有以下界面: public interface A { public void b(); } 但是我希望实现它的每个类对方法b()都有不同的返回类型. 例子: public class C { ...
- java接口课程_用java定义一个接口,用于查询课程
定义一个类Stu,包括如下属性:学号.姓名.性别.专业.课程,实现以下方法:每个属性的获取和定义,要求至少包含一个构造函数.定义一个接口类,定义方法qcc()用来查询课程.编写一... 定义一个类 S ...
- java接口import_深入理解Java架构师在组件注册@Import导入容器(ImportSelector接口)的神操作!...
ImportSelector:返回需要导入的组件的全类名数组 创建一个实现了ImportSelector接口的类,然后让入Import中.ImportSelector的实现类包含了所有需要导入到容器中 ...
最新文章
- 5 门前途美好的编程语言
- 1.43千米外隔墙透视!这项黑科技已被中科大潘建伟团队实现 | PNAS
- docker-compose.yml 配置文件编写
- Thymeleaf读取model里面的对象||Thymeleaf读取model里面的集合||Themeleaf在js中取值||访问带参数的消息||ThymeleafObjects的使用[取三大作域的值
- linux设置python3为默认python_Ubuntu 18.04将Python3设置为Python默认版本
- 干煸线椒的做法_美食:农家蒸土鸡,剁椒梅鲚鱼干,干煸茶树菇,芹菜炒牛肉的做法...
- MySQL笔记(三)常用系统函数
- Zookeepr 如何进行权限控制?
- [剑指Offer] 43.左旋转字符串
- 小红伞key的下载地址
- Git 可视化管理工具 - Sourcetree 使用指南
- JConsole使用教程
- PMP知识点总结—合同类型
- 结合面向对象设计原则分析正方形是否为长方形的子类
- MySQL中rank函数的使用
- javascript 模拟退格键_js按钮模拟键盘退格键定位删除问题
- 太酷了!金山云重磅开源鎏光云游戏引擎
- 重新定义股票交易中的试错和复盘
- 【C语言程序设计】从键盘上输入某年某月(包括闰年),编程输出该年的该月拥有的天数。
- 小程序实现扫码识别二维码内容
热门文章
- java基础巩固-宇宙第一AiYWM:为了维持生计,手写RPC~Version07(RPC原理、序列化框架们、网络协议框架们 、RPC 能帮助我们做什么呢、RPC异常排查:ctrl+F搜超时)整起
- 杨立昆:科学之路读书笔记2
- EF框架实现登录(记住密码+首页欢迎)+列表功能(增删改查)+过滤器
- 在Revit里如何将普通墙与曲面墙的内壁连接
- 利用GPT2生成莎士比亚写作风格的文本(python实现)
- 用于发现物联网设备的规则采集引擎
- Crash Dump Analysis 崩溃转储分析-摘抄翻译自深入解析windows操作系统
- MUSH中的Database
- STL关于queue(队列)与priority_queue(优先队列)的一些笔记
- CG动画制作项目第七篇:MAYA中部分人物的K帧动画以及父子关系的使用