JAVA 集成 ElasticSearch
目录
ElasticSearch Client
Java REST Client
Dependencies
Initialization
RequestOptions
测试
ElasticSearch Client
9300端口 :TCP协议,性能较高,ES集群内部节点之间通过9300进行通讯。
- Java Transport Client (7.x 已废弃)
- Spring Data Elasticsearch
9200端口:HTTP协议,通过http请求和ES进行交互。跨语言兼容性好,易于调试。
- Java REST Client (8.x 已废弃)
- Java Client (active)
- 其他HttpClient,模拟发送http请求
Java REST Client
谷粒商城 ES 7.4.2 仅支持 Java REST Client ,之后若有需要 再进行重构
Dependencies
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>
由于spring-boot-dependencies中<elasticsearch.version>有默认值,为避免冲突,应手动指定版本
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
<elasticsearch.version>7.4.2</elasticsearch.version>
</properties>
Initialization
- 给容器中注入一个 RestHighLevelClient
@Configuration
public class GulimallElasticSearchConfig {
@Value("${search.host.address}")
private String hostName;
@Bean
public RestHighLevelClient esRestClient() {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost(hostName, 9200, "http")
)
);
return client;
}
}
GulimallSearchApplicationTests中注入的RestHighLevelClient NotNull即可
RequestOptions
RequestOptions
主要用于:
-
共享配置:在多个请求之间共享相同的配置(如认证信息、超时设置等)。
-
简化代码:避免在每个请求中重复设置相同的参数。
-
提高性能:通过复用配置,减少不必要的对象创建和内存开销。
private 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();
}
测试
- Index API
source 可以以4种方式提供,即 Json字符串,map,XContentBuilder 或 键值对
@Autowired
private RestHighLevelClient esRestClient;
@Test
public void indexApi() throws IOException {
//索引名
IndexRequest request = new IndexRequest("user");
request.id("1");
User user=new User();
user.setName("asuka");user.setAge("18");user.setGender("女");
String userJson= JSON.toJSONString(user);
request.source(userJson, XContentType.JSON);
//同步请求
IndexResponse indexResponse = esRestClient.index(request, GulimallElasticSearchConfig.COMMON_OPTIONS);
System.out.println(indexResponse);
}
@Data
class User{
private String name;
private String age;
private String gender;
}
- Search API
SearchSourceBuilder:DSL根操作,如query,aggregations,from,size等
@Autowired
private RestHighLevelClient esRestClient;
@Test
public void searchApi() throws IOException {
SearchRequest searchRequest = new SearchRequest("my_bank");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
searchSourceBuilder.size(5);
//求平均薪资
AggregationBuilder avgBalance= AggregationBuilders.avg("avgBalance").field("balance");
searchSourceBuilder.aggregation(avgBalance);
//依据年龄分组
AggregationBuilder byAgeAggregationBuilder= AggregationBuilders.terms("by_age").field("age");
searchSourceBuilder.aggregation(byAgeAggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = esRestClient.search(searchRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
System.out.println(searchResponse);
SearchHits hits= searchResponse.getHits();
for (SearchHit hit : hits.getHits()) {
System.out.println(hit);//也可通过JSON.parseObject() 转换为 对象
}
//获取聚合信息
Aggregations aggregations = searchResponse.getAggregations();
//依据名字取出各聚合
Avg balanceAvg = aggregations.get("avgBalance");
System.out.println("平均薪资: " + balanceAvg.getValue());
Terms byAgeAggregation = aggregations.get("by_age");
for (Terms.Bucket bucket: byAgeAggregation.getBuckets()) {
System.out.println("年龄 :" +bucket.getKey()+ " 数量:"+ bucket.getDocCount());
}
}