트러블슈팅
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;
}
}
이렇게 분리만 했는데 잘 작동한다.
뭐가 문젠지는 나중에 분석해봐야할듯하다