elevne's Study Note

Elasticsearch on Java Spring (2) 본문

ETC/Elasticsearch

Elasticsearch on Java Spring (2)

elevne 2022. 10. 27. 15:02

이전 글에서 Index 생성 과정을 마쳤으니 이제 검색을 위한 코드를 작성해줄 차례이다. 다음과 같은 함수를 작성해주었다.

 

public static SearchRequest listSearch(final String searchTerm){
    try {
        final QueryBuilder query1 = QueryBuilders.matchQuery("field1", searchTerm).fuzziness(Fuzziness.AUTO);
        final QueryBuilder query2 = QueryBuilders.matchQuery("field2", searchTerm).fuzziness(Fuzziness.AUTO);

        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().should(query1).should(query2)
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().postFilter(boolQuery).size(10000);
        SearchRequest request = new SearchRequest("index1");
        request.source(searchSourceBuilder);
        return request;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }

 

 

QueryBuilder 객첼 쿼리를 만들어줄 수 있다. QueryBuilders.matchQuery로 매치쿼리, QueryBuilders.termQuery로 term 쿼리 등 다양한 쿼리를 다양한 함수를 통해 만들어줄 수 있다. 또, QueryBuilders로 만든 쿼리들을 BoolQueryBuilders.boolQuery()를 통해 하나의 BoolQueryBuilder 객체로 묶어줄 수 있다. 

 

 

이렇게 QueryBuilder 혹은 BoolQueryBuilder 객체가 만들어지면 이는 SearchSourceBuilder().postFilter(queryBuilder) 함수에 들어가서 SearchSourceBuilder 객체로 만들어지고, 이는 다시 SearchRequest.source(searchSourceBuilder)로 들어가서 SearchRequest 객체로 만들어진다. 여기서 SearchRequest 객체를 만들 때, 괄호 안에 검색을 진행할 인덱스의 이름을 넣어주게 된다. 이 때 인덱스 이름을 여러개 넣어서 한 번에 여러 개의 인덱스에 대해서 같은 조건에 대해 검색을 진행할 수도 있다.(Elasticsearch의 멀티테넌시) 이전에 정의해둔 client와 이 request를 활용하여 검색요청을 Elasticsearch에 보내줄 수 있는 것이다.

 

 

검색요청을 만들 수 있게 되었으니 이를 직접 보내고 결과를 받는 코드를 작성해줄 차례이다. 검색요청을 Elasticsearch로 보내면 그 결과는 SearchResponse 형태로 돌아오게된다. searchGo 함수를 만들어주었다.

 

 

public SearchHit[] searchGo(SearchRequest request){
    try {
        final SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        final SearchHit[] searchHits = response.getHits().getHits();
        return searchHits;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

 

 

client.search() 함수 안에 request를 넣어주면 그 결과가 searchResponse로 오게되고, response.getHits().getHist()를 통해 searchHit들이 담긴 Array를 얻을 수 있다. 마지막으로, 이 함수를 사용하여 Controller에서 검색기능을 마무리하였다.

 

 

@GetMapping("/{searchTerm}")
public JSONArray searchList(@PathVariable("searchTerm") String searchTerm, Model model) throws Exception {
    SearchRequest request = ListSearchUtil.listSearch(searchTerm);
    SearchHit[] searchHits = listService.searchInternal(request);
    JSONArray result = new JSONArray();
for (SearchHit hit : searchHits){
    result.put(hit);
}
return result;
}

 

 

API를 만들고있는 것이기에 @Controller가 아닌 @RestController 어노테이션을 사용한다. 이는 Controller과 ResponseBody가 합쳐진 어노테이션이다. GET 방식으로 검색어를 받고, 이 검색어를 검색함수에서 만들어준 함수에 넣어 searchRequest를 만든다. 그 후 searchRequest를 보내 받은 SearchResponse에서 SearchHit를 뽑아내고, 이를 다시 for loop문을 통해서 JSON 형식에 맞춰준다. 이 JSON을 return 해주면 REST API가 완성된다.

'ETC > Elasticsearch' 카테고리의 다른 글

Logstash 활용  (0) 2022.12.23
Elasticsearch on Java Spring + (Search Queries...)  (0) 2022.10.26
Elasticsearch 정리!  (0) 2022.10.24