1、创建实例
操作时直接通过注入RestHighLevelClient 即可
@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 getRestHighLevelClient(){
RestClientBuilder builder = null;
//地址-端口-协议
//String hostname, int port, String scheme
builder = RestClient.builder(new HttpHost("192.168.144.201", 9200, "http"));
RestHighLevelClient client = new RestHighLevelClient(builder);
//RestHighLevelClient client = new RestHighLevelClient(
// RestClient.builder(
// new HttpHost("192.168.144.201", 9200, "http")));
return client;
}
}
2、使用索引插入一条记录
/**
* 测试数据添到es
* 更新也可以
* @throws IOException
*/
@Test
public void index() throws IOException {
IndexRequest request = new IndexRequest("users");
request.id("1");
User user = new User();
user.setUserName("guiguixia");
user.setAge(18);
user.setGender("男");
String jsonString = JSON.toJSONString(user);
request.source(jsonString, XContentType.JSON);
IndexResponse index = client.index(request, GulimallElasticSearchConfig.COMMON_OPTIONS);
System.out.println(index);
}
3、直接查询
@Test
public void testSearch() throws IOException {
// 1、构造检索条件
// 1.1)、指定索引
SearchRequest searchRequest = new SearchRequest("bank");
// 1.2)、构造检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//检索条件和命令是一致的,之后将检索条件注入searchRequest
//searchSourceBuilder.from();
//searchSourceBuilder.size();
//searchSourceBuilder.query();
//searchSourceBuilder.aggregations();
// address 字段包含mill单词的
searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
// 查询构造的查询条件
System.out.println(searchSourceBuilder);
// 2、执行检索
searchRequest.source(searchSourceBuilder);
SearchResponse response = client.search(searchRequest,GulimallElasticSearchConfig.COMMON_OPTIONS);
// 3、分析结果
System.out.println(response);
}
4、复杂查询
构建了两个聚合查询
并对返回结果进行处理
@Test
public void testSearch() throws IOException {
// 1、构造检索条件
// 1.1)、指定索引
SearchRequest searchRequest = new SearchRequest("bank");
// 1.2)、构造检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//searchSourceBuilder.from();
//searchSourceBuilder.size();
//searchSourceBuilder.query();
//searchSourceBuilder.aggregations();
searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
// 按年龄的值分布进行检索
TermsAggregationBuilder ageCount = AggregationBuilders.terms("ageCount").field("age").size(10);
// 计算总的平均工资
AvgAggregationBuilder ageCountBalance = AggregationBuilders.avg("ageCountBalance").field("balance");
searchSourceBuilder.aggregation(ageCount);
searchSourceBuilder.aggregation(ageCountBalance);
// 查询构造的查询条件
System.out.println(searchSourceBuilder);
// 2、执行检索
searchRequest.source(searchSourceBuilder);
SearchResponse response = client.search(searchRequest,GulimallElasticSearchConfig.COMMON_OPTIONS);
// 3、分析结果
System.out.println(response);
// 3.1)、获取命中结果
SearchHits hits = response.getHits();
SearchHit[] hits1 = hits.getHits();
for (SearchHit hit : hits1) {
/**
* "_index":"bank",
* "_type":"account",
* "_id":"1",
* "_score":1,
* "_source":
*/
//hit.getId();hit.getIndex();hit.getScore()
String sourceAsString = hit.getSourceAsString();
Account account = JSON.parseObject(sourceAsString, Account.class);
System.out.println("命中的对象:"+account.toString());
}
// 3.2)、获取聚合信息
Aggregations aggregations = response.getAggregations();
Terms ageCount1 = aggregations.get("ageCount");
System.out.println("===================ageCount=================");
for (Terms.Bucket bucket : ageCount1.getBuckets()) {
System.out.println("key:"+ bucket.getKeyAsString()+"===>"+bucket.getDocCount());
}
System.out.println("===================ageCount=================");
Avg ageCountBalance1 = aggregations.get("ageCountBalance");
System.out.println("平均工资:"+ageCountBalance1.getValueAsString());
}