JavaRest 高级客户端简介
elasticsearch 存在三种Java客户端。
1. Transport Client
2. Java Low Level Rest Client(低级rest客户端)
3. Java High Level REST Client(高级rest客户端)
这三者的区别是:
TransportClient没有使用RESTful风格的接口,而是二进制的方式传输数据。
ES官方推出了Java Low Level REST Client,它支持RESTful。但是缺点是因为
TransportClient的使用者把代码迁移到Low Level REST Client的工作量比较大。
ES官方推出Java High Level REST Client,它是基于Java Low Level REST Client的封
装,并且API接收参数和返回值和TransportClient是一样的,使得代码迁移变得容易
并且支持了RESTful的风格,兼容了这两种客户端的优点。强烈建议ES5及其以后的
版本使用Java High Level REST Client。
准备工作:新建工程,引入依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch‐rest‐high‐level‐client</artifactId>
<version>6.5.3</version>
</dependency>
package demo;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.apache.http.HttpHost;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class test {
/**
* 新增和修改数据
* 插入单条数据:
* HttpHost : url地址封装
* RestClientBuilder: rest客户端构建器
* RestHighLevelClient: rest高级客户端
* IndexRequest: 新增或修改请求
* IndexResponse:新增或修改的响应结果
* 如果ID不存在则新增,如果ID存在则修改
*
* 批处理请求:
* BulkRequest: 批量请求(用于增删改操作)
* BulkResponse:批量请求(用于增删改操作)
* @throws IOException
*/
@Test
public void test1() throws IOException {
// 1. 连接rest接口
HttpHost http = new HttpHost("127.0.0.1", 9200, "http");
RestClientBuilder builder = RestClient.builder(http);//rest构建器
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);// 高级客户端对象
// 2.封装请求对象
IndexRequest indexRequest = new IndexRequest("sku", "doc", "3");
Map skuMap = new HashMap();
skuMap.put("name", "华为p30pro");
skuMap.put("brandName", "华为");
skuMap.put("categoryName", "手机");
skuMap.put("price", 1010221);
skuMap.put("createTime", "2019-05-01");
skuMap.put("saleNum", 101021);
skuMap.put("commentNum", 10102321);
Map spec = new HashMap();
spec.put("网络制式", "移动4G");
spec.put("屏幕尺寸", "5");
skuMap.put("spec", spec);
indexRequest.source(skuMap);
// 3 .获取响应结果
IndexResponse response = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
int status = response.status().getStatus();
System.out.println(status);
restHighLevelClient.close();
}
/**
* 匹配查询
* SearchRequest: 查询请求对象
* SearchResponse:查询响应对象
* SearchSourceBuilder:查询源构
* MatchQueryBuilder:匹配查询构
* @throws IOException
*/
@Test
public void test2() throws IOException {
// 1. 连接rest接口
HttpHost http = new HttpHost("127.0.0.1", 9200, "http");
RestClientBuilder builder = RestClient.builder(http);//rest构建器
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);// 高级客户端对象
// 2.封装请求对象
SearchRequest searchRequest = new SearchRequest("sku");
searchRequest.types("doc");// 设置查询类型
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "华为");
searchSourceBuilder.query(matchQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 3 .获取响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
long totalHits = searchHits.getTotalHits();
System.out.println("总记录数:" + totalHits);
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
String source = hit.getSourceAsString();
System.out.println(source);
}
restHighLevelClient.close();
}
/**
* 布尔与词条查询
* BoolQueryBuilder:布尔查询构建器
* TermQueryBuilder:词条查询构建器
* QueryBuilders:查询构建器工厂
* @throws IOException
*/
@Test
public void test3() throws IOException {
// 1. 连接rest接口
HttpHost http = new HttpHost("127.0.0.1", 9200, "http");
RestClientBuilder builder = RestClient.builder(http);//rest构建器
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);// 高级客户端对象
// 2.封装请求对象
SearchRequest searchRequest = new SearchRequest("sku");
searchRequest.types("doc");// 设置查询类型
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();// 布尔查询构建器
// 匹配查询
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "手机");
boolQueryBuilder.must(matchQueryBuilder);
// 词条查询
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("brandName", "华为");
boolQueryBuilder.must(termQueryBuilder);
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 3 .获取响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
long totalHits = searchHits.getTotalHits();
System.out.println("总记录数:" + totalHits);
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
String source = hit.getSourceAsString();
System.out.println(source);
}
restHighLevelClient.close();
}
/**
* 过滤查询
* @throws IOException
*/
@Test
public void test4() throws IOException {
// 1. 连接rest接口
HttpHost http = new HttpHost("127.0.0.1", 9200, "http");
RestClientBuilder builder = RestClient.builder(http);//rest构建器
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);// 高级客户端对象
// 2.封装请求对象
SearchRequest searchRequest = new SearchRequest("sku");
searchRequest.types("doc");// 设置查询类型
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();// 布尔查询构建器
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "华为");
boolQueryBuilder.filter(matchQueryBuilder);
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 3 .获取响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
long totalHits = searchHits.getTotalHits();
System.out.println("总记录数:" + totalHits);
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
String source = hit.getSourceAsString();
System.out.println(source);
}
restHighLevelClient.close();
}
/**
* 分组(聚合)查询
* AggregationBuilders:聚合构建器工厂
* TermsAggregationBuilder:词条聚合构建器
* Aggregations:分组结果封装
* Terms.Bucket: 桶
* @throws IOException
*/
@Test
public void test5() throws IOException {
// 1. 连接rest接口
HttpHost http = new HttpHost("127.0.0.1", 9200, "http");
RestClientBuilder builder = RestClient.builder(http);//rest构建器
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);// 高级客户端对象
// 2.封装请求对象
SearchRequest searchRequest = new SearchRequest("sku");
searchRequest.types("doc");// 设置查询类型
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("sku_category").field("categoryName");
searchSourceBuilder.aggregation(termsAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.source(searchSourceBuilder);
// 3 .获取响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = searchResponse.getAggregations();
Map<String, Aggregation> asMap = aggregations.getAsMap();
Terms terms =(Terms) asMap.get("sku_category");
List<? extends Terms.Bucket> buckets = terms.getBuckets();
for (Terms.Bucket bucket : buckets) {
System.out.println(bucket.getKeyAsString()+":"+bucket.getDocCount());
}
restHighLevelClient.close();
}
}