搭建环境
- IDEA创建一个SpringBoot项目,勾选Spring Web依赖。
- 需要导入的其他依赖
<!--es,版本要和所按照的ELK版本匹配-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
- 配置信息application.properties
# 应用名称
spring.application.name=springboot-es
# 应用服务 WEB 访问端口
server.port=8080
spring.elasticsearch.rest.uris=http://XXX:9200
整合
给容器中注入一个RestHighLeveLClient
参考官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-initialization.html
@Configuration
public class ElasticSearchConfig {
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 RestClient esRestClient(){
RestClient restClient = RestClient.builder(
//new HttpHost("IP地址", 9200, "http"),
new HttpHost("192.10.10.10", 9201, "http")).build();
return restClient;
}
}
对ES进行操作
参考官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/_index_apis.html
- 测试存储数据到es
@SpringBootTest
class SpringbootEsApplicationTests {
@Autowired
private RestHighLevelClient client;
@Test
void createIndex() throws IOException {
//在users索引下存储数据
IndexRequest request = new IndexRequest("users");
//request.id("1");//数据id
User user = new User(1,"高朗","男",18);
String jsonString = JSON.toJSONString(user);//要保存的内容
request.source(jsonString,XContentType.JSON);
//存储操作
IndexResponse index = client.index(request, ElasticSearchConfig.COMMON_OPTIONS);
System.out.println(index);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class User{
private Integer id;
private String name;
private String sex;
private Integer age;
}
}
- 检索
示例一:
GET /bank/_search
{
"query": {
"match_phrase": {
"address": "mill"
}
}
}
@SpringBootTest
class SpringbootEsApplicationTests {
@Autowired
private RestHighLevelClient client;
@Test
void search() throws IOException {
//1. 创建索引请求
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//指定DSL,检索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
/* sourceBuilder.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, ElasticSearchConfig.COMMON_OPTIONS);
System.out.println(search.toString());
}
}
打印信息JSON格式化一下
{
"query": {
"match": {
"address": {
"query": "mill",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1.0
}
}
}
}
{
"took": 1578,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": 5.4032025,
"hits": [
{
"_index": "bank",
"_type": "account",
"_id": "970",
"_score": 5.4032025,
"_source": {
"account_number": 970,
"balance": 19648,
"firstname": "Forbes",
"lastname": "Wallace",
"age": 28,
"gender": "M",
"address": "990 Mill Road",
"employer": "Pheast",
"email": "forbeswallace@pheast.com",
"city": "Lopezo",
"state": "AK"
}
},
{
"_index": "bank",
"_type": "account",
"_id": "136",
"_score": 5.4032025,
"_source": {
"account_number": 136,
"balance": 45801,
"firstname": "Winnie",
"lastname": "Holland",
"age": 38,
"gender": "M",
"address": "198 Mill Lane",
"employer": "Neteria",
"email": "winnieholland@neteria.com",
"city": "Urie",
"state": "IL"
}
},
{
"_index": "bank",
"_type": "account",
"_id": "345",
"_score": 5.4032025,
"_source": {
"account_number": 345,
"balance": 9812,
"firstname": "Parker",
"lastname": "Hines",
"age": 38,
"gender": "M",
"address": "715 Mill Avenue",
"employer": "Baluba",
"email": "parkerhines@baluba.com",
"city": "Blackgum",
"state": "KY"
}
},
{
"_index": "bank",
"_type": "account",
"_id": "472",
"_score": 5.4032025,
"_source": {
"account_number": 472,
"balance": 25571,
"firstname": "Lee",
"lastname": "Long",
"age": 32,
"gender": "F",
"address": "288 Mill Street",
"employer": "Comverges",
"email": "leelong@comverges.com",
"city": "Movico",
"state": "MT"
}
}
]
}
}
示例二:
GET /bank/_search
{
"query": {
"match_phrase": {
"address": "mill"
}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
}
},
"balanceAgg": {
"avg": {
"field": "balance"
}
}
},
"size": 0
}
@SpringBootTest
class SpringbootEsApplicationTests {
@Autowired
private RestHighLevelClient client;
@Test
void search() throws IOException {
//1. 创建索引请求
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//指定DSL,检索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
//按照年龄的值分布进行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
sourceBuilder.aggregation(ageAgg);
//计算平均薪资
AvgAggregationBuilder balanceAgg = AggregationBuilders.avg("balanceAgg").field("balance");
sourceBuilder.aggregation(balanceAgg);
sourceBuilder.size(0);
System.out.println(sourceBuilder.toString());
searchRequest.source(sourceBuilder);
//2. 执行检索
SearchResponse search = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
System.out.println(search.toString());
}
}
{
"size": 0,
"query": {
"match": {
"address": {
"query": "mill",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1.0
}
}
},
"aggregations": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [
{
"_count": "desc"
},
{
"_key": "asc"
}
]
}
},
"balanceAgg": {
"avg": {
"field": "balance"
}
}
}
}
{
"took": 355,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": null,
"hits": [
]
},
"aggregations": {
"lterms#ageAgg": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 38,
"doc_count": 2
},
{
"key": 28,
"doc_count": 1
},
{
"key": 32,
"doc_count": 1
}
]
},
"avg#balanceAgg": {
"value": 25208.0
}
}
}
我们可以把检索到的数据保存到Map集合中,通过key取自己想要的信息
Map map = JSON.parseObject(search.toString(), Map.class);
但是检索到的信息中最重要的是hits和aggregations里面的信息怎样直接获取:
@SpringBootTest
class SpringbootEsApplicationTests {
@Autowired
private RestHighLevelClient client;
@Test
void search() throws IOException {
//1. 创建索引请求
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//指定DSL,检索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
//按照年龄的值分布进行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
sourceBuilder.aggregation(ageAgg);
//计算平均薪资
AvgAggregationBuilder balanceAgg = AggregationBuilders.avg("balanceAgg").field("balance");
sourceBuilder.aggregation(balanceAgg);
//System.out.println(sourceBuilder.toString());
searchRequest.source(sourceBuilder);
//2. 执行检索
SearchResponse search = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
//System.out.println(search.toString());
//Map map = JSON.parseObject(search.toString(), Map.class);
//Hits信息
//第一个大Hits里面
SearchHits searchHits = search.getHits();
//获取hits
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
//转换成String对象
String sourceAsString = hit.getSourceAsString();
//String转Acount对象
Acount acount = JSON.parseObject(sourceAsString, Acount.class);
System.out.println(acount.toString());
}
//分析信息Aggregations
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 balanceAvg = aggregations.get("balanceAgg");
System.out.println("平均工资:"+balanceAvg.getValue());
}
@Data
@ToString
static class Acount {
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;
}
}
打印信息:
SpringbootEsApplicationTests.Acount(account_number=970, balance=19648, firstname=Forbes, lastname=Wallace, age=28, gender=M, address=990 Mill Road, employer=Pheast, email=forbeswallace@pheast.com, city=Lopezo, state=AK)
SpringbootEsApplicationTests.Acount(account_number=136, balance=45801, firstname=Winnie, lastname=Holland, age=38, gender=M, address=198 Mill Lane, employer=Neteria, email=winnieholland@neteria.com, city=Urie, state=IL)
SpringbootEsApplicationTests.Acount(account_number=345, balance=9812, firstname=Parker, lastname=Hines, age=38, gender=M, address=715 Mill Avenue, employer=Baluba, email=parkerhines@baluba.com, city=Blackgum, state=KY)
SpringbootEsApplicationTests.Acount(account_number=472, balance=25571, firstname=Lee, lastname=Long, age=32, gender=F, address=288 Mill Street, employer=Comverges, email=leelong@comverges.com, city=Movico, state=MT)
年龄:38 2
年龄:28 1
年龄:32 1
平均工资:25208.0