elasticsearch是一款高效的数据存储与查询工具,最近自己在学着用java对es进行操作,在这里记录分享一下。
1 建立连接:
主要用到 集群名,IP地址,端口号(es默认一般为9300)。我这里在构造函数中进行建立连接,使用单例进行调用
private static final ElasticsearchUtils ELASTICSEARCH_UTILS = new ElasticsearchUtils();
private static TransportClient client;//实例化一个客户端
private String clusterName = "jiesi-1";
private String ipAddress = "192.168.200.193";
private int port = 9303;
public static long total = 0; //条件命中总数
private ElasticsearchUtils() {
Map<String, String> map = new HashMap<String, String>();
map.put("cluster.name", clusterName);
Settings.Builder settings = Settings.builder().put(map);
try {
client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ipAddress), port));
logger.info("建立连接成功");
} catch (Exception e) {
logger.info("error--->建立连接失败");
}
}
public static ElasticsearchUtils newInstance(){
return ELASTICSEARCH_UTILS;
}
这里建立连接便成功了,接下来是执行简单的查询
2 查询
分两个部分,一个是查询的执行,另个是查询条件的构建,由于es有自己一套独特的查询条件构建方式,建议大家去看一下es的官方api看看具体的查询条件的规则,这里只提供简单的must查询以及复合查询
查询执行方法:传过来的map参数,是一些条件的集合
/**
* 执行查询
*
* @param indexname
* @param map
* @return
*/
public List<Map<String, String>> MultiSearch(String indexname, Map<String, String> map) {
// 按输入条件查询
int showNum = Integer.parseInt(map.get("showNum"));
QueryBuilder queryBuilder = EsQueryBuilder.newInstance().matchQuery(map);//获取查询条件
SearchResponse actionGet = client.prepareSearch(indexname).setQuery(queryBuilder).setFrom(0).setSize(showNum)
.execute().actionGet();//执行查询
SearchHits hits = actionGet.getHits();//接收结果
total = hits.totalHits();//查询出你的条件命中的结果总数
List<Map<String, String>> result = new LinkedList<>();
EsResultFields esResultFields = new EsResultFields();
result = esResultFields.dealer(hits);//处理结果,我这里用到了一个结果处理器,即对返回的结果进行处理
return result;
}
查询条件的构建:
/**
* 查询构造器类
*
* @author chenze3
*
*/
public class EsQueryBuilder {
public static final EsQueryBuilder queryBuilder = new EsQueryBuilder();
public static EsQueryBuilder newInstance() {
return queryBuilder;
}
/**
* 布尔型查找
*
* @param map
* @return
*/
protected QueryBuilder matchQuery(Map<String, String> map) {
//匹配查询
QueryBuilder queryBuilder1 = QueryBuilders.termQuery("pin",map.get("pin"));// 搜索pin字段
QueryBuilder queryBuilder2 = QueryBuilders.termQuery("client",map.get("client"));// 搜索client字段
QueryBuilder queryBuilder3 = QueryBuilders.termQuery("functionId",map.get("functionId"));// 搜索functionID字段
QueryBuilder queryBuilder4 = QueryBuilders.rangeQuery("time").gte(map.get("start")).lte(map.get("end"));// 搜索time范围
// 将以上条件添加到bool查询
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
if(!map.get("pin").equals("")){//做空判断,传入数据为空就不将此条件加入查询
queryBuilder.must(queryBuilder1);
}
if(!map.get("client").equals("")){
queryBuilder.must(queryBuilder2);
}
if(!map.get("functionId").equals("")){
queryBuilder.must(queryBuilder3);
}
if(!map.get("start").equals("")&&!map.get("start").equals("")){
queryBuilder.must(queryBuilder4);
}
return queryBuilder;//返回条件对象
}
}
这样就可以对es进行简单的查询,大家也可以对各种查询条件进行封装,以满足各种查询场景,es还提供分页查询
SearchResponse actionGet = client.prepareSearch(indexname).setQuery(queryBuilder).setFrom(0).setSize(showNum).execute().actionGet();//执行查询
setFrom(0)为偏移量 ,一般设为0
setSize(showNum)为查询返回的结果数量
最后贴上两个网址
es 官方api:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/index.html
es全面详解(有兴趣深入的可以看看):https://es.xiaoleilu.com/