这是针对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 封装相关推荐

  1. java接口设计规范_关于团队API接口规范设计

    这篇文章主要介绍我在一家移动互联网企业的做的接口规范文档,这篇文档帮助团队内部的协作起到很大的作用.可能文章内容会掺杂个人对接口的理解,各位大佬望批评指正. 更新记录 2019-09-21 marke ...

  2. 在php中调用java接口吗,php 调用 java 接口

    php 需要开启 curl模块 /* * HTTP 请求函数封装 */ function http_request_cloudzone($url, $data){ //var_dump($url.&q ...

  3. java接口安全怎么处理_Restful API 接口安全性设计

    1.API接口设计规范 2.安全性设计 a.白名单限制 仅接受特定系统的请求响应,调用方的IP地址需要在本系统中报备,否则无法调用 b.合法身份合法性验证 Basic Authentication : ...

  4. revit java 接口_如何使用Revit API获取axis属性?

    我试图使用Revit Interactive Python Shell在Revit中旋转对象 . 我挂了如何指定旋转轴 . 我不知道如何使用API创建一行,然后在ElementTransformUti ...

  5. jmeter java接口,jmeter并发测试java接口 | 学步园

    Sample 这里我用到主要JMeter的线程和报表,扩展了他的"Java请求"这个应用类别.要扩展此应用,要用到lib/ext/ApacheJMeter_java.jar,他封装 ...

  6. java 接口定义(翻译自Java Tutorials)

    原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/12/04/2802120.html 英文出自 http://docs.oracle.com/ja ...

  7. java接口返回类,Java接口和返回类型 - java

    考虑我有以下界面: public interface A { public void b(); } 但是我希望实现它的每个类对方法b()都有不同的返回类型. 例子: public class C { ...

  8. java接口课程_用java定义一个接口,用于查询课程

    定义一个类Stu,包括如下属性:学号.姓名.性别.专业.课程,实现以下方法:每个属性的获取和定义,要求至少包含一个构造函数.定义一个接口类,定义方法qcc()用来查询课程.编写一... 定义一个类 S ...

  9. java接口import_深入理解Java架构师在组件注册@Import导入容器(ImportSelector接口)的神操作!...

    ImportSelector:返回需要导入的组件的全类名数组 创建一个实现了ImportSelector接口的类,然后让入Import中.ImportSelector的实现类包含了所有需要导入到容器中 ...

最新文章

  1. 5 门前途美好的编程语言
  2. 1.43千米外隔墙透视!这项黑科技已被中科大潘建伟团队实现 | PNAS
  3. docker-compose.yml 配置文件编写
  4. Thymeleaf读取model里面的对象||Thymeleaf读取model里面的集合||Themeleaf在js中取值||访问带参数的消息||ThymeleafObjects的使用[取三大作域的值
  5. linux设置python3为默认python_Ubuntu 18.04将Python3设置为Python默认版本
  6. 干煸线椒的做法_美食:农家蒸土鸡,剁椒梅鲚鱼干,干煸茶树菇,芹菜炒牛肉的做法...
  7. MySQL笔记(三)常用系统函数
  8. Zookeepr 如何进行权限控制?
  9. [剑指Offer] 43.左旋转字符串
  10. 小红伞key的下载地址
  11. Git 可视化管理工具 - Sourcetree 使用指南
  12. JConsole使用教程
  13. PMP知识点总结—合同类型
  14. 结合面向对象设计原则分析正方形是否为长方形的子类
  15. MySQL中rank函数的使用
  16. javascript 模拟退格键_js按钮模拟键盘退格键定位删除问题
  17. 太酷了!金山云重磅开源鎏光云游戏引擎
  18. 重新定义股票交易中的试错和复盘
  19. 【C语言程序设计】从键盘上输入某年某月(包括闰年),编程输出该年的该月拥有的天数。
  20. 小程序实现扫码识别二维码内容

热门文章

  1. java基础巩固-宇宙第一AiYWM:为了维持生计,手写RPC~Version07(RPC原理、序列化框架们、网络协议框架们 、RPC 能帮助我们做什么呢、RPC异常排查:ctrl+F搜超时)整起
  2. 杨立昆:科学之路读书笔记2
  3. EF框架实现登录(记住密码+首页欢迎)+列表功能(增删改查)+过滤器
  4. 在Revit里如何将普通墙与曲面墙的内壁连接
  5. 利用GPT2生成莎士比亚写作风格的文本(python实现)
  6. 用于发现物联网设备的规则采集引擎
  7. Crash Dump Analysis 崩溃转储分析-摘抄翻译自深入解析windows操作系统
  8. MUSH中的Database
  9. STL关于queue(队列)与priority_queue(优先队列)的一些笔记
  10. CG动画制作项目第七篇:MAYA中部分人物的K帧动画以及父子关系的使用