ABOUT ME

Today
Yesterday
Total
  • 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 객체 리스트 반환
        }
    }

    코드 설명

    1. Criteria 설정: Criteria.where("title").matches(title)를 사용해 title 필드에서 주어진 title 변수와 부분 일치하는 검색 조건을 설정합니다.
    2. CriteriaQuery 생성: 생성한 Criteria를 기반으로 CriteriaQuery 객체를 생성하여 전체 검색 쿼리를 만듭니다.
    3. SearchHits 결과 처리: elasticsearchOperations.search(query, Post.class)를 호출해 검색을 실행하고, 검색된 결과를 SearchHits<Post>로 받습니다.
    4. 검색 결과 리스트로 변환: for 반복문을 사용하여 각 SearchHit<Post> 객체에서 Post 객체를 추출하고 List<Post>로 변환합니다.

    사용 사례 요약

    • Criteria: 특정 필드에 대해 부분 일치, 범위 검색 등 다양한 조건을 설정하고 싶을 때 사용합니다.
    • CriteriaQuery: 여러 Criteria 조건을 하나의 쿼리로 결합하여 검색 쿼리를 완성하고 싶을 때 사용합니다.
    • SearchHits<T>: 검색 결과를 리스트 형태로 받아와 개별적으로 접근하고 싶을 때 사용합니다.

    이렇게 Criteria, CriteriaQuery, SearchHits<T>를 사용하면 Elasticsearch에서 다양한 조건으로 데이터를 검색하고, 결과를 쉽게 처리할 수 있습니다.

    반응형

    'ElasticSearch > Project' 카테고리의 다른 글

    댓글

Designed by Tistory.