本文给出一种优雅的拼装elasticsearch查询的方式,可能会使得使用elasticsearch的方式变得优雅起来,使得代码结构很清晰易读。

建立elasticsearch连接部分请参看另一篇博客:http://www.cnblogs.com/kangoroo/p/7127003.html

1、ESDao -- 类似DB中的dao层

封装了增删改查ES的各种方法

package com.dqa.sentinel.client.es;

import com.xiaoju.dqa.sentinel.client.es.entity.ESDocument;
import com.xiaoju.dqa.sentinel.client.es.entity.SearchDocument;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetRequestBuilder;
import org.elasticsearch.action.get.MultiGetResponse;
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.action.update.UpdateResponse;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import java.nio.charset.Charset;
import java.util.Collection;
import java.util.List;
import java.util.Map; import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import static org.elasticsearch.index.query.QueryBuilders.termsQuery; @Component
public class ESDao { @Autowired
private ESClient esClient; public void createCache(ESDocument doc) throws Exception {
IndexResponse response = esCache.getClient().prepareIndex(doc.getIndexName(), doc.getTypeName(), doc.getId())
.setSource(doc.getSource().getBytes(Charset.forName("UTF-8"))).setRefresh(true).get();
if (!response.isCreated()) {
throw new Exception();
}
} public Map<String, Object> get(ESDocument doc) throws Exception {
try {
GetResponse response = esClient.getClient().prepareGet(doc.getIndexName(), doc.getTypeName(), doc.getId()).get();
return response.getSourceAsMap();
} catch (Exception ex) {
throw new Exception();
}
} public void create(ESDocument doc) throws Exception {
IndexResponse response = esClient.getClient().prepareIndex(doc.getIndexName(), doc.getTypeName(), doc.getId())
.setSource(doc.getSource().getBytes(Charset.forName("UTF-8"))).setRefresh(true).get();
if (!response.isCreated()) {
throw new Exception();
}
} public void mutiGet(List<ESDocument> docList) throws Exception {
MultiGetRequestBuilder multiGetRequestBuilder = esClient.getClient().prepareMultiGet(); for (ESDocument doc : docList) {
multiGetRequestBuilder.add(doc.getIndexName(), doc.getTypeName(), doc.getId());
}
MultiGetResponse multiGetItemResponses = multiGetRequestBuilder.get(); for (MultiGetItemResponse itemResponse : multiGetItemResponses) {
GetResponse response = itemResponse.getResponse();
if (response.isExists()) {
String json = response.getSourceAsString();
System.out.println(json);
}
}
} public void update(ESDocument doc) throws Exception {
try {
UpdateRequest request = new UpdateRequest().index(doc.getIndexName())
.type(doc.getTypeName()).id(doc.getId())
.doc(doc.getSource().getBytes(Charset.forName("UTF-8"))).refresh(true);
UpdateResponse response = esClient.getClient().update(request).get();
long docVersion = response.getVersion();
if (!response.isCreated()) {
throw new Exception();
}
} catch (Exception e) {
throw new Exception();
}
} public void deleteById(ESDocument doc) throws Exception{
try {
DeleteResponse response = esClient.getClient().prepareDelete(doc.getIndexName(),
doc.getTypeName(), doc.getId())
.execute()
.actionGet();
long docVersion = response.getVersion();
if (!response.isFound()) {
throw new Exception();
}
} catch (Exception e) {
throw new Exception();
} } public SearchHit[] searchClient(SearchDocument searchDocument) {
BoolQueryBuilder query = QueryBuilders.boolQuery();
// term
for (Map<String, String> termMap : searchDocument.getTermList()) {
TermQueryBuilder termQueryBuilder = termQuery(termMap.get("field"), termMap.get("value"));
query.must(termQueryBuilder);
}
// terms
for (Map<String, Object> termsMap : searchDocument.getTermsList()) {
if (termsMap.size() != 0) {
TermsQueryBuilder termsQueryBuilder = termsQuery(termsMap.get("field").toString(), (Collection<?>) termsMap.get("terms"));
query.must(termsQueryBuilder);
}
}
// range
for (Map rangeMap : searchDocument.getRangeList()) {
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(rangeMap.get("field").toString()).from(rangeMap.get("from")).to(rangeMap.get("to")).includeLower(true).includeUpper(false);
query.must(rangeQueryBuilder);
}
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(query);
SearchRequestBuilder searchRequestBuilder = esClient.getClient()
.prepareSearch(searchDocument.getIndexName()).setTypes(searchDocument.getTypeName());
SearchResponse response = searchRequestBuilder
.setQuery(query)
.setFrom(0).setSize(10000)
.setExplain(true).execute().actionGet();
SearchHits hits = response.getHits();
return hits.getHits();
}

2、查询字段的传入我们是通过Document类完成的

有三个Document,BaseDocument,ESDocument,SearchDocument,后两个继承前一个。

BaseDocument:

public class BaseDocument {
private String indexName;
private String typeName; public String getIndexName() {
return this.indexName;
}
public void setIndexName(String indexName) {
this.indexName = indexName;
}
public String getTypeName() {
return this.typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
} }

ESDocument:

public class ESDocument extends BaseDocument {
private String id;
private String source;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
} }

SearchDocument

