1、导入依赖
这里的版本要和所按照的ELK版本匹配。
1 2 3 4 5
| <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.6.2</version> </dependency>
|
在spring-boot-dependencies中所依赖的ELK版本位6.8.7
1
| <elasticsearch.version>6.8.7</elasticsearch.version>
|
需要在项目中将它改为7.6.2
1 2 3 4
| <properties> ... <elasticsearch.version>7.6.2</elasticsearch.version> </properties>
|
2、编写配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Configuration public class MyElasticConfig {
public static final RequestOptions *COMMON_OPTIONS*; static{ RequestOptions.Builder builder = RequestOptions.*DEFAULT*.toBuilder(); *COMMON_OPTIONS* = builder.build(); }
@Bean public RestHighLevelClient esRestClient(){ RestHighLevelClient restHighLevelClient = new RestHighLevelClient( RestClient.*builder*( new HttpHost("192.168.30.100",9200,"http") ) ); return restHighLevelClient; } }
|
3、编写测试类
1)测试保存数据
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-document-index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Test public void indexData() throws IOException { IndexRequest indexRequest = new IndexRequest ("users");
User user = new User(); user.setUserName("张三"); user.setAge(20); user.setGender("男"); String jsonString = JSON.toJSONString(user); indexRequest.source(jsonString, XContentType.JSON); IndexResponse index = client.index(indexRequest, MyElasticConfig.COMMON_OPTIONS);
System.out.println(index);
}
|
测试前:
测试后:
2)测试获取数据
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-search.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| @Test public void searchData() throws IOException { GetRequest getRequest = new GetRequest( "users", "_-2vAHIB0nzmLJLkxKWk");
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(); } else {
} }
|
查询state=”AK”的文档:
1 2 3 4 5 6 7 8
| GET bank/_search { "query": { "match": { "state": "AK" } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| { "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 22, "relation": "eq" }, "max_score": 3.7952394, "hits": [{ "_index": "bank", "_type": "account", "_id": "210", "_score": 3.7952394, "_source": { "account_number": 210, "balance": 33946, "firstname": "Cherry", "lastname": "Carey", "age": 24, "gender": "M", "address": "539 Tiffany Place", "employer": "Martgo", "email": "cherrycarey@martgo.com", "city": "Fairacres", "state": "AK" } }, .... ] } }
|
搜索address中包含mill的所有人的年龄分布以及平均年龄,平均薪资
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| GET bank/_search { "query": { "match": { "address": "Mill" } }, "aggs": { "ageAgg": { "terms": { "field": "age", "size": 10 } }, "ageAvg": { "avg": { "field": "age" } }, "balanceAvg": { "avg": { "field": "balance" } } } }
|
java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
@Test public void searchData() throws IOException { SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("bank"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchQuery("address","Mill"));
TermsAggregationBuilder ageAgg=AggregationBuilders.terms("ageAgg").field("age").size(10); sourceBuilder.aggregation(ageAgg);
AvgAggregationBuilder ageAvg = AggregationBuilders.avg("ageAvg").field("age"); sourceBuilder.aggregation(ageAvg); AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance"); sourceBuilder.aggregation(balanceAvg);
System.out.println("检索条件:"+sourceBuilder); searchRequest.source(sourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); System.out.println("检索结果:"+searchResponse);
SearchHits hits = searchResponse.getHits(); SearchHit[] searchHits = hits.getHits(); for (SearchHit searchHit : searchHits) { String sourceAsString = searchHit.getSourceAsString(); Account account = JSON.parseObject(sourceAsString, Account.class); System.out.println(account);
}
Aggregations aggregations = searchResponse.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());
}
|
可以尝试对比打印的条件和执行结果,和前面的ElasticSearch的检索语句和检索结果进行比较;
其他
1. kibana控制台命令
ctrl+home:回到文档首部;
ctril+end:回到文档尾部。