diff --git a/src/main/java/com/dbnt/faisp/main/searchEngine/SearchEngineController.java b/src/main/java/com/dbnt/faisp/main/searchEngine/SearchEngineController.java index cacc9de2..7a9520fc 100644 --- a/src/main/java/com/dbnt/faisp/main/searchEngine/SearchEngineController.java +++ b/src/main/java/com/dbnt/faisp/main/searchEngine/SearchEngineController.java @@ -22,11 +22,10 @@ public class SearchEngineController { private final SearchEngineService searchEngineService; private final MenuMgtService menuMgtService; - private final CodeMgtService codeMgtService; @GetMapping("/searchPage") - public ModelAndView organMgtPage(@AuthenticationPrincipal UserInfo loginUser, SearchParams params) { - ModelAndView mav = new ModelAndView("searchEngine/search"); + public ModelAndView searchPage(@AuthenticationPrincipal UserInfo loginUser, SearchParams params) { + ModelAndView mav = new ModelAndView("searchEngine/searchPage"); if(Utils.isEmpty(params.getKeyword())){ mav.setViewName("common/keywordRequest"); return mav; @@ -44,22 +43,22 @@ public class SearchEngineController { case "all": params.setQueryInfo(); params.setForm("search_menu_view.search_menu_view"); - result = searchEngineService.getData(params, SearchMenuView.class); + result = searchEngineService.getSearchResult(params, SearchMenuView.class); totalCnt += result.getTotalCount(); mav.addObject("menuResult", result); params.setForm("search_board_view.search_board_view"); - result = searchEngineService.getData(params, SearchBoardView.class); + result = searchEngineService.getSearchResult(params, SearchBoardView.class); totalCnt += result.getTotalCount(); mav.addObject("boardResult", result); params.setForm("search_file_view.search_file_view"); - result = searchEngineService.getData(params, SearchFileView.class); + result = searchEngineService.getSearchResult(params, SearchFileView.class); totalCnt += result.getTotalCount(); mav.addObject("fileResult", result); break; case "menu": params.setQueryInfo(); params.setForm("search_menu_view.search_menu_view"); - result = searchEngineService.getData(params, SearchMenuView.class); + result = searchEngineService.getSearchResult(params, SearchMenuView.class); totalCnt += result.getTotalCount(); params.setContentCnt(totalCnt); mav.addObject("menuResult", result); @@ -68,7 +67,7 @@ public class SearchEngineController { case "board": params.setQueryInfo(); params.setForm("search_board_view.search_board_view"); - result = searchEngineService.getData(params, SearchBoardView.class); + result = searchEngineService.getSearchResult(params, SearchBoardView.class); totalCnt += result.getTotalCount(); params.setContentCnt(totalCnt); mav.addObject("boardResult", result); @@ -77,7 +76,7 @@ public class SearchEngineController { case "file": params.setQueryInfo(); params.setForm("search_file_view.search_file_view"); - result = searchEngineService.getData(params, SearchFileView.class); + result = searchEngineService.getSearchResult(params, SearchFileView.class); totalCnt += result.getTotalCount(); params.setContentCnt(totalCnt); mav.addObject("fileResult", result); @@ -89,9 +88,19 @@ public class SearchEngineController { menuParam.setFirstIndex(0); menuParam.setRowCnt(Integer.MAX_VALUE); mav.addObject("menuList", menuMgtService.selectMenuMgtList(menuParam)); + + mav.addObject("suggestList", searchEngineService.getSuggestList(params.getKeyword())); + mav.addObject("rankList", searchEngineService.getRankingList()); mav.addObject("searchParams", params); mav.addObject("totalCnt", totalCnt); return mav; } + @GetMapping("/suggestKeyword") + public ModelAndView suggestKeyword(SearchParams params){ + ModelAndView mav = new ModelAndView("searchEngine/suggestKeyword"); + mav.addObject("keywordList", searchEngineService.getKeywordList(params.getKeyword())); + return mav; + } + } diff --git a/src/main/java/com/dbnt/faisp/main/searchEngine/model/SearchRank.java b/src/main/java/com/dbnt/faisp/main/searchEngine/model/SearchRank.java new file mode 100644 index 00000000..0d8bb559 --- /dev/null +++ b/src/main/java/com/dbnt/faisp/main/searchEngine/model/SearchRank.java @@ -0,0 +1,11 @@ +package com.dbnt.faisp.main.searchEngine.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class SearchRank { + private String keyword; + private String movement; +} diff --git a/src/main/java/com/dbnt/faisp/main/searchEngine/service/SearchEngineService.java b/src/main/java/com/dbnt/faisp/main/searchEngine/service/SearchEngineService.java index 815053ab..b0b9600b 100644 --- a/src/main/java/com/dbnt/faisp/main/searchEngine/service/SearchEngineService.java +++ b/src/main/java/com/dbnt/faisp/main/searchEngine/service/SearchEngineService.java @@ -1,14 +1,13 @@ package com.dbnt.faisp.main.searchEngine.service; -import com.dbnt.faisp.main.searchEngine.model.SearchMenuView; -import com.dbnt.faisp.main.searchEngine.model.SearchParams; -import com.dbnt.faisp.main.searchEngine.model.SearchResult; +import com.dbnt.faisp.main.searchEngine.model.*; import com.dbnt.faisp.util.Utils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import lombok.extern.slf4j.Slf4j; +import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; @@ -21,7 +20,6 @@ import org.springframework.web.util.UriComponentsBuilder; import java.net.URI; import java.time.Duration; -import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @@ -30,15 +28,92 @@ import java.util.List; @Service public class SearchEngineService { - @Value("${search.engine.url}") - private String engineUrl; + @Value("${search.engine.default}") + private String defaultUrl; + @Value("${search.engine.suggest}") + private String suggestUrl; - public SearchResult getData(SearchParams params, Class rowClass){ - JSONObject jsonObj = requestToSearchEngine(params); + public SearchResult getSearchResult(SearchParams params, Class rowClass){ + JSONObject jsonObj = getSearchResultJsonObject(params); return convertJSONObjectToSearchResult(jsonObj, rowClass); } + + public List getSuggestList(String keyword) { + URI uri = UriComponentsBuilder.fromHttpUrl(suggestUrl) + .path("/ksf/api/suggest") + .queryParam("target", "related") + .queryParam("domain_no", "0") + .queryParam("term", keyword) + .queryParam("max_count", "10") + .encode() + .build() + .toUri(); - private JSONObject requestToSearchEngine(SearchParams params){ + ResponseEntity response = requestRestTemplateExchange(uri); + JSONArray jsonAry = null; + try { + jsonAry = (JSONArray) new JSONParser().parse(response.getBody()); + } catch (ParseException e) { + e.printStackTrace(); + } + List suggestList = new ArrayList<>(); + for(Object str: jsonAry){ + suggestList.add(str.toString()); + } + return suggestList; + } + + public List getRankingList() { + URI uri = UriComponentsBuilder.fromHttpUrl(suggestUrl) + .path("/ksf/api/rankings") + .queryParam("domain_no", "0") + .queryParam("max_count", "10") + .encode() + .build() + .toUri(); + + ResponseEntity response = requestRestTemplateExchange(uri); + JSONArray jsonAry = null; + try { + jsonAry = (JSONArray) new JSONParser().parse(response.getBody()); + } catch (ParseException e) { + e.printStackTrace(); + } + List rankList = new ArrayList<>(); + for(Object row: jsonAry){ + JSONArray rank = (JSONArray) row; + rankList.add(new SearchRank(rank.get(0).toString(), rank.get(1).toString())); + } + return rankList; + } + + public List getKeywordList(String keyword) { + URI uri = UriComponentsBuilder.fromHttpUrl(suggestUrl) + .path("/ksf/api/suggest") + .queryParam("target", "complete") + .queryParam("domain_no", "0") + .queryParam("term", keyword) + .queryParam("mode", "s") + .queryParam("max_count", "10") + .encode() + .build() + .toUri(); + + ResponseEntity response = requestRestTemplateExchange(uri); + JSONArray jsonAry = null; + try { + jsonAry = (JSONArray) ((JSONArray)((JSONObject) new JSONParser().parse(response.getBody())).get("suggestions")).get(0); + } catch (ParseException e) { + e.printStackTrace(); + } + List keywordList = new ArrayList<>(); + for(Object str: jsonAry){ + keywordList.add(((JSONArray) str).get(0).toString()); + } + return keywordList; + } + + private JSONObject getSearchResultJsonObject(SearchParams params){ StringBuilder builder = new StringBuilder(); builder.append("text_idx='") .append(params.getKeyword()) @@ -60,7 +135,7 @@ public class SearchEngineService { } } String where = builder.toString(); - URI uri = UriComponentsBuilder.fromHttpUrl(engineUrl) + URI uri = UriComponentsBuilder.fromHttpUrl(defaultUrl) .path("/search5") .queryParam("select", "*") .queryParam("from", params.getForm()) @@ -75,22 +150,7 @@ public class SearchEngineService { .build() .toUri(); - RestTemplate restTemplate = new RestTemplateBuilder() - .setConnectTimeout(Duration.ofMillis(5000)) - .setReadTimeout(Duration.ofMillis(5000)) - .build(); - - HttpHeaders header = new HttpHeaders(); - header.setContentType(MediaType.APPLICATION_JSON); - header.setAccept(MediaType.parseMediaTypes(MediaType.ALL_VALUE)); - header.setConnection("keep-alive"); - - RequestEntity req = RequestEntity - .get(uri) - .headers(header) - .build(); - - ResponseEntity response = restTemplate.exchange(req, String.class); + ResponseEntity response = requestRestTemplateExchange(uri); JSONObject jsonObj = null; try { jsonObj = (JSONObject) new JSONParser().parse(response.getBody()); @@ -101,6 +161,8 @@ public class SearchEngineService { return jsonObj; } + + private SearchResult convertJSONObjectToSearchResult(JSONObject jsonObj, Class rowClass){ JSONObject resultJSON = (JSONObject) jsonObj.get("result"); SearchResult result = new SearchResult(); @@ -123,4 +185,24 @@ public class SearchEngineService { result.setRowList(convertList); return result; } + + private ResponseEntity requestRestTemplateExchange(URI uri){ + RestTemplate restTemplate = new RestTemplateBuilder() + .setConnectTimeout(Duration.ofMillis(5000)) + .setReadTimeout(Duration.ofMillis(5000)) + .build(); + + HttpHeaders header = new HttpHeaders(); + header.setContentType(MediaType.APPLICATION_JSON); + header.setAccept(MediaType.parseMediaTypes(MediaType.ALL_VALUE)); + header.setConnection("keep-alive"); + + RequestEntity req = RequestEntity + .get(uri) + .headers(header) + .build(); + + ResponseEntity response = restTemplate.exchange(req, String.class); + return response; + } } \ No newline at end of file diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index aeec32a2..1e466d35 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -12,8 +12,8 @@ spring.servlet.multipart.max-request-size=500MB site.domain=http://localhost:8080 clipReport.print.url=http://118.219.150.34:50570/ClipReport5 -search.engine.url=http://118.219.150.34:7577 - +search.engine.default=http://118.219.150.34:7577 +search.engine.suggest=http://118.219.150.34:7614 #file file.dir.publicBoard=/publicBoard file.dir.faRpt=/faRpt diff --git a/src/main/resources/static/css/searchEngine/search.css b/src/main/resources/static/css/searchEngine/search.css index cbb4a7fe..5adc9659 100644 --- a/src/main/resources/static/css/searchEngine/search.css +++ b/src/main/resources/static/css/searchEngine/search.css @@ -30,7 +30,6 @@ input::-moz-placeholder { color: #aaa; } #searchHeader .searchPagetop .searchBox > a{width:78px; position:absolute; top:5px; right:90px; background:#377fe7; color:#fff; text-align:center; display:block; height:44px; line-height:44px; border-radius:5px; border:1px solid #377fe7;} #searchHeader .searchPagetop .searchBox > a:last-of-type{right:5px; color:#377fe7; background:#fff; } #searchHeader .searchPagetop .searchBox .autoSearchList{position:absolute; top:56px; left:0; display:none; background:#fff; box-sizing:border-box; border:1px solid #bec8d8; border-top:none; z-index:9990; width:calc(100% - 175px);} -#searchHeader .searchPagetop .searchBox > input:focus ~ .autoSearchList{display:block;} .autoSearchList > p{padding:20px; font-size:15px; color:#284d7e;} .autoSearchList > ul{padding:13px 0;} diff --git a/src/main/resources/static/js/searchEngine/searchPage.js b/src/main/resources/static/js/searchEngine/searchPage.js index e7c9cbc3..177dfedb 100644 --- a/src/main/resources/static/js/searchEngine/searchPage.js +++ b/src/main/resources/static/js/searchEngine/searchPage.js @@ -25,6 +25,39 @@ $(function () { }); }); +$(document).on('focus', '#keywordInput', function (){ + if(this.value !== undefined && this.value !== "") { + $("#autoSearchList").css('display', 'block') + }else{ + $("#autoSearchList").css('display', 'none') + } +}) + +$(document).on('input', '#keywordInput', function (){ + if(this.value !== undefined && this.value !== ""){ + $.ajax({ + url: '/search/suggestKeyword', + data: {keyword: this.value}, + type: 'GET', + dataType:"html", + success: function(html){ + const autoSearchList = $("#autoSearchList") + autoSearchList.empty().append(html); + autoSearchList.css('display', 'block') + }, + error:function(){ + + } + }); + }else{ + $("#autoSearchList").css('display', 'none') + } +}) + +$(document).on('click', '.suggestKeyword', function (){ + $("#keywordInput").val(this.innerText); +}) + $(document).on('click', '#searchBtn', function (){ searchPageFormSubmit(1); }) diff --git a/src/main/resources/templates/faStatistics/unlawfulFishing/illegalShipInfo/illegalShipInfoPage.html b/src/main/resources/templates/faStatistics/unlawfulFishing/illegalShipInfo/illegalShipInfoPage.html index 95e64c30..3c2b36bb 100644 --- a/src/main/resources/templates/faStatistics/unlawfulFishing/illegalShipInfo/illegalShipInfoPage.html +++ b/src/main/resources/templates/faStatistics/unlawfulFishing/illegalShipInfo/illegalShipInfoPage.html @@ -27,25 +27,7 @@
-
-
-
- -
-
- -
-
+
diff --git a/src/main/resources/templates/searchEngine/search.html b/src/main/resources/templates/searchEngine/searchPage.html similarity index 88% rename from src/main/resources/templates/searchEngine/search.html rename to src/main/resources/templates/searchEngine/searchPage.html index 1401594d..76cbc531 100644 --- a/src/main/resources/templates/searchEngine/search.html +++ b/src/main/resources/templates/searchEngine/searchPage.html @@ -21,25 +21,16 @@ - + 검색 - +
+ +
검색옵션
- - +
@@ -290,26 +281,32 @@

추천검색어

인기검색어

diff --git a/src/main/resources/templates/searchEngine/suggestKeyword.html b/src/main/resources/templates/searchEngine/suggestKeyword.html new file mode 100644 index 00000000..df2eef09 --- /dev/null +++ b/src/main/resources/templates/searchEngine/suggestKeyword.html @@ -0,0 +1,9 @@ + + +
    + + +
  • +
    +
+ \ No newline at end of file