본문 바로가기

Elastic Stack/Elastic Search

Spring Boot - ElasticSearch RestHighLevelClient like 검색하기(queryStringQuery)

DB를 조회하는 SQL 에는 where 조건에 like 검색을 할 수 있습니다.

 ElasticSearch에서도 like 검색을 구현할 수 있습니다. 

 

먼저 SQL문으로 쿼리를 실행하여 결과를 확인해 보겠습니다. 

SELECT * FROM combook c where TITLE like '%피노%';

1건이 도출됩니다. 

 

rest high level client 를 사용하여 테스트를 진행해보도록 하겠습니다. 

like검색을 생각 하지 않고 그대로 검색 요청을 해보겠습니다. 

 

@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.matchQuery("title", "피노"));
		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;
}

boolQuery.must(QueryBuilders.matchQuery("title", "피노")); 부분을 보면, title 이 "피노"인 문서를 검색하는 것이고, 당연히 결과는 0건입니다. 

결과 확인

역시, 결과는 0건입니다. 

1. *을 이용한 query

검색 키워드에 * 을 이용하여 like 검색을 구현 할 수 있습니다. 

boolQuery.must(QueryBuilders.queryStringQuery("*피노*"));

queryStringQuery 메서드를 사용하면 *(wildcard) 를 사용하여 검색 요청을 할 수 있습니다. 

결과 확인

title 에서 피피노키오오 데이터가 검색 결과로 도출되었습니다.