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 에서 피피노키오오 데이터가 검색 결과로 도출되었습니다.