Skip to content

第四章 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();  // 每个补全结果
}