es的两种查询方式 》要加条数设置不然只能查10条

CriteriaQueryNativeSearchQuery 是 Spring Data Elasticsearch 提供的两种不同的查询构建方式,它们在使用方式和灵活性上有所不同。以下是它们的主要区别和适用场景:

1. CriteriaQuery (类似于mybatisplus)

CriteriaQuery 是 Spring Data Elasticsearch 提供的一种高级查询构建方式,它基于 Spring Data 的 Criteria API,允许你以一种类型安全的方式构建查询条件。CriteriaQuery 通常用于构建复杂的查询条件,尤其是在需要动态构建查询条件时非常方便。

特点:

  • 类型安全:通过 Java 类型系统,确保查询条件的正确性。
  • 动态构建:可以动态地添加查询条件,适合复杂的查询场景。
  • 易于理解和维护:代码更接近于业务逻辑,易于理解和维护。

示例代码:

java复制
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

public class EmpSalaryAttdenceESService {

    private final ElasticsearchRestTemplate elasticsearchRestTemplate;

    public EmpSalaryAttdenceESService(ElasticsearchRestTemplate elasticsearchRestTemplate) {
        this.elasticsearchRestTemplate = elasticsearchRestTemplate;
    }

    public List<SearchHit<EmpSalaryAttdenceES>> getSalary(String payrollId, List<ResponseDTO> responseDTOS) {
        Criteria criteria = new Criteria("id").is(responseDTOS.get(0).getEmpId());
        CriteriaQuery query = new CriteriaQuery(criteria);
        SearchHits<EmpSalaryAttdenceES> search = elasticsearchRestTemplate.search(query, EmpSalaryAttdenceES.class, IndexCoordinates.of(payrollId));
        return search.getSearchHits();
    }
}

2. NativeSearchQuery(mybatis)

NativeSearchQuery 它允许你直接使用 Elasticsearch 的原生查询 DSL(Domain Specific Language)。NativeSearchQuery 通常用于需要使用 Elasticsearch 提供的高级查询功能时,例如复杂的聚合查询、脚本查询等。

特点:

  • 灵活性高:可以直接使用 Elasticsearch 的原生查询 DSL,支持所有 Elasticsearch 查询功能。
  • 性能优化:可以精确控制查询的各个方面,适合性能优化。
  • 复杂查询:适合需要使用 Elasticsearch 高级功能的场景。

示例代码:

java复制
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

public class EmpSalaryAttdenceESService {

    private final ElasticsearchRestTemplate elasticsearchRestTemplate;

    public EmpSalaryAttdenceESService(ElasticsearchRestTemplate elasticsearchRestTemplate) {
        this.elasticsearchRestTemplate = elasticsearchRestTemplate;
    }

    public List<SearchHit<EmpSalaryAttdenceES>> getSalary(String payrollId) {
        NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.matchAllQuery())
                .build();
        SearchHits<EmpSalaryAttdenceES> search = elasticsearchRestTemplate.search(nativeSearchQuery, EmpSalaryAttdenceES.class, IndexCoordinates.of(payrollId));
        return search.getSearchHits();
    }
}

3. 设置查询结果数量

无论是使用 CriteriaQuery 还是 NativeSearchQuery,你都可以通过设置 size 参数来控制返回的结果数量。

使用 CriteriaQuery 设置 size

java复制
Criteria criteria = new Criteria("id").is(responseDTOS.get(0).getEmpId());
CriteriaQuery query = new CriteriaQuery(criteria);
query.setSize(50); // 设置返回结果的数量
SearchHits<EmpSalaryAttdenceES> search = elasticsearchRestTemplate.search(query, EmpSalaryAttdenceES.class, IndexCoordinates.of(payrollId));

使用 NativeSearchQuery 设置 size

java复制
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.matchAllQuery())
        .withPageable(PageRequest.of(0, 50)) // 设置分页参数,从第0页开始,每页50条
        .build();
SearchHits<EmpSalaryAttdenceES> search = elasticsearchRestTemplate.search(nativeSearchQuery, EmpSalaryAttdenceES.class, IndexCoordinates.of(payrollId));

总结

  • CriteriaQuery:适合动态构建查询条件,代码更接近业务逻辑,易于理解和维护。
  • NativeSearchQuery:适合需要使用 Elasticsearch 高级查询功能的场景,灵活性高,性能优化能力强。

如果只是简单的CRUD,CriteriaQuery 更方便;如果需要高级查询(如聚合、高亮、自定义排序等),必须用 NativeSearchQuery

posted @ 2025-02-12 15:48  人在代码在  阅读(121)  评论(0)    收藏  举报