elasticsearch java api条件查询、排序、分页

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());
}

以上查询条件,可以单独使用,也可以组合起来使用。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值