Elasticsearch分页查询、排序、多条件查询(java API)
最近公司项目用到Elasticsearch,自己摸索了好几天才把这个弄明白,和大家分享一下:
一、建立Elasticsearch连接
package com.wlsj.yshj.config; import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig.Builder; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; import java.util.ArrayList; /** * Description: dp */ @Configuration public class EsConfiguration { private static String hosts = "172.63.24.50"; // 集群地址,多个用,隔开 private static int port = 9100; // 使用的端口号 private static String schema = "http"; // 使用的协议 private static ArrayList<HttpHost> hostList = null; private static int connectTimeOut = 1000; // 连接超时时间 private static int socketTimeOut = 30000; // 连接超时时间 private static int connectionRequestTimeOut = 500; // 获取连接的超时时间 private static int maxConnectNum = 100; // 最大连接数 private static int maxConnectPerRoute = 100; // 最大路由连接数 static { hostList = new ArrayList<>(); String[] hostStrs = hosts.split(","); for (String host : hostStrs) { hostList.add(new HttpHost(host, port, schema)); } } @PostConstruct void init() { System.setProperty("es.set.netty.runtime.available.processors", "false"); } @Bean public RestHighLevelClient client() { RestClientBuilder builder = RestClient.builder(hostList.toArray(new HttpHost[0])); // 异步httpclient连接延时配置 builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() { @Override public Builder customizeRequestConfig(Builder requestConfigBuilder) { requestConfigBuilder.setConnectTimeout(connectTimeOut); requestConfigBuilder.setSocketTimeout(socketTimeOut); requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut); return requestConfigBuilder; } }); // 异步httpclient连接数配置 builder.setHttpClientConfigCallback(new HttpClientConfigCallback() { @Override public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) { httpClientBuilder.setMaxConnTotal(maxConnectNum); httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute); return httpClientBuilder; } }); RestHighLevelClient client = new RestHighLevelClient(builder); return client; } }
二、开始写查询和封装条件
1、分页参数
2、创建一个 SearchSourceBuilder、BoolQueryBuilder、QueryBuilder
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder bq = QueryBuilders.boolQuery();
QueryBuilder queryBuilder = bq.must(QueryBuilders.existsQuery("公司名称"));
是否存在
在一个范围之内
min:最小数
max:最大数
gt : 大于 gte: 大于等于 lt: 小于 ,lte:小于等于
匹配用matchQuery()
不包含mustNot()
注意:在比较的时候 ES中的数据类型要匹配(date,float、int)切记、切记
2、查询数量
3、排序
4、连接es查询列表
5、处理查询结果
至此分页查询完结。需要注意的如下:
(1)、对matchQuery()、termQuery()、existsQuery()等的查询方法应用,要自己揣摩一下;
(2)、查询开始时 SearchSourceBuilder、BoolQueryBuilder、QueryBuilder这些对象的创建和顺序;
(3)、对查询结果的封装,这个相对java同学比较简单。
二、单条数据的查询: