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