ES官方推出Java High Level REST Client,它是基于Java Low Level REST Client的封装
Java高级别REST客户端(The Java High Level REST Client)
经过验证,此客户端可用性较高
文档查询: https://www.elastic.co/cn/search?fv-website_area=documentation&fv-product_version=7.x&q=heigh-level&size=20
具体文档: https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.x/java-rest-high-compatibility.html#java-rest-high-compatibility
客户端版本与为其开发客户端的Elasticsearch版本相同。
6.x 配置
@Configurationpublic class ElasticsearchConfiguration {private final Logger logger = LoggerFactory.getLogger(this.getClass());@Value("${spring.elasticsearch.host}")private String host;@Value("${spring.elasticsearch.port}")private Integer port;@Value("${spring.elasticsearch.scheme}")private String scheme;@Value("${spring.elasticsearch.connection-timeout}")private Integer connectionTimeout;@Value("${spring.elasticsearch.socket-timout}")private Integer socketTimeout;@Value("${spring.elasticsearch.connection-request-timout}")private Integer connectionRequestTimout;@Value("${spring.elasticsearch.max-connection-num}")private Integer maxConnectionNum;@Value("${spring.elasticsearch.max-connection-per-route}")private Integer maxConnectionPerRoute;@Value("${spring.elasticsearch.username}")private String username;@Value("${spring.elasticsearch.password}")private String password;@Beanpublic RestHighLevelClient restHighLevelClient() {if (Objects.isNull(host)) {logger.error("必须指定ElasticSearch服务地址");return null;}String[] hosts = host.split(",");HttpHost[] httpHosts = new HttpHost[hosts.length];for (int i = 0; i < hosts.length; i++) {httpHosts[i] = new HttpHost(hosts[i], port, scheme);}// 构建restClientBuilder 并配置RestClientBuilder restClientBuilder = RestClient.builder(httpHosts).setHttpClientConfigCallback(httpClientBuilder -> {httpClientBuilder.setMaxConnTotal(maxConnectionNum);httpClientBuilder.setMaxConnPerRoute(maxConnectionPerRoute);httpClientBuilder.setDefaultCredentialsProvider(this.credentialsProvider());return httpClientBuilder;}).setRequestConfigCallback(requestConfigBuilder -> {requestConfigBuilder.setSocketTimeout(socketTimeout);requestConfigBuilder.setConnectTimeout(connectionTimeout);requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimout);return requestConfigBuilder;});return new RestHighLevelClient(restClientBuilder);}private CredentialsProvider credentialsProvider() {CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));return credentialsProvider;}}
7.x 配置
Maven引用
<!--查询/索引/构建等等类--><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.2.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.2.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.2.0</version><exclusions><exclusion><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId></exclusion></exclusions></dependency>
配置 client
package com.demo.esdemo.config;import lombok.extern.slf4j.Slf4j;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.impl.client.BasicCredentialsProvider;import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;import org.apache.http.impl.nio.reactor.IOReactorConfig;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestHighLevelClient;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.Objects;@Slf4j@Configurationpublic class ElasticsearchConfiguration {@Value("${spring.elasticsearch.host}")private String host;@Value("${spring.elasticsearch.port}")private Integer port;@Value("${spring.elasticsearch.scheme}")private String scheme;@Value("${spring.elasticsearch.connection-timeout}")private Integer connectionTimeout;@Value("${spring.elasticsearch.socket-timout}")private Integer socketTimeout;@Value("${spring.elasticsearch.connection-request-timout}")private Integer connectionRequestTimout;@Value("${spring.elasticsearch.username}")private String username;@Value("${spring.elasticsearch.password}")private String password;/*** @return 封装 RestClient*/@Bean(destroyMethod = "close")public RestHighLevelClient restHighLevelClient() {if (Objects.isNull(host)) {log.error("必须指定ElasticSearch服务地址");return null;}String[] hosts = host.split(",");HttpHost[] httpHosts = new HttpHost[hosts.length];for (int i = 0; i < hosts.length; i++) {httpHosts[i] = new HttpHost(hosts[i], port, scheme);}return new RestHighLevelClient(RestClient.builder(httpHosts).setRequestConfigCallback(requestConfigBuilder -> {//配置超时信息requestConfigBuilder.setConnectTimeout(connectionTimeout);requestConfigBuilder.setSocketTimeout(socketTimeout);requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimout);return requestConfigBuilder;}).setHttpClientConfigCallback(httpClientBuilder -> {//设置线程数HttpAsyncClientBuilder httpAsyncClientBuilder = httpClientBuilder.setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(20).build());//设置认证信息httpAsyncClientBuilder.setDefaultCredentialsProvider(getCredentialsProvider());return httpAsyncClientBuilder;}));}/*** 鉴权** @return 鉴权配置*/private CredentialsProvider getCredentialsProvider() {CredentialsProvider credentialsProvider = new BasicCredentialsProvider();System.out.println(username);credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));return credentialsProvider;}}
API使用
https://blog.csdn.net/qq_38620956/article/details/102757513
1. 创建Bool复合查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 开启filter过滤// 不分词精确查询boolQuery.filter(QueryBuilders.termQuery("name", name));// range查询boolQuery.filter(QueryBuilders.rangeQuery("time").gte(startTime).lte(endTime));// 不分词 包含其中一个boolQuery.filter(QueryBuilders.termsQuery("clientId", customerNumber数组));
2. 构建查询
// 生成索引List<String> indices = 索引List或数组;// 查询体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 放置bool查询 根据chatTime倒序sourceBuilder.query(boolQuery).sort("chatTime", SortOrder.DESC).from(offset).size(limit);// 查询请求 将list转为数组SearchRequest searchRequest = new SearchRequest(indices.toArray(new String[0]));searchRequest.indicesOptions(IndicesOptions.lenientExpandOpen()).types("索引类型").source(sourceBuilder);
3. 构建聚合
// 根据字段聚合AggregationBuilder dialogCount = AggregationBuilders.terms("聚合名称").field("id").size(300000);// 先 filter 再聚合AggregationBuilder interactionDialogCount =AggregationBuilders.filter(INTERACTION_DIALOG_COUNT, QueryBuilders.rangeQuery(USER_MESSAGE_COUNT).gt(0));// 聚合用户消息数AggregationBuilder userMessageCount =AggregationBuilders.sum("聚合名称").field("id");
4. 使用client请求
try {SearchResponse response =restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = response.getHits();SearchHit[] searchHits = hits.getHits();// 查询结果为空时,返回空的pageDataif (hits.totalHits == 0) {return pageData;}// 遍历查询结果List<Dialog> results = new ArrayList<>();for (SearchHit hit : searchHits) {// 搞成对象Object dialog = JsonUtils.parseObject(hit.getSourceAsString(), Object.class);results.add(dialog);}} catch (IOException e) {log.error("解析发生错误", e);}
查询
- 主键id查询 ```java SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.termsQuery(“_id”, id));
SearchRequest searchRequest = new SearchRequest(); searchRequest.indices(indexName); searchRequest.indicesOptions(IndicesOptions.lenientExpandOpen()); searchRequest.source(builder);
logger.info(builder.toString()); KbArticle result = null; try { SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); SearchHit[] searchHits = hits.getHits(); if (hits.getTotalHits().value == 0) { return result; } // 遍历查询结果 for (SearchHit hit : searchHits) { KbArticle article = objectMapper.readValue(hit.getSourceAsString(), KbArticle.class); article.setId(hit.getId()); result = article; } }
<a name="sI3Vn"></a>## 5. 插入```javapublic Integer documentInsert(String indexName, Map<String, Object> data) {IndexRequest indexRequest = new IndexRequest(indexName, indexName);indexRequest.source(JSON.toJSONString(data), XContentType.JSON);try {rhlClient.index(indexRequest, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return 1;}
6. 更新
public Integer documentUpdate(String indexName, Map<String, Object> data, String id) {UpdateRequest updateRequest = new UpdateRequest(indexName, indexName, id);updateRequest.doc(data);// updateRequest.doc(source, XContentType.JSON);try {UpdateResponse update = rhlClient.update(updateRequest, RequestOptions.DEFAULT);if (update.status() != RestStatus.OK) {throw new IOException();}logger.info("[修改ES];[请求]:{} ; [结果]:{}",updateRequest.toString(), update.toString());} catch (IOException e) {e.printStackTrace();}return 1;}
7. 根据主键删除/ 根据条件删除
public Integer documentDelete(String indexName, String id) {SysTable table = tableMapper.select(tableId);DeleteRequest deleteRequest = new DeleteRequest(indexName, type, id);try {rhlClient.delete(deleteRequest, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return 1;}
批量条件删除
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 添加条件筛选boolQuery.filter(QueryBuilders.termQuery("enterpriseId", enterpriseId));String indexName = EsConst.INDEX_NAME;DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(indexName);deleteByQueryRequest.setConflicts("proceed");deleteByQueryRequest.setQuery(boolQuery);deleteByQueryRequest.setIndicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN);try {BulkByScrollResponse bulkResponse = restHighLevelClient.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);logger.info("[知识库_文档库]-[批量删除ES] ; [结果]:{}", bulkResponse.toString());} catch (IOException e) {logger.error("bulkDeleteArticleError ", e);}
8. 批量插入/删除
public Integer documentBatchInsert(String indenName, List<Map<String, Object>> data) {BulkRequest bulkRequest = new BulkRequest();data.forEach(datum -> {IndexRequest indexRequest = new IndexRequest(indenName, type);indexRequest.source(JSON.toJSONString(datum), XContentType.JSON);bulkRequest.add(indexRequest);});try {rhlClient.bulk(bulkRequest, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return data.size();}
BulkRequest bulkRequest = new BulkRequest();String indexName = "";DeleteRequest deleteRequest = new DeleteRequest().index(indexName).id(id);bulkRequest.add(deleteRequest);logger.info(deleteRequest.toString());BulkResponse bulkResponse = null;try {bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);}
