트러블슈팅

ElasticSearch 조건값을 주어도 무작위로 다 가져오는 현상

cocodingding 2024. 1. 23. 11:09
@RequiredArgsConstructor
@Component
public class RestaurantSearchRepositoryImpl{

    private final ElasticsearchOperations elasticsearchOperations;

    public Page<RestaurantDocument> searchByCriteria(String restaurantName, String address, String category, Pageable pageable) {
        Criteria criteria = new Criteria();

        if (!restaurantName.isEmpty()) {
            criteria.and("restaurant_name").contains(restaurantName);
        }
        if (!address.isEmpty()) {
            criteria.and("address").contains(address);
        }
        if (!category.isEmpty()) {
            criteria.and("category").contains(category);
        }

        Query query = new CriteriaQuery(criteria).setPageable(pageable);
        SearchHits<RestaurantDocument> search = elasticsearchOperations.search(query, RestaurantDocument.class);

        List<RestaurantDocument> content = new ArrayList<>();
        for (SearchHit<RestaurantDocument> hit : search) {
            content.add(hit.getContent());
        }

        return new PageImpl<>(content, pageable, search.getTotalHits());
    }
}

 

  

위와 같은 코드로 작성 시, 파람을 주던 안주던, 아무렇게나 치던 맞게 치던 모든 docs가 가져와지는 현상이 발생했다.

그래서 이래저래 시도하다가 그냥

 

@RequiredArgsConstructor
@Component
public class RestaurantSearchRepositoryImpl{

    private final ElasticsearchOperations elasticsearchOperations;

    public Page<RestaurantDocument> searchByCriteria(String restaurantName, String address, String category, Pageable pageable) {

        Criteria criteria = buildCriteria(restaurantName, address, category);
        CriteriaQuery query = new CriteriaQuery(criteria).setPageable(pageable);

        SearchHits<RestaurantDocument> search = elasticsearchOperations.search(query, RestaurantDocument.class);

        List<RestaurantDocument> content = new ArrayList<>();
        for (SearchHit<RestaurantDocument> hit : search) {
            content.add(hit.getContent());
        }
        return new PageImpl<>(content, pageable, search.getTotalHits());
    }
    private Criteria buildCriteria(String restaurantName, String address, String category) {
        Criteria criteria = new Criteria();

        if (!StringUtils.isEmpty(restaurantName)) {
            criteria = criteria.and("restaurant_name").contains(restaurantName);
        }
        if (!StringUtils.isEmpty(address)) {
            criteria = criteria.and("address").contains(address);
        }
        if (!StringUtils.isEmpty(category)) {
            criteria = criteria.and("category").is(category);
        }

        return criteria;
    }
}

 

이렇게 분리만 했는데 잘 작동한다.

뭐가 문젠지는 나중에 분석해봐야할듯하다