es的两种查询方式 》要加条数设置不然只能查10条
CriteriaQuery 和 NativeSearchQuery 是 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。

浙公网安备 33010602011771号