public class SearchDocument extends BaseDocument {
private List<Map<String, String>> termList;
private List<Map<String, String>> rangeList;
private List<Map<String, Object>> termsList;
public SearchDocument() {
super();
termList = new ArrayList<>();
rangeList = new ArrayList<>();
termsList = new ArrayList<>();
}
public List<Map<String, String>> getTermList() {
return this.termList;
}
public void setTermList(List<Map<String, String>> termList) {
this.termList = termList;
}
public List<Map<String, String>> getRangeList() {
return this.rangeList;
}
public void setRangeList(List<Map<String, String>> rangeList) {
this.rangeList = rangeList;
} public void setTermsList(List<Map<String, Object>> termsList) {
this.termsList = termsList;
}
public List<Map<String, Object>> getTermsList() {
return termsList;
}
}

3、使用的时候,拼装Document,并通过ESDao查询即可

例如:

     SearchDocument searchDocument = new SearchDocument();
// term查询, field:topicName
Map<String, String> topicMap = new HashMap<>();
topicMap.put("field", "topicName");
topicMap.put("value", topicName.toLowerCase());
List<Map<String, String>> termList = new ArrayList<>();
termList.add(topicMap); // range查询, field:timestamp
Map<String, String> timeRange = new HashMap<>();
timeRange.put("field", "timestamp");
timeRange.put("from", from);
timeRange.put("to", to);
List<Map<String, String>> rangeList = new ArrayList<>();
rangeList.add(timeRange); searchDocument.setTermList(termList);
searchDocument.setRangeList(rangeList);
searchDocument.setIndexName("audit");
searchDocument.setTypeName("kafka");
SearchHit[] searchHits = esDao.searchCache(searchDocument);
String hourStatus = "0";
for (SearchHit hit : searchHits) {
Map<String, Object> eachMap = hit.getSource();
    }

java优雅的使用elasticsearch api的更多相关文章

  1. Java 8时间和日期API 20例

    本文由 ImportNew - Sandy 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. 伴随lambda表达式.streams以及一系列小优化,Java 8 推出了全新的 ...

  2. 如何更优雅地对接第三方API

    本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程 ...

  3. Spring Boot入门系列(二十一)如何优雅的设计 Restful API 接口版本号,实现 API 版本控制!

    前面介绍了Spring Boot 如何快速实现Restful api 接口,并以人员信息为例,设计了一套操作人员信息的接口.不清楚的可以看之前的文章:https://www.cnblogs.com/z ...

  4. java通过shield链接Elasticsearch

    本文mark了springboot中集成elasticsearch,并且实现连接带有shield权限管理的elasticsearch的方法. tips:首先建议java client版本和elasti ...

  5. Java高并发秒杀系统API之SSM框架集成swagger与AdminLTE

    初衷与整理描述 Java高并发秒杀系统API是来源于网上教程的一个Java项目,也是我接触Java的第一个项目.本来是一枚c#码农,公司计划部分业务转java,于是我利用业务时间自学Java才有了本文 ...

  6. java根据地址获取百度API经纬度

    java根据地址获取百度API经纬度(详细文档) public void getLarLng(String address) throws Exception { String ak = " ...

  7. Java 8 新日期时间 API

    Java 8 新日期时间 API 1. LocalDate.LocalTime.LocalDateTime LocalDate.LocalTime.LocalDateTime 实例是不可变的对象,分别 ...

  8. springboot整合elasticsearch出错:java.lang.NoClassDefFoundError: org/elasticsearch/plugins/NetworkPlugin

    Caused by: java.lang.NoClassDefFoundError: org/elasticsearch/plugins/NetworkPlugin at java.lang.Clas ...

  9. Java生鲜电商平台-API请求性能调优与性能监控

    Java生鲜电商平台-API请求性能调优与性能监控 背景 在做性能分析时,API的执行时间是一个显著的指标,这里使用SpringBoot AOP的方式,通过对接口添加简单注解的方式来打印API的执行时 ...

随机推荐

  1. 教学服务系统设计之PHP后台设计

    项目简介 本项目是与@nameoverflow同学合作.该同学负责vue 前端的设计,我负责php后台的接口实现.本文将主要记录php后台. 本项目的Github地址:https://github.c ...

  2. 转: 【Java并发编程】之十八:第五篇中volatile意外问题的正确分析解答(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17382679 在<Java并发编程学习笔记之五:volatile变量修饰符-意料之外 ...

  3. Http协议详解,获取doPost,doGet提交的数据,以及编码问题

    一 什么是Http协议 http协议: 浏览器客户端 和  服务器端 之间数据传输的格式规范 二 如何查看Http协议的内容 1)使用火狐的firebug插件(右键->firebug->网 ...

  4. 一些LVS实验配置、工具和方案

    最近做了一些LVS配置和方案的验证实验,将过程中用到的一些配置.工具和具体的解决方案记录一下.使用DR模式.验证一种不中断业务的RealServer升级或者重启方案. 网络规划: 节点 IP地址 ce ...

  5. 201521123020 《Java程序设计》第6周学习总结

    本周学习总结 书面作业 1.clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 答:需要将protected改为pu ...

  6. 201521123075 《Java程序设计》第4周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. - 了解了多态就是以单一的接口操作多种类型的对象,但是对多态和继承的关系还是有点混乱. - ...

  7. 201521123013 《Java程序设计》第13周学习总结

    1. 本周学习总结 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? ping值 ...

  8. 201521123022 《Java程序设计》 第十四周学习总结

    1. 本章学习总结 2. 书面作业 Q1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名),在自己建立的数据库上执行常见SQL语句(截图) ...

  9. Hyperledger Fabric 1.0 从零开始(一)——吐槽

    在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后没过多久1.0就发布了.自从2017 ...

  10. C#核心语法讲解-泛型(详细讲解泛型方法、泛型类、泛型接口、泛型约束,了解协变逆变)

    泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定一个或多个具 ...