@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건이 도출되었습니다.