1、配置
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
配置日志输出实际的DSL查询语句:
logging:
level:
org.springframework.data.elasticsearch.client.WIRE: trace
配置High Level REST Client
:
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
@Override
public RestHighLevelClient elasticsearchClient() {
return RestClients.create(ClientConfiguration.localhost()).rest();
}
}
2、使用Repository进行数据操作
实体类:
@Data
@Document(indexName = "smart_phone")
public class SmartPhone {
@Id
private String id;
@Field(type = FieldType.Keyword)
private String brand;
@Field(type = FieldType.Text)
private String type;
@Field(type = FieldType.Double)
private Double price;
@Field(type = FieldType.Text)
private String desc;
@Field(type = FieldType.Date, format = DateFormat.basic_date_time_no_millis)
private LocalDateTime saleTime;
}
Repository:
@Repository
public interface SmartPhoneRepository extends ElasticsearchRepository<SmartPhone, String> {
List<SmartPhone> findBySaleTimeBetween(LocalDateTime start,LocalDateTime end);
@Query("{\"match\": {\"type\": {\"query\": \"?0\"}}}")
Page<SmartPhone> findByType(String type, Pageable pageable);
}
测试:
@Autowired
SmartPhoneRepository smartPhoneRepository;
@Test
void repositoryTest() {
Iterable<SmartPhone> all = smartPhoneRepository.findAll();
System.out.println("所有数据");
all.forEach(e -> {
System.out.println(e.toString());
});
LocalDateTime start = LocalDateTime.now().minusDays(10);
LocalDateTime end = LocalDateTime.now().minusHours(2);
List<SmartPhone> bySaleTimeBetween = smartPhoneRepository.findBySaleTimeBetween(start, end);
System.out.println("十天内的数据");
bySaleTimeBetween.forEach(e -> {
System.out.println(e.toString());
});
Page<SmartPhone> byType = smartPhoneRepository.findByType("MI10 Utral", PageRequest.of(0, 10));
System.out.println("包含MI10 Utral的数据");
byType.getContent().forEach(e -> {
System.out.println(e.toString());
});
}
3、使用ElasticsearchRestTemplate
@Autowired
ElasticsearchRestTemplate esRestTemplate;
@Test
void esRestTemplateTest() {
//简单查询
SearchHits<SmartPhone> smartPhoneSearchHits = esRestTemplate.search(
new NativeSearchQueryBuilder().withQuery(
QueryBuilders.matchQuery("type", "K30 Utral")
).build(),
SmartPhone.class);
System.out.println("matchQuery:K30 Utral");
smartPhoneSearchHits.getSearchHits().forEach(e -> {
System.out.println(e.getContent().toString());
});
smartPhoneSearchHits = esRestTemplate.search(
new NativeSearchQueryBuilder().withQuery(
QueryBuilders.matchPhraseQuery("type", "K30 Utral")
).build(),
SmartPhone.class);
System.out.println("matchPhrase:K30 Utral");
smartPhoneSearchHits.getSearchHits().forEach(e -> {
System.out.println(e.getContent().toString());
});
// 聚合查询
smartPhoneSearchHits = esRestTemplate.search(
new NativeSearchQueryBuilder().addAggregation(
AggregationBuilders.avg("avg_price").field("price")).build(),
SmartPhone.class);
ParsedAvg parsedAvg = smartPhoneSearchHits.getAggregations().get("avg_price");
System.out.println("平均价格");
System.out.println(parsedAvg.getValue());
smartPhoneSearchHits = esRestTemplate.search(
new NativeSearchQueryBuilder().addAggregation(
AggregationBuilders.terms("brand_agg").field("brand")
.subAggregation(AggregationBuilders.avg("avg_price").field("price"))
).build(),
SmartPhone.class);
ParsedStringTerms brand_agg = smartPhoneSearchHits.getAggregations().get("brand_agg");
//获取桶
List<? extends Terms.Bucket> buckets = brand_agg.getBuckets();
//遍历输出
buckets.forEach(bucket -> {
ParsedAvg temp = bucket.getAggregations().get("avg_price");
System.out.println("brand:" + bucket.getKeyAsString());
System.out.println("count:" + bucket.getDocCount());
System.out.println("avg_price:" + temp.getValue());
});
}
4、使用RestHighLevelClient
@Autowired
RestHighLevelClient highLevelClient;
@Test
void highLevelClientTest() throws IOException {
SearchRequest searchRequest = new SearchRequest();
searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.queryStringQuery("K30 Utral").field("type")));
SearchResponse search = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
System.out.println("query_string:K30 Utral");
System.out.println(Arrays.toString(search.getHits().getHits()));
searchRequest = new SearchRequest();
searchRequest.source(new SearchSourceBuilder().aggregation(AggregationBuilders.avg("avg_price").field("price")));
search = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
ParsedAvg parsedAvg = search.getAggregations().get("avg_price");
System.out.println("avg_price");
System.out.println(parsedAvg.getValue());
searchRequest = new SearchRequest();
searchRequest.source(new SearchSourceBuilder().aggregation(
AggregationBuilders.terms("brand_agg").field("brand")
.subAggregation(AggregationBuilders.avg("avg_price").field("price"))
));
search = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
ParsedStringTerms brand_agg = search.getAggregations().get("brand_agg");
//获取桶
List<? extends Terms.Bucket> buckets = brand_agg.getBuckets();
//遍历输出
buckets.forEach(bucket -> {
ParsedAvg temp = bucket.getAggregations().get("avg_price");
System.out.println("brand:" + bucket.getKeyAsString());
System.out.println("count:" + bucket.getDocCount());
System.out.println("avg_price:" + temp.getValue());
});
}
5、文档
Spring Data Elasticsearch:https://docs.spring.io/spring-data/elasticsearch/docs/4.0.4.RELEASE/reference/html/
Java High Level REST Client:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.x/java-rest-high.html