1. 添加依赖
<!-- 导入es的客户端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.4.0</version>
</dependency>
2. 配置连接参数
package com.demo.es.config;
import java.io.IOException;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestClientBuilder.RequestConfigCallback;
import org.elasticsearch.client.RestHighLevelClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticsearchClientConfig {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${spring.elasticsearch.jest.username}")
private String userName;
@Value("${spring.elasticsearch.jest.password}")
private String password;
@Value("${spring.elasticsearch.firstIp}")
private String firstIp;
// @Value("${spring.elasticsearch.secondIp}")
// private String secondIp;
//
// @Value("${spring.elasticsearch.thirdIp}")
// private String thirdIp;
@Value("${spring.elasticsearch.firstPort}")
private int firstPort;
// @Value("${spring.elasticsearch.secondPort}")
// private int secondPort;
//
// @Value("${spring.elasticsearch.thirdPort}")
// private int thirdPort;
@Value("${spring.elasticsearch.clusterName}")
private String clusterName;
@Value("${spring.elasticsearch.protocolName}")
private String protocolName;
private static int connectTimeOut = 6000; // 连接超时时间
private static int socketTimeOut = 180000; // 连接超时时间
private static int connectionRequestTimeOut = 5000; // 获取连接的超时时间
private static int maxConnectNum = 100; // 最大连接数
private static int maxConnectPerRoute = 100; // 最大路由连接数
@Bean
public RestHighLevelClient restHighLevelClient() throws IOException {
// 本地无认证要求环境可以使用
// RestHighLevelClient client = new RestHighLevelClient(
// RestClient.builder(
// new HttpHost("localhost", 9200, "http")));
// 阿里云Elasticsearch集群需要basic auth验证。
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
//访问用户名和密码为您创建阿里云Elasticsearch实例时设置的用户名和密码
// credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{访问用户名}", "{访问密码}"));
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));
RestHighLevelClient client = null;
logger.info("ElasticSearch初始化开始。。");
logger.info("要连接的节点1的ip是{},端口是{},集群名为{}" , firstIp , firstPort , clusterName);
try {
// 本地无认证要求环境可以使用
// client = new RestHighLevelClient(
// RestClient.builder(
// new HttpHost(firstIp, firstPort, protocolName)));
// 通过builder创建rest client,配置http client的HttpClientConfigCallback。
// 单击所创建的Elasticsearch实例ID,在基本信息页面获取公网地址,即为ES集群地址。
RestClientBuilder builder = RestClient.builder(new HttpHost(firstIp, firstPort, protocolName));
// 异步httpclient连接延时配置
builder.setRequestConfigCallback(new RequestConfigCallback() {
@Override
public Builder customizeRequestConfig(Builder requestConfigBuilder) {
requestConfigBuilder.setConnectTimeout(connectTimeOut);
requestConfigBuilder.setSocketTimeout(socketTimeOut);
requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
return requestConfigBuilder;
}
});
// 异步httpclient连接数配置
builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.setMaxConnTotal(maxConnectNum);
httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
// RestHighLevelClient实例通过REST low-level client builder进行构造。
client = new RestHighLevelClient(builder);
logger.info("ElasticSearch初始化完成。。");
} catch (Exception e) {
e.printStackTrace();
logger.error("ElasticSearch初始化失败:" + e.getMessage(),e);
client.close();
}
return client;
}
}
3. 分页查询设置
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 分页范围
sourceBuilder.from(pageNum - 1);
sourceBuilder.size(pageSize);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(INDEX_NAME);
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
RestStatus restStatus = searchResponse.status();
if (restStatus != RestStatus.OK) {
return null;
}
SearchHits searchHits = searchResponse.getHits();
for (SearchHit hit : searchHits.getHits()) {
String source = hit.getSourceAsString();
ElasticsearchBoxBill book = JSON.parseObject(source, ElasticsearchBoxBill.class);
list.add(book);
}
long totalHits = searchHits.getTotalHits().value;
TimeValue took = searchResponse.getTook();
log.info("查询成功!请求参数: {}, 用时{}毫秒" + searchRequest.source().toString() + took.millis());
TableDataInfo tableDataInfo = getDataTable(list);
// 设置查询到的记录数
tableDataInfo.setTotal(totalHits);
log.info("1.结束查询ES!");
return tableDataInfo;
} catch (IOException e) {
e.printStackTrace();
log.error("IO异常查询失败!原因: {}" + e.getMessage() + e.toString());
} catch (Exception e) {
e.printStackTrace();
log.error("查询失败!原因: {}" + e.getMessage() + e.toString());
}
4. 排序设置
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 排序
sourceBuilder.sort(new FieldSortBuilder("billDate").unmappedType("long").order(SortOrder.DESC));
sourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(INDEX_NAME);
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
RestStatus restStatus = searchResponse.status();
if (restStatus != RestStatus.OK) {
return null;
}
SearchHits searchHits = searchResponse.getHits();
for (SearchHit hit : searchHits.getHits()) {
String source = hit.getSourceAsString();
ElasticsearchBoxBill book = JSON.parseObject(source, ElasticsearchBoxBill.class);
list.add(book);
}
long totalHits = searchHits.getTotalHits().value;
TimeValue took = searchResponse.getTook();
log.info("查询成功!请求参数: {}, 用时{}毫秒" + searchRequest.source().toString() + took.millis());
TableDataInfo tableDataInfo = getDataTable(list);
// 设置查询到的记录数
tableDataInfo.setTotal(totalHits);
log.info("1.结束查询ES!");
return tableDataInfo;
} catch (IOException e) {
e.printStackTrace();
log.error("IO异常查询失败!原因: {}" + e.getMessage() + e.toString());
} catch (Exception e) {
e.printStackTrace();
log.error("查询失败!原因: {}" + e.getMessage() + e.toString());
}
5. 条件查询(matchPhraseQuery)
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// match短语查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
QueryBuilder deptQueryBuilder2 = QueryBuilders.matchPhraseQuery("DeptId", merchDeptId);
boolQueryBuilder = boolQueryBuilder.must(deptQueryBuilder2);
sourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(INDEX_NAME);
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
RestStatus restStatus = searchResponse.status();
if (restStatus != RestStatus.OK) {
return null;
}
SearchHits searchHits = searchResponse.getHits();
for (SearchHit hit : searchHits.getHits()) {
String source = hit.getSourceAsString();
ElasticsearchBoxBill book = JSON.parseObject(source, ElasticsearchBoxBill.class);
list.add(book);
}
long totalHits = searchHits.getTotalHits().value;
TimeValue took = searchResponse.getTook();
log.info("查询成功!请求参数: {}, 用时{}毫秒" + searchRequest.source().toString() + took.millis());
TableDataInfo tableDataInfo = getDataTable(list);
// 设置查询到的记录数
tableDataInfo.setTotal(totalHits);
log.info("1.结束查询ES!");
return tableDataInfo;
} catch (IOException e) {
e.printStackTrace();
log.error("IO异常查询失败!原因: {}" + e.getMessage() + e.toString());
} catch (Exception e) {
e.printStackTrace();
log.error("查询失败!原因: {}" + e.getMessage() + e.toString());
}
6. 多匹配查询
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
QueryBuilder multiBankQueryBuilder = QueryBuilders.multiMatchQuery(bankDeptId, "bankDeptId", "bankDeptAncestors");
boolQueryBuilder = boolQueryBuilder.must(multiBankQueryBuilder);
sourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(INDEX_NAME);
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
RestStatus restStatus = searchResponse.status();
if (restStatus != RestStatus.OK) {
return null;
}
SearchHits searchHits = searchResponse.getHits();
for (SearchHit hit : searchHits.getHits()) {
String source = hit.getSourceAsString();
ElasticsearchBoxBill book = JSON.parseObject(source, ElasticsearchBoxBill.class);
list.add(book);
}
long totalHits = searchHits.getTotalHits().value;
TimeValue took = searchResponse.getTook();
log.info("查询成功!请求参数: {}, 用时{}毫秒" + searchRequest.source().toString() + took.millis());
TableDataInfo tableDataInfo = getDataTable(list);
// 设置查询到的记录数
tableDataInfo.setTotal(totalHits);
log.info("1.结束查询ES!");
return tableDataInfo;
} catch (IOException e) {
e.printStackTrace();
log.error("IO异常查询失败!原因: {}" + e.getMessage() + e.toString());
} catch (Exception e) {
e.printStackTrace();
log.error("查询失败!原因: {}" + e.getMessage() + e.toString());
}
7. 范围查询
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 范围查询
RangeQueryBuilder rangequerybuilder1 = QueryBuilders.rangeQuery("couponAmount").from(lMinCoupon);
boolQueryBuilder = boolQueryBuilder.must(rangequerybuilder);
RangeQueryBuilder rangequerybuilder2 = QueryBuilders.rangeQuery("couponAmount").to(lMaxCoupon);
boolQueryBuilder = boolQueryBuilder.must(rangequerybuilder);
sourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(INDEX_NAME);
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
RestStatus restStatus = searchResponse.status();
if (restStatus != RestStatus.OK) {
return null;
}
SearchHits searchHits = searchResponse.getHits();
for (SearchHit hit : searchHits.getHits()) {
String source = hit.getSourceAsString();
ElasticsearchBoxBill book = JSON.parseObject(source, ElasticsearchBoxBill.class);
list.add(book);
}
long totalHits = searchHits.getTotalHits().value;
TimeValue took = searchResponse.getTook();
log.info("查询成功!请求参数: {}, 用时{}毫秒" + searchRequest.source().toString() + took.millis());
TableDataInfo tableDataInfo = getDataTable(list);
// 设置查询到的记录数
tableDataInfo.setTotal(totalHits);
log.info("1.结束查询ES!");
return tableDataInfo;
} catch (IOException e) {
e.printStackTrace();
log.error("IO异常查询失败!原因: {}" + e.getMessage() + e.toString());
} catch (Exception e) {
e.printStackTrace();
log.error("查询失败!原因: {}" + e.getMessage() + e.toString());
}
8. 字符串查询
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询条件
QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery(corpCodeList);
queryBuilder.defaultField("corpCode");
boolQueryBuilder = boolQueryBuilder.must(queryBuilder);
sourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(INDEX_NAME);
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
RestStatus restStatus = searchResponse.status();
if (restStatus != RestStatus.OK) {
return null;
}
SearchHits searchHits = searchResponse.getHits();
for (SearchHit hit : searchHits.getHits()) {
String source = hit.getSourceAsString();
ElasticsearchBoxBill book = JSON.parseObject(source, ElasticsearchBoxBill.class);
list.add(book);
}
long totalHits = searchHits.getTotalHits().value;
TimeValue took = searchResponse.getTook();
log.info("查询成功!请求参数: {}, 用时{}毫秒" + searchRequest.source().toString() + took.millis());
TableDataInfo tableDataInfo = getDataTable(list);
// 设置查询到的记录数
tableDataInfo.setTotal(totalHits);
log.info("1.结束查询ES!");
return tableDataInfo;
} catch (IOException e) {
e.printStackTrace();
log.error("IO异常查询失败!原因: {}" + e.getMessage() + e.toString());
} catch (Exception e) {
e.printStackTrace();
log.error("查询失败!原因: {}" + e.getMessage() + e.toString());
}
9. 时间范围查询
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
RangeQueryBuilder rangequerybuilder = QueryBuilders
// 传入时间,目标格式2020-01-02T03:17:37.638Z
.rangeQuery("billDate").from(ltimeStart).to(ltimeEnd);
// 添加时间范围查询
boolQueryBuilder = boolQueryBuilder.must(rangequerybuilder);
sourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(INDEX_NAME);
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
RestStatus restStatus = searchResponse.status();
if (restStatus != RestStatus.OK) {
return null;
}
SearchHits searchHits = searchResponse.getHits();
for (SearchHit hit : searchHits.getHits()) {
String source = hit.getSourceAsString();
ElasticsearchBoxBill book = JSON.parseObject(source, ElasticsearchBoxBill.class);
list.add(book);
}
long totalHits = searchHits.getTotalHits().value;
TimeValue took = searchResponse.getTook();
log.info("查询成功!请求参数: {}, 用时{}毫秒" + searchRequest.source().toString() + took.millis());
TableDataInfo tableDataInfo = getDataTable(list);
// 设置查询到的记录数
tableDataInfo.setTotal(totalHits);
log.info("1.结束查询ES!");
return tableDataInfo;
} catch (IOException e) {
e.printStackTrace();
log.error("IO异常查询失败!原因: {}" + e.getMessage() + e.toString());
} catch (Exception e) {
e.printStackTrace();
log.error("查询失败!原因: {}" + e.getMessage() + e.toString());
}
以上查询条件,可以单独使用,也可以组合起来使用。