ElasticsearchRestTemplate的简单使用

前言

ElasticsearchRestTemplate是在springboot项目中使用elasticsearch资源的主要操作类。

依赖引入

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置文件

spring:
  elasticsearch:
    rest:
      uris: http://127.0.0.1:9200
      username: elastic
      password: elastic

注意,如果es资源没有开启x-pack安全插件的话,可以不加username和password(因为默认是没有的)。

简单使用

查询

@RestController
@AllArgsConstructor
@RequestMapping("/es")
public class DemoController {

    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    /**
     * 简单查询
     *
     * @return 命中的数据
     */
    @GetMapping("/list")
    public List<ListDetailDTO> list() {
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
                .filter(QueryBuilders.rangeQuery("receivedAt").from(0L).to(1657623337718L))
                // .filter(QueryBuilders.termQuery("list.month", "202204"))
                .filter(QueryBuilders.fuzzyQuery("_class", "dto"))
        ;
        NativeSearchQuery build = new NativeSearchQueryBuilder()
                .withQuery(queryBuilder)
                .withPageable(PageRequest.of(1, 2))
                .build();

        SearchHits<ListDetailDTO> hits = elasticsearchRestTemplate.search(build, ListDetailDTO.class, IndexCoordinates.of("detail"));
        if (CollectionUtil.isNotEmpty(hits.getSearchHits())) {
            return hits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
        }
        return null;
    }

    /**
     * 极值查询
     *
     * @return 极值
     */
    @GetMapping("/analyze")
    public SearchHits<ListDetailDTO> analyze() {
        // 极值聚合查询
        AvgAggregationBuilder avgBuilder = AggregationBuilders.avg("avg").field("list.water");
        MaxAggregationBuilder maxBuilder = AggregationBuilders.max("max").field("list.water");
        MinAggregationBuilder minBuilder = AggregationBuilders.min("min").field("list.water");
        // 范围查询
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery("receivedAt").from(0L).to(1657723337718L));
        // 拼接
        NativeSearchQuery build = new NativeSearchQueryBuilder()
                .addAggregation(avgBuilder)
                .addAggregation(maxBuilder)
                .addAggregation(minBuilder)
                .withQuery(queryBuilder)
                // 因为这个方法是范围查询并求极值,并不需要命中的数据,但是如果不加分页参数会返回所有命中的数据,注意,这里的size最小值不能为0
                .withPageable(PageRequest.of(0, 1))
                .build();
        return elasticsearchRestTemplate.search(build, ListDetailDTO.class, IndexCoordinates.of("detail"));
    }
}

分页查询只返回10000条数据问题解决

es官方默认限制索引查询最多只能查询10000条数据,查询第10001条数据开始就会报错:
Result window is too large, from + size must be less than or equal to
但是很多时候10000数据不能满足项目的需求,所以我们就要解除这个限制。
首先,修改es配置放开这个限制

PUT /index_name/_settings
{
  "index.max_result_window": "20000000"
}

接着,在使用elasticsearchRestTemplate的时候还需要设置两个参数

NativeSearchQuery build = new NativeSearchQueryBuilder().build();
build.setTrackTotalHits(true); // 设置返回真实命中的数量
build.setMaxResults(2000000); // 设置返回最大结果数
posted @ 2022-07-22 17:18  大唐冠军侯  阅读(3367)  评论(0)    收藏  举报