五、SpringBoot整合
选择Java High Level REST Client
官方文档:Java REST Client [7.17] | Elastic]
1.基本步骤
导入依赖rest-high-level-client
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>
由于springboot对elasticsearch有默认版本管理,
所以我们修改一下springboot的默认配置
编写配置类
package com.henu.soft.merist.search.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@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(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("IP/localhost", 9200, "http")));
return client;
}
}
2.保存数据
首先导包 用来将数据转成json
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.9</version>
</dependency>
/**
* 测试保存数据
*/
@Test
public void indexData() throws IOException {
//新建一个索引来保存数据
IndexRequest indexRequest = new IndexRequest("games");
indexRequest.id("1");
Game game = new Game();
game.setName("杀戮尖塔");
game.setType("卡牌肉鸽");
game.setGrade(100);
String jsonString = JSON.toJSONString(game);
indexRequest.source(jsonString,XContentType.JSON);
IndexResponse reponse = client.index(indexRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
System.out.println(reponse);
System.out.println(reponse.toString());
}
@Data
class Game{
private String name;
private String type;
private Integer grade;
}
3.测试复杂检索
@Test
public void searchData() throws IOException {
//1.创建检索请求
SearchRequest searchRequest = new SearchRequest();
//2.指定索引
searchRequest.indices("bank");
//3.查询条件构建
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//3.1查询
//各种根操作都能在查询条件种创建
// searchSourceBuilder.from();
// searchSourceBuilder.size();
// searchSourceBuilder.timeout();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//3.2聚合
//按照年龄值分布聚合
TermsAggregationBuilder agaAgg = AggregationBuilders.terms("agaAgg").field("aga").size(10);
searchSourceBuilder.aggregation(agaAgg);
//按照薪资聚合求均值
TermsAggregationBuilder balanceAgg = AggregationBuilders.terms("balanceAgg").field("balance").size(10);
searchSourceBuilder.aggregation(balanceAgg);
//4.组合查询条件
searchRequest.source(searchSourceBuilder);
//5.执行查询
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
//6.解析结果(Hits 和 聚合的值)
//6.1获取所有查到的数据
//拿到外边的hits
SearchHits hits = response.getHits();
//拿到里面的hits
SearchHit[] dataHits = hits.getHits();
for (SearchHit dataHit : dataHits) {
String id = dataHit.getId();
String index = dataHit.getIndex();
float score = dataHit.getScore();
String type = dataHit.getType();
long seqNo = dataHit.getSeqNo();
//也可以直接将返回的json数据转成map输出
Map<String, Object> sourceAsMap = dataHit.getSourceAsMap();
System.out.println(id+"---"+index+"---"+score+"---"+type+"---"+seqNo);
System.out.println(sourceAsMap);
}
System.out.println(response);
}
查询的数据
1---bank------account----2
{account_number=1, firstname=Amber, address=880 Holmes Lane, balance=39225, gender=M, city=Brogan, employer=Pyrami, state=IL, age=32, email=amberduke@pyrami.com, lastname=Duke}
6---bank------account----2
{account_number=6, firstname=Hattie, address=671 Bristol Street, balance=5686, gender=M, city=Dante, employer=Netagy, state=TN, age=36, email=hattiebond@netagy.com, lastname=Bond}
13---bank------account----2
{account_number=13, firstname=Nanette, address=789 Madison Street, balance=32838, gender=F, city=Nogal, employer=Quility, state=VA, age=28, email=nanettebates@quility.com, lastname=Bates}
18---bank------account----2
{account_number=18, firstname=Dale, address=467 Hutchinson Court, balance=4180, gender=M, city=Orick, employer=Boink, state=MD, age=33, email=daleadams@boink.com, lastname=Adams}
20---bank------account----2
{account_number=20, firstname=Elinor, address=282 Kings Place, balance=16418, gender=M, city=Ribera, employer=Scentric, state=WA, age=36, email=elinorratliff@scentric.com, lastname=Ratliff}
25---bank------account----2
{account_number=25, firstname=Virginia, address=171 Putnam Avenue, balance=40540, gender=F, city=Nicholson, employer=Filodyne, state=PA, age=39, email=virginiaayala@filodyne.com, lastname=Ayala}
32---bank------account----2
{account_number=32, firstname=Dillard, address=702 Quentin Street, balance=48086, gender=F, city=Veguita, employer=Quailcom, state=IN, age=34, email=dillardmcpherson@quailcom.com, lastname=Mcpherson}
37---bank------account----2
{account_number=37, firstname=Mcgee, address=826 Fillmore Place, balance=18612, gender=M, city=Tooleville, employer=Reversus, state=OK, age=39, email=mcgeemooney@reversus.com, lastname=Mooney}
44---bank------account----2
{account_number=44, firstname=Aurelia, address=502 Baycliff Terrace, balance=34487, gender=M, city=Yardville, employer=Orbalix, state=DE, age=37, email=aureliaharding@orbalix.com, lastname=Harding}
49---bank------account----2
{account_number=49, firstname=Fulton, address=451 Humboldt Street, balance=29104, gender=F, city=Sunriver, employer=Anocha, state=RI, age=23, email=fultonholt@anocha.com, lastname=Holt}
{"took":62,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":1000,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"bank","_type":"account","_id":"1","_score":1.0,"_source":{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}},{"_index":"bank","_type":"account","_id":"6","_score":1.0,"_source":{"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}},{"_index":"bank","_type":"account","_id":"13","_score":1.0,"_source":{"account_number":13,"balance":32838,"firstname":"Nanette","lastname":"Bates","age":28,"gender":"F","address":"789 Madison Street","employer":"Quility","email":"nanettebates@quility.com","city":"Nogal","state":"VA"}},{"_index":"bank","_type":"account","_id":"18","_score":1.0,"_source":{"account_number":18,"balance":4180,"firstname":"Dale","lastname":"Adams","age":33,"gender":"M","address":"467 Hutchinson Court","employer":"Boink","email":"daleadams@boink.com","city":"Orick","state":"MD"}},{"_index":"bank","_type":"account","_id":"20","_score":1.0,"_source":{"account_number":20,"balance":16418,"firstname":"Elinor","lastname":"Ratliff","age":36,"gender":"M","address":"282 Kings Place","employer":"Scentric","email":"elinorratliff@scentric.com","city":"Ribera","state":"WA"}},{"_index":"bank","_type":"account","_id":"25","_score":1.0,"_source":{"account_number":25,"balance":40540,"firstname":"Virginia","lastname":"Ayala","age":39,"gender":"F","address":"171 Putnam Avenue","employer":"Filodyne","email":"virginiaayala@filodyne.com","city":"Nicholson","state":"PA"}},{"_index":"bank","_type":"account","_id":"32","_score":1.0,"_source":{"account_number":32,"balance":48086,"firstname":"Dillard","lastname":"Mcpherson","age":34,"gender":"F","address":"702 Quentin Street","employer":"Quailcom","email":"dillardmcpherson@quailcom.com","city":"Veguita","state":"IN"}},{"_index":"bank","_type":"account","_id":"37","_score":1.0,"_source":{"account_number":37,"balance":18612,"firstname":"Mcgee","lastname":"Mooney","age":39,"gender":"M","address":"826 Fillmore Place","employer":"Reversus","email":"mcgeemooney@reversus.com","city":"Tooleville","state":"OK"}},{"_index":"bank","_type":"account","_id":"44","_score":1.0,"_source":{"account_number":44,"balance":34487,"firstname":"Aurelia","lastname":"Harding","age":37,"gender":"M","address":"502 Baycliff Terrace","employer":"Orbalix","email":"aureliaharding@orbalix.com","city":"Yardville","state":"DE"}},{"_index":"bank","_type":"account","_id":"49","_score":1.0,"_source":{"account_number":49,"balance":29104,"firstname":"Fulton","lastname":"Holt","age":23,"gender":"F","address":"451 Humboldt Street","employer":"Anocha","email":"fultonholt@anocha.com","city":"Sunriver","state":"RI"}}]},"aggregations":{"lterms#balanceAgg":{"doc_count_error_upper_bound":0,"sum_other_doc_count":985,"buckets":[{"key":22026,"doc_count":2},{"key":23285,"doc_count":2},{"key":36038,"doc_count":2},{"key":39063,"doc_count":2},{"key":45493,"doc_count":2},{"key":1011,"doc_count":1},{"key":1031,"doc_count":1},{"key":1110,"doc_count":1},{"key":1133,"doc_count":1},{"key":1172,"doc_count":1}]},"sterms#agaAgg":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[]}}}