본문 바로가기

Elastic Stack/Elastic Search

Spring Boot - ElasticSearch RestHighLevelClient 쿼리 연산자 활용하여 검색하기(queryStringQuery)

@Override
public Map<String,Object> doSearch() throws Exception {
	Map<String,Object> resultMap = new HashMap<String,Object>();
	try {
		SearchRequest searchRequest = new SearchRequest("combook*");
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		searchSourceBuilder.size(10000);
		searchSourceBuilder.timeout(new TimeValue(60,TimeUnit.SECONDS));
		
		BoolQueryBuilder boolQuery = new BoolQueryBuilder();
		boolQuery.must(QueryBuilders.queryStringQuery("교원"));
		searchSourceBuilder.query(boolQuery);
		searchSourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));  // score 높은순 (default)
		searchSourceBuilder.sort(new FieldSortBuilder("_id").order(SortOrder.ASC)); // id오름차순 정
			
		searchRequest.source(searchSourceBuilder);
		SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); // 검색 요청
		SearchHits hits = searchResponse.getHits();
		TotalHits totalHits = hits.getTotalHits(); // total 검색 건수
		
		SearchHit[] searchHits = hits.getHits();
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		list = new ArrayList<Map<String,Object>>();
		for (SearchHit hit : searchHits) {
			Map<String, Object> sourceAsMap = hit.getSourceAsMap(); // 검색 결과를 Map으로 한건 한건 받아서 list에 추가
			list.add(sourceAsMap);
		}
		resultMap.put("totalHits", totalHits.value);
		resultMap.put("searchResults", list);
	}catch (Exception e) {
		e.printStackTrace();
		resultMap.put("totalHits", -500);
		resultMap.put("exception", e);
	}
	return resultMap;
}

QueryBuilders의 queryStringQuery 메서드를 사용하면 검색어에 연산자 (AND, OR)를 붙여서 쿼리를 태울 수 있습니다. 

 

테스트에 사용된 소스입니다. 

boolQuery.must(QueryBuilders.queryStringQuery("교원"));

교원이라는 검색어로 데이터를 조회해 본 결과입니다. 

검색 결과는 총 5건입니다. 이제 AND 연산자로 교원 AND 월드인포 검색을 해보겠습니다. 

boolQuery.must(QueryBuilders.queryStringQuery("교원 AND 월드인포"));

결과를 확인해보겠습니다. 

교원과 월드인포 문구가 둘 다 포함된 검색 결과 1건이 도출되었습니다.