对于一个关系型数据库,各种查询方式组合,可以实现很复杂的搜索从而将结果限定到我们想要的范围之内。那么对于非关系型数据库ElasticSearch又该怎么做?以下操作基于Jest对ElasticSearch进行查询。
一、相关
所有相关的基础设置均是基于我另一篇博文所记录而进行,不明白的可以查阅一下。
SpringBoot下使用Jest访问ES数据库以及访问ES集群
额外:
SpringBoot下使用Jest实现对ElasticSearch的文档写入新增
二、实现代码
以下代码均在之前所写EsInfoImpl下进行扩充:
@Override
public JsonObject getEsTestInfo(EsRequestBean esRequestBean){
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
try{
if (!esRequestBean.getStartTime().isEmpty()){
queryBuilder.must(QueryBuilders.rangeQuery("startTime").gte(esRequestBean.getStartTime()));
}
if (!esRequestBean.getEndTime().isEmpty()){
queryBuilder.must(QueryBuilders.rangeQuery("endTime").lte(esRequestBean.getEndTime()));
}
if (!esRequestBean.getTestCode().isEmpty()){
queryBuilder.must(QueryBuilders.matchQuery("testCode", esRequestBean.getTestCode()));
}
searchSourceBuilder.query(queryBuilder);
Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(indexName).addType(typeName).build();
JestResult jestResult = jestClient.execute(search);
return jestResult.getJsonObject();
}catch (IOException e){
logger.error("Get info IOException:" + e);
return null;
}catch (Exception e){
logger.error("Get info Exception:" + e);
return null;
}
}
这里使用的都是must,must的意思就相当于Mysql的and,和的关系。
此外还有mustNot,should等的用法,should就相当于or。
而QueryBuilders中的rangeQuery也是见名知意,范围匹配,gte代表的大于等于,lte是小于等于。而matchQuery就相当于Mysql中的=,只有当字段内容等于指定的内容时才算匹配上。
此外QueryBuilders里还有很多其他的方法,有兴趣的查看一下源码。