1.5Elasticsearch-レスト-クライアント
1,9300:TCP
Spring-data-elasticsearch:transport-api.jar
SpringBootのバージョンが異なり、transport-api.jarが異なり、esバージョンに適合させることはできません
7.xは使用に適さなくなり、8日後に破棄されます
2、9200:HTTP
JestClientは非公式であり、更新に時間がかかります
RestTemplate:HTTPリクエストはデフォルトで送信され、ESの多くの操作はカプセル化する必要があり面倒です
HttpClient:上記と同じ
Elasticsearch-Rest-Client:ES操作をカプセル化し、明確なAPI階層を持つ公式のRestClient
最後に、Elasticsearch-Rest-Client(elasticsearch-rest-high-level-client)を選択します
1.5.1SpringBootの統合
1、Pom.xml
<!-- 导入es的 rest-high-level-client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>
なぜこれをインポートするのですか?この構成はどこから来たのですか?
公式ウェブサイト:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-maven.html
1.5.2構成構成
/**
* @author gcq
* @Create 2020-10-26
*
* 1、导入配置
* 2、编写配置,给容器注入一个RestHighLevelClient
* 3、参照API 官网进行开发
*/
@Configuration
public class GulimallElasticsearchConfig {
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
// builder.addHeader("Authorization", "Bearer " + TOKEN);
// builder.setHttpAsyncResponseConsumerFactory(
// new HttpAsyncResponseConsumerFactory
// .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}
@Bean
public RestHighLevelClient esRestClient() {
RestClientBuilder builder = null;
builder = RestClient.builder(new HttpHost("192.168.56.10", 9200, "http"));
RestHighLevelClient client = new RestHighLevelClient(builder);
// RestHighLevelClient client = new RestHighLevelClient(
// RestClient.builder(
// new HttpHost("localhost", 9200, "http"),
// new HttpHost("localhost", 9201, "http")));
return client;
}
}
公式ウェブサイト:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-initialization.html
1.5.3使用
注入が成功したかどうかをテストします
@Autowired
private RestHighLevelClient client;
@Test
public void contextLoads() {
System.out.println(client);
}
データを追加または更新できるかどうかをテストします
/**
* 添加或者更新
* @throws IOException
*/
@Test
public void indexData() throws IOException {
IndexRequest indexRequest = new IndexRequest("users");
User user = new User();
user.setAge(19);
user.setGender("男");
user.setUserName("张三");
String jsonString = JSON.toJSONString(user);
indexRequest.source(jsonString,XContentType.JSON);
// 执行操作
IndexResponse index = client.index(indexRequest, GulimallElasticsearchConfig.COMMON_OPTIONS);
// 提取有用的响应数据
System.out.println(index);
}
@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;
}
//检索数据
@Test
public void searchData() throws IOException {
//创建检索请求
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//指定dsl检索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 1.1) 构造检索条件
// sourceBuilder.query();
// sourceBuilder.from();
// sourceBuilder.size();
sourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));
//1.2)按照年龄的值分布进行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
sourceBuilder.aggregation(ageAgg);
//1.3计算平均薪资
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
sourceBuilder.aggregation(balanceAvg);
System.out.println("检索条件:" + sourceBuilder.toString());
searchRequest.source(sourceBuilder);
//执行检索
SearchResponse search = client.search(searchRequest, GulismallElasticSearchConfig.COMMON_OPTIONS);
//3.分析结果
System.out.println(search.toString());
//3.1获取素有查询到的数据
SearchHits hits = search.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
// hit.getIndex();hit.getPrimaryTerm();hit.getId();
Account account = JSON.parseObject(hit.getSourceAsString(), Account.class);
System.out.println("account:" + account);
}
//3.2获取这次检索到的分析信息
Aggregations aggregations = search.getAggregations();
// for (Aggregation aggregation : aggregations.asList()) {
// System.out.println("当前聚合:"+aggregation.getName());
// }
Terms ageAgg1 = aggregations.get("ageAgg");
for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
System.out.println("年龄:" + bucket.getKeyAsString() + "==》" + bucket.getDocCount());
}
Avg balanceAvg1 = aggregations.get("balanceAvg");
balanceAvg1.getValue();
System.out.println("平均薪资:" + balanceAvg1.getValue());
}
kibanaで取得されたSQLは次のとおりです