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同学比较简单。
二、单条数据的查询:
还没有评论,来说两句吧...