spring-data-elasticsearch 페이지 조회
7005 단어 ElasticSearch
@Test
public void testQueryPage() {
QueryBuilder orderQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("orderType", "RO"));
Page page = orderRepository.search(orderQuery, PageRequest.of(0, 1));
System.out.println(page);
page = orderRepository.search(orderQuery, PageRequest.of(1, 1));
System.out.println(page);
}
부록:
1. 이름에서 알 수 있듯이QueryBuilder는 검색 조건, 필터 조건을 구축하는 데 사용되고 SortBuilder는 정렬을 구축하는 데 사용된다.
예를 들어 우리는 어느 위치에서 100미터 범위 내의 모든 사람을 조회하고 거리에 따라 정렬해야 한다.
double lat = 39.929986;
double lon = 116.395645;
Long nowTime = System.currentTimeMillis();
// 100
GeoDistanceQueryBuilder builder = QueryBuilders.geoDistanceQuery("address").point(lat, lon)
.distance(100, DistanceUnit.METERS);
GeoDistanceSortBuilder sortBuilder = SortBuilders.geoDistanceSort("address")
.point(lat, lon)
.unit(DistanceUnit.METERS)
.order(SortOrder.ASC);
Pageable pageable = new PageRequest(0, 50);
NativeSearchQueryBuilder builder1 = new NativeSearchQueryBuilder().withFilter(builder).withSort(sortBuilder).withPageable(pageable);
SearchQuery searchQuery = builder1.build();
2、 질의 결과 세트 크기 제한
Spring Data는 개발자가first와 top 키워드를 사용하여 되돌아오는 검색 결과 집합의 크기를 제한할 수 있도록 합니다.fisrt와 top는 되돌아오는 결과 집합의 최대 크기를 나타내는 숫자를 따라야 합니다.숫자를 따르지 않으면 결과 집합의 크기는 기본적으로 1입니다.
Example 8.Limiting the result size of query with Top and First(first와 top을 이용하여 되돌아오는 결과 집합의 크기를 제한함)User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc(); Page queryFirst10ByLastname(String lastname, Pageable pageable); Slice findTop3ByLastname(String lastname, Pageable pageable); List findFirst10ByLastname(String lastname, Sort sort); List findTop10ByLastname(String lastname, Pageable pageable);
결과 세트 표현식을 제한하면 Distinct 키워드도 지원됩니다.또한 반환된 결과 집합의 크기가 1로 제한되면 Spring Data는 반환 결과를 Optional(java 8에 새로 추가합니다. 이것은 null을 위한 용기 대상입니다. 값이 존재하면 isPresent () 방법은true를 반환하고 get () 방법을 호출하면 이 이미지를 반환합니다. 예는 다음과 같습니다.Optional findFirstByOrderByLastnameAsc();
검색은 페이지와 슬라이스로 페이지 조회를 하는 상황에서first와 top를 사용하여 결과 집합의 크기를 제한할 수 있습니다.
Sort 매개 변수를 사용하여 검색 결과를 정렬하는 토대에서 결과 집합의 크기에 대한 제한을 더하면 가장 큰 K개 요소나 가장 작은 K개 요소를 쉽게 얻을 수 있습니다.
3、
Scan 및 Scroll을 사용하여 대용량 결과 세트 처리
Elasticsearch는 큰 결과 집합을 처리할 때 scan과 scroll을 사용할 수 있습니다.Spring Data Elasticsearch에서 아래와 같이 Elasticsearch Template를 사용하여 scan과 scroll로 큰 결과 집합을 처리할 수 있습니다.@Test
public void shouldReturnResultsWithScanAndScrollForGivenCriteriaQuery() {
//given
List entities = createSampleEntitiesWithMessage("Test message", 30);
// when
elasticsearchTemplate.bulkIndex(entities);
elasticsearchTemplate.refresh(SampleEntity.class);
// then
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria());
criteriaQuery.addIndices(INDEX_NAME);
criteriaQuery.addTypes(TYPE_NAME);
criteriaQuery.setPageable(new PageRequest(0, 10));
String scrollId = elasticsearchTemplate.scan(criteriaQuery, 1000, false);
List sampleEntities = new ArrayList();
boolean hasRecords = true;
while (hasRecords) {
Page page = elasticsearchTemplate.scroll(scrollId, 5000L, SampleEntity.class);
if (page.hasContent()) {
sampleEntities.addAll(page.getContent());
} else {
hasRecords = false;
}
}
elasticsearchTemplate.clearScroll(scrollId);
assertThat(sampleEntities.size(), is(equalTo(30)));
}
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.withIndices("test-index")
.withTypes("test-type")
.withPageable(new PageRequest(0,1))
.build();
String scrollId = elasticsearchTemplate.scan(searchQuery,1000,false);
List sampleEntities = new ArrayList();
boolean hasRecords = true;
while (hasRecords){
Page page = elasticsearchTemplate.scroll(scrollId, 5000L , new ResultsMapper()
{
@Override
public Page mapResults(SearchResponse response) {
List chunk = new ArrayList();
for(SearchHit searchHit : response.getHits()){
if(response.getHits().getHits().length <= 0) {
return null;
}
SampleEntity user = new SampleEntity();
user.setId(searchHit.getId());
user.setMessage((String)searchHit.getSource().get("message"));
chunk.add(user);
}
return new PageImpl(chunk);
}
});
if(page != null) {
sampleEntities.addAll(page.getContent());
hasRecords = page.hasNextPage();
}
else{
hasRecords = false;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
spring-data-elasticsearch 페이지 조회
부록:
1. 이름에서 알 수 있듯이QueryBuilder는 검색 조건, 필터 조건을 구축하는 데 사용되고 SortBuilder는 정렬을 구축하는 데 사용된다.
예를 들어 우리는 어느 위치에서 100미터 범위 내의 모...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc(); Page queryFirst10ByLastname(String lastname, Pageable pageable); Slice findTop3ByLastname(String lastname, Pageable pageable); List findFirst10ByLastname(String lastname, Sort sort); List findTop10ByLastname(String lastname, Pageable pageable);
Optional findFirstByOrderByLastnameAsc();
Elasticsearch는 큰 결과 집합을 처리할 때 scan과 scroll을 사용할 수 있습니다.Spring Data Elasticsearch에서 아래와 같이 Elasticsearch Template를 사용하여 scan과 scroll로 큰 결과 집합을 처리할 수 있습니다.
@Test
public void shouldReturnResultsWithScanAndScrollForGivenCriteriaQuery() {
//given
List entities = createSampleEntitiesWithMessage("Test message", 30);
// when
elasticsearchTemplate.bulkIndex(entities);
elasticsearchTemplate.refresh(SampleEntity.class);
// then
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria());
criteriaQuery.addIndices(INDEX_NAME);
criteriaQuery.addTypes(TYPE_NAME);
criteriaQuery.setPageable(new PageRequest(0, 10));
String scrollId = elasticsearchTemplate.scan(criteriaQuery, 1000, false);
List sampleEntities = new ArrayList();
boolean hasRecords = true;
while (hasRecords) {
Page page = elasticsearchTemplate.scroll(scrollId, 5000L, SampleEntity.class);
if (page.hasContent()) {
sampleEntities.addAll(page.getContent());
} else {
hasRecords = false;
}
}
elasticsearchTemplate.clearScroll(scrollId);
assertThat(sampleEntities.size(), is(equalTo(30)));
}
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.withIndices("test-index")
.withTypes("test-type")
.withPageable(new PageRequest(0,1))
.build();
String scrollId = elasticsearchTemplate.scan(searchQuery,1000,false);
List sampleEntities = new ArrayList();
boolean hasRecords = true;
while (hasRecords){
Page page = elasticsearchTemplate.scroll(scrollId, 5000L , new ResultsMapper()
{
@Override
public Page mapResults(SearchResponse response) {
List chunk = new ArrayList();
for(SearchHit searchHit : response.getHits()){
if(response.getHits().getHits().length <= 0) {
return null;
}
SampleEntity user = new SampleEntity();
user.setId(searchHit.getId());
user.setMessage((String)searchHit.getSource().get("message"));
chunk.add(user);
}
return new PageImpl(chunk);
}
});
if(page != null) {
sampleEntities.addAll(page.getContent());
hasRecords = page.hasNextPage();
}
else{
hasRecords = false;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
spring-data-elasticsearch 페이지 조회부록: 1. 이름에서 알 수 있듯이QueryBuilder는 검색 조건, 필터 조건을 구축하는 데 사용되고 SortBuilder는 정렬을 구축하는 데 사용된다. 예를 들어 우리는 어느 위치에서 100미터 범위 내의 모...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.