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;
    }
    }
}

좋은 웹페이지 즐겨찾기