https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html
01.引入依赖
2.3.7
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.4.2</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>cn.sgy</groupId>
<artifactId>sgymall-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
02.配置类
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LemeiElasticSearchConfig {
@Bean
public RestHighLevelClient esRestClient(){
RestClientBuilder restClientBuilder;
RestHighLevelClient client=new RestHighLevelClient(RestClient.builder(new HttpHost("216.127.*.*",9200,"http")));
return client;
}
}
03.application.yml
spring:
application:
name: sgymall-search
cloud:
nacos:
discovery:
server-addr: 216.127.*.*:8848
04.测试类
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class SgymallSearchApplication {
public static void main(String[] args) {
SpringApplication.run(SgymallSearchApplication.class, args);
}
}
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SgymallSearchApplicationTests {
@Autowired
RestHighLevelClient client;
@Test
void contextLoads() {
System.out.println(client);
}
}
05.功能
1.创建索引,查询,聚合,分析,查单个
import cn.sgy.sgymallsearch.config.LemeiElasticSearchConfig;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.ToString;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
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.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
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.aggregations.metrics.Avg;
import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.ws.rs.GET;
import java.io.IOException;
import java.util.Map;
@SpringBootTest
class SgymallSearchApplicationTests {
@Data
class User{
private int age;
private String username;
private String gender;
}
@ToString
@Data
static class Account {
private int account_number;
private int balance;
private String firstname;
private String lastname;
private int age;
private String gender;
private String address;
private String employer;
private String email;
private String city;
private String state;
}
@Autowired
RestHighLevelClient client;
// GET user/_search
@Test //
public void createIndex() throws IOException {
IndexRequest request = new IndexRequest("user");
// 数据id
request.id("1");
request.source("userName","张三");
User user = new User();
user.setUsername("张三2");
user.setAge(18);
user.setGender("男");
String jsonString = JSON.toJSONString(user);
request.source(jsonString, XContentType.JSON);//要保存的数据
IndexResponse index = client.index(request, LemeiElasticSearchConfig.COMMON_OPTIONS);
System.out.println(index);
}
@Test
public void searchData() throws IOException {
//1、创建检索请求
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//指定DsL,检索条件
// SearchSourceBuiLder sourceBuiLde
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//1.1)、构造检索条件
//sounceBuiLder.query ();
//sourceBuiLder.from();
//sourceBuiLder.size();
//sourceBuiLder.aggregation(
sourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));
System.out.println(sourceBuilder.toString());
searchRequest.source(sourceBuilder);
// 2、执行检索
SearchResponse search = client.search(searchRequest, LemeiElasticSearchConfig.COMMON_OPTIONS);
//3、分析结果
System.out.println(search.toString());
}
// 聚合
@Test
public void searchDataAgg() throws IOException {
//1、创建检索请求
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//指定DsL,检索条件
// SearchSourceBuiLder sourceBuiLde
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//1.1)、构造检索条件
//sounceBuiLder.query ();
//sourceBuiLder.from();
//sourceBuiLder.size();
//sourceBuiLder.aggregation(
sourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));
//聚合
1.2)、按照年龄的值分布进行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age");
sourceBuilder.aggregation(ageAgg);
1.3)、计算平均薪资
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
sourceBuilder.aggregation(balanceAvg);
System.out.println("检索条件:"+sourceBuilder.toString());
searchRequest.source(sourceBuilder);
// 2、执行检索
SearchResponse search = client.search(searchRequest, LemeiElasticSearchConfig.COMMON_OPTIONS);
//3、分析结果
System.out.println(search.toString());
}
@Test
public void searchDataAnki() throws IOException {
//1、创建检索请求
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//指定DsL,检索条件
// SearchSourceBuiLder sourceBuiLde
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//1.1)、构造检索条件
//sounceBuiLder.query ();
//sourceBuiLder.from();
//sourceBuiLder.size();
//sourceBuiLder.aggregation(
sourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));
//聚合
1.2)、按照年龄的值分布进行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age");
sourceBuilder.aggregation(ageAgg);
1.3)、计算平均薪资
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
sourceBuilder.aggregation(balanceAvg);
System.out.println("检索条件:"+sourceBuilder.toString());
searchRequest.source(sourceBuilder);
// 2、执行检索
SearchResponse search = client.search(searchRequest, LemeiElasticSearchConfig.COMMON_OPTIONS);
//3、分析结果
System.out.println(search.toString());
// Map map=JSON. parseObject(searchResponse. toString(), Map.class);
//3.1)、获取所有查到的数据
SearchHits hits = search.getHits( );
SearchHit[] searchHits = hits. getHits();
for (SearchHit hit : searchHits) {
// hit.getType();
// hit.getSourceAsMap()
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
Account account = JSON.parseObject(sourceAsString, Account.class);
System.out.println(account);
}
//3.2)、获取这次检索到的分析信息:
Aggregations aggregations = search.getAggregations();
Terms ageAgg1 = aggregations.get("ageAgg");
for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
String keyAsString = bucket.getKeyAsString();
System.out.println("年龄:"+keyAsString+" ==> "+bucket.getDocCount());
}
/* Avg ageAvg1 = aggregations.get("ageAvg");
System.out.println("平均年龄:"+ageAvg1.getValue());
Avg balanceAvg1 = aggregations.get("balanceAvg");
System.out.println("平均薪资:"+balanceAvg1.getValue());*/
// 指定索引信息
GetRequest getRequest = new GetRequest(
"bank",
"100");
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse);
String index = getResponse.getIndex();
System.out.println(index);
String id = getResponse.getId();
System.out.println(id);
if (getResponse.isExists()) {
long version = getResponse.getVersion();
System.out.println(version);
String sourceAsString = getResponse.getSourceAsString();
System.out.println(sourceAsString);
Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
System.out.println(sourceAsMap);
byte[] sourceAsBytes = getResponse.getSourceAsBytes();
}
}
}
2. 批量添加
/**
* bulk批量添加
*/
public static void batchAddDocuments(){
try {
RestHighLevelClient client = getClient();
Map<String, Object> jsonMap = new HashMap<String, Object>();
jsonMap.put("id", "01209");
jsonMap.put("title", "紅樓夢");
jsonMap.put("author", "曹雪芹");
jsonMap.put("classification", "小說");
IndexRequest request = new IndexRequest("book")
.id("2").source(jsonMap);
jsonMap.put("id", "01210");
jsonMap.put("title", "水滸傳");
jsonMap.put("author", "施耐庵");
jsonMap.put("classification", "小說");
IndexRequest request1 = new IndexRequest("book")
.id("3").source(jsonMap);
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(request);
bulkRequest.add(request1);
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
for (BulkItemResponse bulkItemResponse : bulkResponse) {
DocWriteResponse itemResponse = bulkItemResponse.getResponse();
switch (bulkItemResponse.getOpType()) {
case INDEX:
break;
case CREATE:
IndexResponse indexResponse = (IndexResponse) itemResponse;
System.out.println("新增文档成功!");
break;
case UPDATE:
UpdateResponse updateResponse = (UpdateResponse) itemResponse;
System.out.println("更新文档成功!");
break;
case DELETE:
DeleteResponse deleteResponse = (DeleteResponse) itemResponse;
System.out.println("删除文档成功!");
break;
default:
}
}
client.close();
}catch (Exception e){
e.printStackTrace();
}
}
3.根据索引id删除
/**
* 根据索引id删除
*/
public static void deleteDocument(){
try {
RestHighLevelClient client = getClient();
DeleteRequest request = new DeleteRequest(
"ancientbook",
"2607");
DeleteResponse deleteResponse = client.delete(
request, RequestOptions.DEFAULT);
System.out.println(deleteResponse.getResult());
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}