第四章 Java RestClient v1.0
一、初始化
1.引入RestHighLevelClient依赖
xml
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>2.设置ES版本
xml
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.12.1</elasticsearch.version>
</properties>3.初始化RestHighLevelClient
java
RestClientBuilder build = RestClient.builder(HttpHost.create("http://IP:9200")).setRequestConfigCallback(builder -> {
return builder.setConnectTimeout(5000 * 1000) // 连接超时(默认为1秒)
.setSocketTimeout(6000 * 1000);// 套接字超时(默认为30秒)//更改客户端的超时限制默认30秒现在改为100分钟
});
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "password"));
build.setHttpClientConfigCallback((HttpAsyncClientBuilder httpAsyncClientBuilder) -> httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
try(RestHighLevelClient restHighLevelClient = new RestHighLevelClient(build)){
//业务代码
}二、操作索引库
1.创建索引库
java
void createIndex() throws IOException {
// 1. 创建创建的Request对象,参数为索引库名
CreateIndexRequest request = new CreateIndexRequest("test");
// 2. 请求参数,MAPPING_TEMPLATE是静态常量字符串,内容是创建索引库的DSL语句({...})
request.source(MAPPING_TEMPLATE, XContentType.JSON);
// 3. 发起请求 indices()为获取对索引库操作的API create为创建索引库
client.indices().create(request, RequestOptions.DEFAULT);
}2.判断索引库是否存在
java
void existIndex() throws IOException {
// 1. 创建查询的Request对象,参数为索引库名
GetIndexRequest request = new GetIndexRequest("test");
// 2. 发起请求
boolean exist = client.indices().exists(request, RequestOptions.DEFAULT);
}3.删除索引库
java
void deleteIndex() throws IOException {
// 1. 创建删除的Request对象,参数为索引库名
CreateIndexRequest request = new DeleteIndexRequest("test");
// 2. 发起请求
client.indices().delete(request, RequestOptions.DEFAULT);
}三、操作文档
1.新增文档
java
void indexDocument() throws IOException {
// 1. 创建request对象
IndexRequest request = new IndexRequest("indexName").id("1");
// 2. 准备JSON文档(JSON_DOCUMENT,如:"{\"name\":\"Jack\"}")
request.source(JSON_DOCUMENT, XContentType.JSON);
// 3. 发送请求
client.index(request, RequestOptions.DEFAULT);
}2.查询文档
java
void getDocumentById() throws I0Exception {
// 1. 创建request对象
GetRequest request = new GetRequest("indexName", "1");
// 2. 发送请求,得到结果
GetResponse response = client.get(request, RequestOptions.DEFAULT);
// 3. 解析结果(得到的结果为json文档字符串)
String json = response.getSourceAsString();
}3.修改文档
修改文档中,全量更新与新增文档操作一致(再次写入id一样的文档就会覆写旧文档)
java
void updateDocumentById() throws IoException {
// 1. 创建request对象
UpdateRequest request = new UpdateRequest("indexName", "1");
// 2. 准备参数,每2个参数为一对key value
request.doc("age", 18, "name", "Rose");
// 3. 更新文档
client.update(request, RequestOptions.DEFAULT);
}4.删除文档
java
void deleteDocument() throws IOException {
// 1. 创建request对象
DeleteRequest request = new DeleteRequest("indexName").id("1");
// 2. 发送请求
client.delete(request, RequestOptions.DEFAULT);
}5.批量导入数据
java
void bulkDocument() throws IOException {
// 1. 创建Bulk请求
BulkRequest request = new BulkRequest();
// 2. 添加要批量提交的请求
request.add(new IndexRequest("indexName").id("1").source(JSON_DOCUMENT1, XContentType.JSON));
request.add(new IndexRequest("indexName").id("2").source(JSON_DOCUMENT2, XContentType.JSON));
//...
// 3. 发送Bulk请求
client.bulk(request, RequestOptions.DEFAULT);
}一、查询基本流程
1.组织DSL执行查询
java
void matchAll() throws IOException {
// 1.准备SearchRequest,指定索引库名称
SearchRequest request = new SearchRequest("indexName");
// 2.组织DSL参数(一般只修改这个部分)
request.source().query(QueryBuilders.matchAllQuery());
// 3.发送请求,获得相应
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 解析相应结果
}2.解析查询结果
java
void matchAll() throws IOException {
// 执行查询
// 4.解析结果
SearchHits searchHits = response.getHits();
// 查询结果总条数
long total = searchHits.getTotalHits().value;
// 查询结果数组
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits){
//获取json
String json = hit.getSourceAsString();
}
}二、简单查询
1.全文检索查询
java
// 单字段查询
QueryBuilders.matchQuery("查询字段", "查询值")
// 多字段查询
QueryBuilders.multiMatchQuery("查询值", "查询字段1", "查询字段2", ...)2.精确查询
java
// 词条精确查询
QueryBuilders.termQuery("查询字段", "查询值")
// 多检索词查询
QueryBuilders.termsQuery("查询字段", "查询值1", "查询值2", ...)
// 范围查询
QueryBuilders.rangeQuery("查询字段").gte(number) //后方还可以继续跟lte()等3.地理查询
java
三、复合查询
1.算分函数查询
java
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(
QueryBuilders.matchQuery("查询字段", "查询值"),
new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
new FunctionScoreQueryBuilder.FilterFunctionBuilder( //过滤器
QueryBuilders.termQuery("查询字段", "字段值"),
ScoreFunctionBuilders.weightFactorFunction(5) //算分函数
)
}
);2.布尔查询
java
//创建布尔查询
BoolQueryBuilder boolQuery = QueryBuilder.boolQuery();
//添加must条件
boolQuery.must(QueryBuilders.xxxQuery());
//添加filter条件
boolQuery.filter(QueryBuilders.xxxQuery());四、搜索结果处理
1.分页
java
void matchAll() throws IOException {
// 1.准备SearchRequest,指定索引库名称
SearchRequest request = new SearchRequest("indexName");
// 2.组织DSL参数
request.source().query(QueryBuilders.matchAllQuery());
// 分页,指定页索引与页尺寸
request.source().from(0).size(10);
}2.排序
java
void matchAll() throws IOException {
// 1.准备SearchRequest,指定索引库名称
SearchRequest request = new SearchRequest("indexName");
// 2.组织DSL参数
request.source().query(QueryBuilders.matchAllQuery());
// 排序,指定排序字段与排序方法(ASC/DESC)
request.source().sort("排序字段", SortOrder.ASC);
// 地理坐标排序
request.source().sort(SortBuilders
.geoDistanceSort("location",new GeoPoint("经度,纬度"))
.order(SortOrder.ASC)
.unit(DistanceUnit.KILOMETERS)
);
}java
void matchAll() throws IOException {
// 执行查询
// 4.解析结果
SearchHits searchHits = response.getHits();
// 查询结果总条数
long total = searchHits.getTotalHits().value;
// 查询结果数组
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits){
//获取json
String json = hit.getSourceAsString();
//获取排序值
Object[] sortValues = hit.getSortValues();
}
}3.高亮
java
request.source().highlighter(
new HighlightBuildera().fiedld("高亮字段")
.requireFieldMatch(false) //是否需要与查询字段匹配
);java
//获取source,解析到Doc类型
Doc doc = JSON.parseObject(hit.getSourceAsString(), Doc.class) ;
//处理高亮
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
if (!CollectionUtils.isEmpty(highlightFields)) {
//获取高亮字段结果
HighlightField highlightField = highlightFields.get("name");
if (highlightField != null) {
//取出高亮结果数组中的第一个
String name = highlightField.getFragments()[0].string();
//覆盖非高亮结果
doc.setName(name) ;
}
}一、聚合
1.DSL基本构建
java
request.source().size(0); // 设置只取聚合结果
request.source().aggregation(AggregationBuilders
.terms("聚合名称") // 指定聚合方法和聚合名称
.field("聚合字段")
.size(10) // 指定获取的聚合结果值
);2.获取聚合结果
java
// 解析聚合结果
Aggregations aggregations = response.getAggregations();
// 根据名称获取聚合结果
Terms terms = aggregations.get("聚合名称");
// 获取桶
List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
// 遍历
for (Terms.Bucket bucket : buckets) {
String keyName = bucket.getKeyAsString();
}二、自动补全
1.DSL基本构建
java
request.source().suggest(new SuggestBuilder().addSuggestion(
"补全名称", // 名称
SuggestBuilders.completionSuggestion("title")
.prefix("补全字段").skipDuplicates(true).size(10)
))2.获取补全结果
java
Suggest suggest = response.getSuggest();
// 根据名称获取补全结果
CompletionSuggestion suggestion = suggest.getSuggestion("补全名称");
for (CompletionSuggestion.Entry.Option option : suggestion.getOptions()) {
String test = option.getText().string(); // 每个补全结果
}