-
ElasticSearch - Criteria, CriteriaQuery, SearchHits 파헤치기ElasticSearch/Project 2024. 11. 13. 13:48반응형
Criteria, CriteriaQuery, SearchHits<T>는 Spring Data Elasticsearch에서 제공하는 클래스들로, 복잡한 검색 조건을 생성하고 검색 결과를 관리하는 데 사용됩니다. 각각의 클래스는 특정 상황에서 유용하게 사용되며, Elasticsearch와 상호작용하기 위해 사용됩니다. 아래는 각 클래스의 기능과 사용 사례에 대한 상세 설명 및 예시입니다.
1. Criteria 클래스
설명
- **Criteria**는 검색 조건을 정의하기 위한 클래스입니다. 필드 이름, 조건 연산자(부분 일치, 정확히 일치 등), 조건 값 등을 설정할 수 있습니다.
- 여러 필드를 기준으로 조건을 결합하거나, 조건에 따라 데이터를 필터링할 수 있습니다.
사용 상황
- 부분 일치 검색: matches() 메서드를 사용하여 부분 일치하는 데이터를 검색할 때.
- 범위 검색: greaterThan() 및 lessThan() 같은 메서드를 사용해 특정 범위 내 데이터를 검색할 때.
- 논리적 조건 결합: 여러 Criteria 조건을 or 또는 and로 결합하여 복합적인 검색 조건을 만들고 싶을 때.
주요 메서드
- where(String field): 검색할 필드를 지정합니다.
- is(Object value): 해당 필드 값이 정확히 일치하는 조건을 설정합니다.
- matches(Object value): 부분 일치 조건을 설정합니다.
- greaterThan(Object value), lessThan(Object value): 값의 범위를 지정해 필터링할 때 사용합니다.
- or(Criteria otherCriteria), and(Criteria otherCriteria): 조건을 논리적으로 결합합니다.
예시 코드
// 조건을 정의하여 제목 필드에서 "Elasticsearch"를 포함하는 검색을 설정 Criteria criteria = Criteria.where("title").matches("Elasticsearch") .and("author").is("John Doe") .or(Criteria.where("category").is("Technology"));
2. CriteriaQuery 클래스
설명
- **CriteriaQuery**는 Criteria로 정의한 조건들을 Elasticsearch에서 실행할 수 있는 쿼리 객체로 변환하는 클래스입니다.
- 하나 이상의 Criteria를 포함할 수 있으며, 이들을 결합하여 복합적인 쿼리를 생성할 수 있습니다.
사용 상황
- 복합 조건 쿼리: 여러 개의 Criteria 조건을 조합하여 전체 쿼리 객체를 생성해야 할 때.
- 검색 실행 준비: Criteria를 이용해 조건을 설정한 후, Elasticsearch에서 사용할 쿼리 형식으로 변환하여 ElasticsearchOperations와 같은 클래스에서 실행 가능한 상태로 만들고 싶을 때.
주요 메서드
- new CriteriaQuery(Criteria criteria): Criteria를 기반으로 CriteriaQuery 객체를 생성합니다.
- addCriteria(Criteria criteria): 추가적인 Criteria 조건을 CriteriaQuery에 더할 수 있습니다.
예시 코드
// Criteria를 기반으로 CriteriaQuery 생성 Criteria criteria = Criteria.where("title").matches("Spring Data"); CriteriaQuery query = new CriteriaQuery(criteria);
3. SearchHits<T> 클래스
설명
- **SearchHits<T>**는 Elasticsearch에서 검색을 실행한 결과를 담고 있는 클래스입니다. SearchHits는 모든 검색 결과를 리스트 형태로 저장하며, 각 검색 결과는 SearchHit라는 객체로 표현됩니다.
- SearchHits는 전체 검색 결과와 관련 메타데이터(총 검색 결과 개수 등)를 제공하여, 결과를 쉽게 다룰 수 있도록 해줍니다.
사용 상황
- 검색 결과 관리: 검색 결과를 List 형식으로 반환받고, 그 안의 각 결과 항목을 개별적으로 접근해야 할 때.
- 검색 결과 처리: 결과의 개수, 각 검색 결과의 내용(getContent()), 메타데이터를 포함해 다양한 방식으로 검색 결과를 처리할 때.
주요 메서드
- getTotalHits(): 검색 결과의 총 개수를 반환합니다.
- getSearchHits(): SearchHit 객체의 리스트를 반환합니다. 각 SearchHit는 개별 검색 결과입니다.
- iterator(): SearchHits 객체를 반복할 수 있도록 해줍니다.
예시 코드
SearchHits<Post> searchHits = elasticsearchOperations.search(query, Post.class); // 검색 결과를 List<Post>로 변환 List<Post> posts = new ArrayList<>(); for (SearchHit<Post> hit : searchHits) { posts.add(hit.getContent()); // 검색 결과 내용 가져오기 }
전체적인 예시 코드
아래 예시 코드는 위에서 설명한 세 가지 클래스(Criteria, CriteriaQuery, SearchHits<T>)를 모두 사용하는 예입니다. 이 코드는 title 필드에서 특정 단어가 포함된 문서를 검색하며, 검색 결과를 리스트로 반환합니다.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.SearchHits; import org.springframework.data.elasticsearch.core.query.Criteria; import org.springframework.data.elasticsearch.core.query.CriteriaQuery; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service public class PostService { @Autowired private ElasticsearchOperations elasticsearchOperations; public List<Post> searchByTitle(String title) { // 1. Criteria를 생성하여 'title' 필드에서 부분 일치 검색 조건 설정 Criteria criteria = Criteria.where("title").matches(title); // 2. CriteriaQuery에 Criteria를 추가하여 쿼리 생성 CriteriaQuery query = new CriteriaQuery(criteria); // 3. ElasticsearchOperations를 사용하여 검색 실행 및 SearchHits<Post>로 결과 받기 SearchHits<Post> searchHits = elasticsearchOperations.search(query, Post.class); // 4. SearchHits에서 Post 객체들을 추출하여 List<Post>로 변환 List<Post> posts = new ArrayList<>(); for (SearchHit<Post> hit : searchHits) { posts.add(hit.getContent()); } return posts; // 검색된 Post 객체 리스트 반환 } }
코드 설명
- Criteria 설정: Criteria.where("title").matches(title)를 사용해 title 필드에서 주어진 title 변수와 부분 일치하는 검색 조건을 설정합니다.
- CriteriaQuery 생성: 생성한 Criteria를 기반으로 CriteriaQuery 객체를 생성하여 전체 검색 쿼리를 만듭니다.
- SearchHits 결과 처리: elasticsearchOperations.search(query, Post.class)를 호출해 검색을 실행하고, 검색된 결과를 SearchHits<Post>로 받습니다.
- 검색 결과 리스트로 변환: for 반복문을 사용하여 각 SearchHit<Post> 객체에서 Post 객체를 추출하고 List<Post>로 변환합니다.
사용 사례 요약
- Criteria: 특정 필드에 대해 부분 일치, 범위 검색 등 다양한 조건을 설정하고 싶을 때 사용합니다.
- CriteriaQuery: 여러 Criteria 조건을 하나의 쿼리로 결합하여 검색 쿼리를 완성하고 싶을 때 사용합니다.
- SearchHits<T>: 검색 결과를 리스트 형태로 받아와 개별적으로 접근하고 싶을 때 사용합니다.
이렇게 Criteria, CriteriaQuery, SearchHits<T>를 사용하면 Elasticsearch에서 다양한 조건으로 데이터를 검색하고, 결과를 쉽게 처리할 수 있습니다.
반응형'ElasticSearch > Project' 카테고리의 다른 글
ElasticSearch + SpringBoot 게시판 만들기 (0) 2024.11.12