diff --git a/.classpath b/.classpath index 17b99a85..99a4add8 100644 --- a/.classpath +++ b/.classpath @@ -1,38 +1,39 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml index 77f17bd5..115e6674 100644 --- a/pom.xml +++ b/pom.xml @@ -250,8 +250,21 @@ log4jdbc-remix 0.2.7 + + org.projectlombok + lombok + 1.18.20 + provided + + + + + com.google.code.gson + gson + 2.8.7 + + - diff --git a/src/main/java/egovframework/com/cmm/ComDefaultCodeVO.java b/src/main/java/egovframework/com/cmm/ComDefaultCodeVO.java new file mode 100644 index 00000000..04e5518a --- /dev/null +++ b/src/main/java/egovframework/com/cmm/ComDefaultCodeVO.java @@ -0,0 +1,185 @@ +package egovframework.com.cmm; + +import java.io.Serializable; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * 클래스 + * @author 공통서비스개발팀 이삼섭 + * @since 2009.06.01 + * @version 1.0 + * @see + * + *
+ * << 개정이력(Modification Information) >>
+ *   
+ *   수정일      수정자           수정내용
+ *  -------       --------    ---------------------------
+ *   2009.3.11   이삼섭          최초 생성
+ *
+ * 
+ */ +@SuppressWarnings("serial") +public class ComDefaultCodeVO implements Serializable { + /** 코드 ID */ + private String codeId = ""; + + /** 상세코드 */ + private String code = ""; + + /** 코드명 */ + private String codeNm = ""; + + /** 코드설명 */ + private String codeDc = ""; + + /** 특정테이블명 */ + private String tableNm = ""; //특정테이블에서 코드정보를추출시 사용 + + /** 상세 조건 여부 */ + private String haveDetailCondition = "N"; + + /** 상세 조건 */ + private String detailCondition = ""; + + /** + * codeId attribute를 리턴한다. + * + * @return the codeId + */ + public String getCodeId() { + return codeId; + } + + /** + * codeId attribute 값을 설정한다. + * + * @param codeId + * the codeId to set + */ + public void setCodeId(String codeId) { + this.codeId = codeId; + } + + /** + * code attribute를 리턴한다. + * + * @return the code + */ + public String getCode() { + return code; + } + + /** + * code attribute 값을 설정한다. + * + * @param code + * the code to set + */ + public void setCode(String code) { + this.code = code; + } + + /** + * codeNm attribute를 리턴한다. + * + * @return the codeNm + */ + public String getCodeNm() { + return codeNm; + } + + /** + * codeNm attribute 값을 설정한다. + * + * @param codeNm + * the codeNm to set + */ + public void setCodeNm(String codeNm) { + this.codeNm = codeNm; + } + + /** + * codeDc attribute를 리턴한다. + * + * @return the codeDc + */ + public String getCodeDc() { + return codeDc; + } + + /** + * codeDc attribute 값을 설정한다. + * + * @param codeDc + * the codeDc to set + */ + public void setCodeDc(String codeDc) { + this.codeDc = codeDc; + } + + /** + * tableNm attribute를 리턴한다. + * + * @return the tableNm + */ + public String getTableNm() { + return tableNm; + } + + /** + * tableNm attribute 값을 설정한다. + * + * @param tableNm + * the tableNm to set + */ + public void setTableNm(String tableNm) { + this.tableNm = tableNm; + } + + /** + * haveDetailCondition attribute를 리턴한다. + * + * @return the haveDetailCondition + */ + public String getHaveDetailCondition() { + return haveDetailCondition; + } + + /** + * haveDetailCondition attribute 값을 설정한다. + * + * @param haveDetailCondition + * the haveDetailCondition to set + */ + public void setHaveDetailCondition(String haveDetailCondition) { + this.haveDetailCondition = haveDetailCondition; + } + + /** + * detailCondition attribute를 리턴한다. + * + * @return the detailCondition + */ + public String getDetailCondition() { + return detailCondition; + } + + /** + * detailCondition attribute 값을 설정한다. + * + * @param detailCondition + * the detailCondition to set + */ + public void setDetailCondition(String detailCondition) { + this.detailCondition = detailCondition; + } + + /** + * toString 메소드를 대치한다. + */ + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/src/main/java/kccf/sch/common/WNAnchor.java b/src/main/java/kccf/sch/common/WNAnchor.java new file mode 100644 index 00000000..4ca84146 --- /dev/null +++ b/src/main/java/kccf/sch/common/WNAnchor.java @@ -0,0 +1,108 @@ +package kccf.sch.common; + +public class WNAnchor { + private int m_before = -1; + private int m_next = -1; + private int m_bundleBefore = -1; + private int m_bundleNext = -1; + private int m_firstPage = -1; + private int m_lastPage = -1; + private int m_totalPgCount = 0; + private int m_totlalBundlePgCount = 0; + private int m_pageCount = 0; + private int m_curPageNumber = 1; + private String[][] m_pages = new String[1][2]; + + public WNAnchor() { + m_pages[0][0] = "1"; + m_pages[0][1] = "-1"; + } + + public int getBefore() { + return m_before; + } + + public void setBefore(int before) { + m_before = before; + } + + public int getFirstPage() { + return m_firstPage; + } + + public void setFirstPage(int firstPage) { + m_firstPage = firstPage; + } + + public int getLastPage() { + return m_lastPage; + } + + public void setLastPage(int lastPage) { + m_lastPage = lastPage; + } + + public int getNext() { + return m_next; + } + + public void setNext(int next) { + m_next = next; + } + + public int getBundleBefore() { + return m_bundleBefore; + } + + public void setBundleBefore(int bundleBefore) { + m_bundleBefore = bundleBefore; + } + + public int getBundleNext() { + return m_bundleNext; + } + + public void setBundleNext(int bundleNext) { + m_bundleNext = bundleNext; + } + + public int getTotalPgCount() { + return m_totalPgCount; + } + + public void setTotalPgCount(int totalPgCount) { + m_totalPgCount = totalPgCount; + } + + public int getTotlalBundlePgCount() { + return m_totlalBundlePgCount; + } + + public void setTotlalBundlePgCount(int totlalBundlePgCount) { + m_totlalBundlePgCount = totlalBundlePgCount; + } + + public int getPageCount() { + return m_pageCount; + } + + public void setPageCount(int pageCount) { + m_pageCount = pageCount; + } + + public int getCurPageNumber() { + return m_curPageNumber; + } + + public void setCurPageNumber(int curPageNumber) { + m_curPageNumber = curPageNumber; + } + + public String[][] getPages() { + return m_pages; + } + + public void setPages(String[][] pages) { + m_pages = pages; + } +} \ No newline at end of file diff --git a/src/main/java/kccf/sch/common/WNCollection.java b/src/main/java/kccf/sch/common/WNCollection.java new file mode 100644 index 00000000..58e87f6b --- /dev/null +++ b/src/main/java/kccf/sch/common/WNCollection.java @@ -0,0 +1,335 @@ +package kccf.sch.common; + +public class WNCollection { + + + public static String[] COLLECTIONS = new String[]{"info","map","number","pick","reference","story","culturePost","total","culturePostHot","toon","ocr"}; + public static String[] COLLECTIONS_NAME = new String[]{"info","map","number","pick","reference","story","culturePost","total","culturePostHot","toon","ocr"}; + public static String[] MERGE_COLLECTIONS = new String[]{""}; + public String[][] MERGE_COLLECTION_INFO = null; + public String[][] COLLECTION_INFO = null; + public WNCollection(){ + COLLECTION_INFO = new String[][] + { + { + "info", // set index name + "info", // set collection name + "0,3", // set pageinfo (start,count) + "1,0,0,1,0", // set query analyzer (useKMA,isCase,useOriginal,useSynonym, duplcated detection) + "RANK/DESC,DATE/DESC", // set sort field (field,order) multi sort '/' + "basic,rpfmo,100", // set sort field (field,order) multi sort '/' + "TITLE,CONTENT_TYPE_NAME_EX,SIDO_NAME",// set search field + "DOCID,DATE,CONT_TYPE,CAT1_NAME,GIA_CAT2_NAME,CAT3_NAME,CONTENT_ID,CONTENT_TYPE_ID,CONTENT_TYPE_NAME,TITLE,SIDO_NAME,SIGUNGU_NAME,SEARCH_AREA,MAIN_IMG,ADDR1,ZIP_CODE,TEL,ALIAS,SEARCH_AREA_COUNCIL,SEARCH_AREA_COUNCIL_INFO",// set document field + "", // set date range + "", // set rank range + "", // set prefix query, example: |/1, (fieldname:contains:value) and ' ', or '|', not '!' / operator (AND:1, OR:0) + "", // set collection query (/option...) and ' ', or '|' + "", // set boost query ( | ...) and ' ', or '|' + "", // set filter operation () + "", // set groupby field(field, count) + "", // set sort field group(field/order,field/order,...) + "", // set categoryBoost(fieldname,matchType,boostID,boostKeyword) + "", // set categoryGroupBy (fieldname:value) + "", // set categoryQuery (fieldname:value) + "", // set property group (fieldname,min,max, groupcount) + "CONTENT_TYPE_NAME,SEARCH_AREA_COUNCIL_INFO", // use check prefix query filed + "", // set use check fast access field + "", // set multigroupby field + "", // set auth query (Auth Target Field, Auth Collection, Auth Reference Field, Authority Query) + "", // set Duplicate Detection Criterion Field, RANK/DESC,DATE/DESC + "info" // collection display name + } + , + { + "map", // set index name + "map", // set collection name + "0,3", // set pageinfo (start,count) + "1,0,0,1,0", // set query analyzer (useKMA,isCase,useOriginal,useSynonym, duplcated detection) + "RANK/DESC,DATE/DESC", // set sort field (field,order) multi sort '/' + "basic,rpfmo,100", // set sort field (field,order) multi sort '/' + "TITLE,TRS_AGE_EX,INTERFACE_ID,GENYEAR_SCH,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,FIRST_TOPIC,SECOND_TOPIC,FIRST_CLASS,SECOND_CLASS,THEME_CD,THEME_NM,SERIES_CD,SERIES_NM",// set search field + "DOCID,DATE,CONTENT_TYPE,CONTENT_ID,TITLE,SUMMARY,MAIN_IMG,ADDR1,LATITUDE,LONGITUDE,LINK_DATA,READ_CNT,INTERFACE_ID,GENYEAR,TRS_AGE,CHRONOLOGICAL_START,CHRONOLOGICAL_END,FIRST_TOPIC,SECOND_TOPIC,FIRST_CLASS,SECOND_CLASS,SIDO_NAME,SIGUNGU_NAME,ADDR2,THEME_CD,THEME_NM,SERIES_CD,SERIES_NM,CONTENT_TYPE_ID,ID,FIRST_CATEGORY,SECOND_CATEGORY,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,TAGS_NAME,CONTENT_TYPE_NAME,CAT1,CAT1_NAME,CAT2,CAT2_NAME,CAT3,CAT3_NAME,ZIP_CODE,TEL,RECOMMEND_YN,NTCE_BGNDE,NTCE_ENDDE,WEBSITE,UPDATED_AT,COUNCIL_CD,COUNCIL_NM,ALIAS,GENYEAR_SCH,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH",// set document field + "", // set date range + "", // set rank range + "", // set prefix query, example: |/1, (fieldname:contains:value) and ' ', or '|', not '!' / operator (AND:1, OR:0) + "", // set collection query (/option...) and ' ', or '|' + "", // set boost query ( | ...) and ' ', or '|' + "", // set filter operation () + "", // set groupby field(field, count) + "", // set sort field group(field/order,field/order,...) + "", // set categoryBoost(fieldname,matchType,boostID,boostKeyword) + "", // set categoryGroupBy (fieldname:value) + "", // set categoryQuery (fieldname:value) + "", // set property group (fieldname,min,max, groupcount) + "TRS_AGE,CONTENT_TYPE", // use check prefix query filed + "READ_CNT,GENYEAR,CHRONOLOGICAL_START,CHRONOLOGICAL_END", // set use check fast access field + "", // set multigroupby field + "", // set auth query (Auth Target Field, Auth Collection, Auth Reference Field, Authority Query) + "", // set Duplicate Detection Criterion Field, RANK/DESC,DATE/DESC + "map" // collection display name + } + , + { + "number", // set index name + "number", // set collection name + "0,3", // set pageinfo (start,count) + "1,0,0,1,0", // set query analyzer (useKMA,isCase,useOriginal,useSynonym, duplcated detection) + "RANK/DESC,DATE/DESC", // set sort field (field,order) multi sort '/' + "basic,rpfmo,100", // set sort field (field,order) multi sort '/' + "TAGS,TITLE,INTERFACE_ID,GENYEAR_SCH,TRS_AGE_EX,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,FIRST_CLASS_NM,SECOND_CLASS_NM,FIRST_TOPIC,SECOND_TOPIC,THEME_CD_EX,THEME_NM_EX,SERIES_CD_EX,SERIES_NM_EX",// set search field + "DOCID,DATE,TITLE,SUMMARY,THEME_CD,THEME_NM,SERIES_CD,SERIES_NM,SIDO_NAME,SIGUNGU_NAME,LINK_DATA,FIRST_TOPIC,SECOND_TOPIC,FIRST_CLASS,SECOND_CLASS,SOJANG_COUNCIL,TAGS,COUNCIL,KEYWORDS,INTERFACE_ID,GENYEAR,TRS_AGE,CHRONOLOGICAL_START,CHRONOLOGICAL_END,FIRST_CATEGORY,SECOND_CATEGORY,READ_CNT,CONTENT_ID,CONTENT_TYPE,ID,SEARCH_THEME_CD,SEARCH_THEME_NM,SEARCH_CLASS,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,SOJANG_COUNCIL_NM,FIRST_CLASS_NM,SECOND_CLASS_NM,MEDIA_ID,ASSET_CLASS,ALIAS,SEARCH_AREA_COUNCIL,GENYEAR_SCH,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,COUNCIL_NM_TOT,ASSET_TYPE,MAIN_IMG",// set document field + "", // set date range + "", // set rank range + "", // set prefix query, example: |/1, (fieldname:contains:value) and ' ', or '|', not '!' / operator (AND:1, OR:0) + "", // set collection query (/option...) and ' ', or '|' + "", // set boost query ( | ...) and ' ', or '|' + "", // set filter operation () + "", // set groupby field(field, count) + "", // set sort field group(field/order,field/order,...) + "", // set categoryBoost(fieldname,matchType,boostID,boostKeyword) + "", // set categoryGroupBy (fieldname:value) + "", // set categoryQuery (fieldname:value) + "", // set property group (fieldname,min,max, groupcount) + "TRS_AGE,FIRST_CLASS,SECOND_CLASS,THEME_CD,THEME_NM,SEARCH_THEME_CD,SEARCH_THEME_NM,SOJANG_COUNCIL,KEYWORDS,SIDO_NAME,SERIES_CD,SERIES_NM", // use check prefix query filed + "GENYEAR,CHRONOLOGICAL_START,CHRONOLOGICAL_END,READ_CNT", // set use check fast access field + "", // set multigroupby field + "", // set auth query (Auth Target Field, Auth Collection, Auth Reference Field, Authority Query) + "", // set Duplicate Detection Criterion Field, RANK/DESC,DATE/DESC + "number" // collection display name + } + , + { + "pick", // set index name + "pick", // set collection name + "0,3", // set pageinfo (start,count) + "1,0,0,1,0", // set query analyzer (useKMA,isCase,useOriginal,useSynonym, duplcated detection) + "RANK/DESC,DATE/DESC", // set sort field (field,order) multi sort '/' + "basic,rpfmo,100", // set sort field (field,order) multi sort '/' + "TITLE,SUMMARY,INTERFACE_ID,GENYEAR_SCH,TRS_AGE_EX,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,FIRST_CLASS_NM,SECOND_CLASS_NM,THEME,SERIES,COUNCIL,KEYWORDS_EX,TAGS,OCR_TEXT_TOT",// set search field + "DOCID,DATE,TITLE,SUMMARY,FIRST_CLASS,SECOND_CLASS,SOJANG_COUNCIL,TAGS,KEYWORDS,READ_CNT,INTERFACE_ID,GENYEAR,TRS_AGE,CHRONOLOGICAL_START,CHRONOLOGICAL_END,FIRST_CATEGORY,SECOND_CATEGORY,SEARCH_CLASS,AUTHOR,PUBLISHER,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,COUNCIL,SIDO_NAME,SIGUNGU_NAME,TRS_SIDO_NAME,TRS_SIGUNGU_NAME,FIRST_CLASS_NM,SECOND_CLASS_NM,SEARCH_AREA_COUNCIL,LINK_DATA,ASSETS_ID,MEDIA_ID,MAIN_IMG,MGNT_NO,ASSET_TYPE,THEME,SERIES,ORG_OPEN_AT,STRE_FILE_NAME,ALIAS,SUBTITLE,ADDITION,ORIGNL_FILE_NAME,FILE_SIZE,WIDTH,HEIGHT,IMG_ALT,MEDIA_TYPE,PLAYER_AT,PLAY_TIME,VOLUME,TOTAL_PAGE,ISBN,WEBSITE_NAME,LINK_USE_AT,MAKING_DATE,FILMING_LOCATION,SUBTITLE_AT,SUBTITLE_ORG_FILE_NAME,SUBTITLE_STRE_FILE_NAME,SUBTITLE_DESC,PROVIDER,SOURCE_AT,SOURCE,COPYRIGHT,RETENTION_PERIOD,COPYRIGHT_MGNT_DEPART,THIRD_COPYRIGHT,CCL_TYPE,UPDATED_AT,DELETED_AT,USE_AT,REMARKS_DESC,RECOMMEND_YN,GENYEAR_SCH,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,COUNCIL_NM_TOT,OCR_TEXT_TOT",// set document field + "", // set date range + "", // set rank range + "", // set prefix query, example: |/1, (fieldname:contains:value) and ' ', or '|', not '!' / operator (AND:1, OR:0) + "", // set collection query (/option...) and ' ', or '|' + "", // set boost query ( | ...) and ' ', or '|' + "", // set filter operation () + "", // set groupby field(field, count) + "", // set sort field group(field/order,field/order,...) + "", // set categoryBoost(fieldname,matchType,boostID,boostKeyword) + "", // set categoryGroupBy (fieldname:value) + "", // set categoryQuery (fieldname:value) + "", // set property group (fieldname,min,max, groupcount) + "TRS_AGE,FIRST_CATEGORY,SECOND_CATEGORY,FIRST_CLASS,SECOND_CLASS,SOJANG_COUNCIL,MGNT_NO,KEYWORDS,SIDO_NAME,MEDIA_ID,ASSET_TYPE,ASSETS_ID", // use check prefix query filed + "READ_CNT,GENYEAR,CHRONOLOGICAL_START,CHRONOLOGICAL_END", // set use check fast access field + "", // set multigroupby field + "", // set auth query (Auth Target Field, Auth Collection, Auth Reference Field, Authority Query) + "", // set Duplicate Detection Criterion Field, RANK/DESC,DATE/DESC + "pick" // collection display name + } + , + { + "reference", // set index name + "reference", // set collection name + "0,3", // set pageinfo (start,count) + "1,0,0,1,0", // set query analyzer (useKMA,isCase,useOriginal,useSynonym, duplcated detection) + "RANK/DESC,DATE/DESC", // set sort field (field,order) multi sort '/' + "custom,rweight=0.7;dweight=0.2;fweight=0.1,0", // set sort field (field,order) multi sort '/' + "TITLE/5,SUMMARY,INTERFACE_ID,GENYEAR_SCH,TRS_AGE_EX,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,FIRST_CLASS_NM,SECOND_CLASS_NM,THEME,SERIES,COUNCIL,KEYWORDS_EX,TAGS,OCR_TEXT_TOT",// set search field + "DOCID,DATE,TITLE,SUMMARY,FIRST_CLASS,SECOND_CLASS,SOJANG_COUNCIL,TAGS,KEYWORDS,READ_CNT,INTERFACE_ID,GENYEAR,TRS_AGE,CHRONOLOGICAL_START,CHRONOLOGICAL_END,FIRST_CATEGORY,SECOND_CATEGORY,SEARCH_CLASS,SEARCH_CATEGORY,AUTHOR,PUBLISHER,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,COUNCIL,SIDO_NAME,SIGUNGU_NAME,TRS_SIDO_NAME,TRS_SIGUNGU_NAME,FIRST_CLASS_NM,SECOND_CLASS_NM,SEARCH_AREA_COUNCIL,LINK_DATA,ASSETS_ID,MEDIA_ID,MAIN_IMG,MGNT_NO,ASSET_TYPE,THEME,SERIES,ORG_OPEN_AT,STRE_FILE_NAME,ALIAS,SUBTITLE,ADDITION,ORIGNL_FILE_NAME,FILE_SIZE,WIDTH,HEIGHT,IMG_ALT,MEDIA_TYPE,PLAYER_AT,PLAY_TIME,VOLUME,TOTAL_PAGE,ISBN,WEBSITE_NAME,LINK_USE_AT,MAKING_DATE,FILMING_LOCATION,SUBTITLE_AT,SUBTITLE_ORG_FILE_NAME,SUBTITLE_STRE_FILE_NAME,SUBTITLE_DESC,PROVIDER,SOURCE_AT,SOURCE,COPYRIGHT,RETENTION_PERIOD,COPYRIGHT_MGNT_DEPART,THIRD_COPYRIGHT,CCL_TYPE,UPDATED_AT,DELETED_AT,USE_AT,REMARKS_DESC,RECOMMEND_YN,GENYEAR_SCH,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,OCR_TEXT_TOT,COUNCIL_NM_TOT,TABLE_OF_CONTENTS,ORG_OPEN_EXIST,MAIN_IMG_EXIST",// set document field + "", // set date range + "", // set rank range + "", // set prefix query, example: |/1, (fieldname:contains:value) and ' ', or '|', not '!' / operator (AND:1, OR:0) + "", // set collection query (/option...) and ' ', or '|' + "", // set boost query ( | ...) and ' ', or '|' + "", // set filter operation () + "", // set groupby field(field, count) + "", // set sort field group(field/order,field/order,...) + "", // set categoryBoost(fieldname,matchType,boostID,boostKeyword) + "", // set categoryGroupBy (fieldname:value) + "", // set categoryQuery (fieldname:value) + "", // set property group (fieldname,min,max, groupcount) + "TRS_AGE,FIRST_CATEGORY,SECOND_CATEGORY,FIRST_CLASS,SECOND_CLASS,SOJANG_COUNCIL,MGNT_NO,KEYWORDS,SIDO_NAME,MEDIA_ID,ASSET_TYPE,ASSETS_ID", // use check prefix query filed + "READ_CNT,GENYEAR,CHRONOLOGICAL_START,CHRONOLOGICAL_END", // set use check fast access field + "", // set multigroupby field + "", // set auth query (Auth Target Field, Auth Collection, Auth Reference Field, Authority Query) + "", // set Duplicate Detection Criterion Field, RANK/DESC,DATE/DESC + "reference" // collection display name + } + , + { + "story", // set index name + "story", // set collection name + "0,3", // set pageinfo (start,count) + "1,0,0,1,0", // set query analyzer (useKMA,isCase,useOriginal,useSynonym, duplcated detection) + "RANK/DESC,DATE/DESC", // set sort field (field,order) multi sort '/' + "basic,rpfmo,100", // set sort field (field,order) multi sort '/' + "TITLE,SUMMARY,INTERFACE_ID,GENYEAR_SCH,TRS_AGE_EX,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,FIRST_TOPIC,SECOND_TOPIC,THEME_CD_EX,THEME_NM_EX,SERIES_CD_EX,SERIES_NM_EX,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,KEYWORDS_EX,TAGS",// set search field + "DOCID,DATE,TITLE,SUMMARY,THEME_CD,THEME_NM,SERIES_CD,SERIES_NM,SIDO_NAME,SIGUNGU_NAME,DONG_NAME1,AGE,TRS_AGE,LINK_DATA,FIRST_TOPIC,SECOND_TOPIC,TAGS,KEYWORDS,COUNCIL,READ_CNT,INTERFACE_ID,GENYEAR,CHRONOLOGICAL_START,CHRONOLOGICAL_END,ID,SEARCH_THEME_CD,SEARCH_THEME_NM,SEARCH_AREA_COUNCIL,MAIN_IMG,FIRST_CLASS,SECOND_CLASS,FIRST_CLASS_NM,SECOND_CLASS_NM,FIRST_CATEGORY,SECOND_CATEGORY,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,ALIAS,SOJANG_COUNCIL,GENYEAR_SCH,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH",// set document field + "", // set date range + "", // set rank range + "", // set prefix query, example: |/1, (fieldname:contains:value) and ' ', or '|', not '!' / operator (AND:1, OR:0) + "", // set collection query (/option...) and ' ', or '|' + "", // set boost query ( | ...) and ' ', or '|' + "", // set filter operation () + "", // set groupby field(field, count) + "", // set sort field group(field/order,field/order,...) + "", // set categoryBoost(fieldname,matchType,boostID,boostKeyword) + "", // set categoryGroupBy (fieldname:value) + "", // set categoryQuery (fieldname:value) + "", // set property group (fieldname,min,max, groupcount) + "THEME_CD,THEME_NM,TRS_AGE,SEARCH_THEME_CD,SEARCH_THEME_NM,SOJANG_COUNCIL,KEYWORDS,SERIES_CD,SERIES_NM,SECOND_CATEGORY,FIRST_CATEGORY", // use check prefix query filed + "READ_CNT,GENYEAR,CHRONOLOGICAL_START,CHRONOLOGICAL_END", // set use check fast access field + "", // set multigroupby field + "", // set auth query (Auth Target Field, Auth Collection, Auth Reference Field, Authority Query) + "", // set Duplicate Detection Criterion Field, RANK/DESC,DATE/DESC + "story" // collection display name + } + , + { + "culturePost", // set index name + "culturePost", // set collection name + "0,3", // set pageinfo (start,count) + "1,0,0,1,0", // set query analyzer (useKMA,isCase,useOriginal,useSynonym, duplcated detection) + "RANK/DESC,DATE/DESC", // set sort field (field,order) multi sort '/' + "basic,rpfmo,100", // set sort field (field,order) multi sort '/' + "TITLE,SUMMARY,TAGS,KEYWORDS",// set search field + "DOCID,DATE,TITLE,SUMMARY,TAGS,MAIN_IMG,ALIAS,KEYWORDS",// set document field + "", // set date range + "", // set rank range + "", // set prefix query, example: |/1, (fieldname:contains:value) and ' ', or '|', not '!' / operator (AND:1, OR:0) + "", // set collection query (/option...) and ' ', or '|' + "", // set boost query ( | ...) and ' ', or '|' + "", // set filter operation () + "", // set groupby field(field, count) + "", // set sort field group(field/order,field/order,...) + "", // set categoryBoost(fieldname,matchType,boostID,boostKeyword) + "", // set categoryGroupBy (fieldname:value) + "", // set categoryQuery (fieldname:value) + "", // set property group (fieldname,min,max, groupcount) + "", // use check prefix query filed + "", // set use check fast access field + "", // set multigroupby field + "", // set auth query (Auth Target Field, Auth Collection, Auth Reference Field, Authority Query) + "", // set Duplicate Detection Criterion Field, RANK/DESC,DATE/DESC + "culturePost" // collection display name + } + , + { + "total", // set index name + "total", // set collection name + "0,3", // set pageinfo (start,count) + "1,0,0,1,0", // set query analyzer (useKMA,isCase,useOriginal,useSynonym, duplcated detection) + "RANK/DESC,DATE/DESC", // set sort field (field,order) multi sort '/' + "basic,rpfmo,100", // set sort field (field,order) multi sort '/' + "TITLE,TAGS_TITLE,SUMMARY,INTERFACE_ID,GENYEAR_SCH,TRS_AGE_EX,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,FIRST_CLASS_NM,SECOND_CLASS_NM,THEME_CD_EX,THEME_NM_EX,SERIES_CD_EX,SERIES_NM_EX,COUNCIL,KEYWORDS,CONTENT_TYPE_NAME,SIDO_NAME_EX,TAGS,NUMBER_TITLE,FIRST_TOPIC,SECOND_TOPIC",// set search field + "DOCID,DATE,TITLE,SUMMARY,FIRST_CLASS,SECOND_CLASS,TAGS,READ_CNT,GENYEAR,TRS_AGE,CHRONOLOGICAL_START,CHRONOLOGICAL_END,FIRST_CATEGORY,SECOND_CATEGORY,THEME_CD,THEME_NM,SERIES_CD,SERIES_NM,SIDO_NAME,SOJANG_COUNCIL,LINK_DATA,MAIN_IMG,MGNT_NO,TAGS_TITLE,ALIAS,NUMBER_TITLE,SEARCH_THEME_CD,SEARCH_THEME_NM,NUMBER_SUMMARY,INTERFACE_ID,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,FIRST_CLASS_NM,SECOND_CLASS_NM,COUNCIL,KEYWORDS,CONTENT_TYPE_NAME,GENYEAR_SCH,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,FIRST_TOPIC,SECOND_TOPIC,ID,MEDIA_ID,ORG_OPEN_AT,ASSET_TYPE,ASSETS_ID,STRE_FILE_NAME,CONTENT_ID,CONT_TYPE",// set document field + "", // set date range + "", // set rank range + "", // set prefix query, example: |/1, (fieldname:contains:value) and ' ', or '|', not '!' / operator (AND:1, OR:0) + "", // set collection query (/option...) and ' ', or '|' + "", // set boost query ( | ...) and ' ', or '|' + "", // set filter operation () + "", // set groupby field(field, count) + "", // set sort field group(field/order,field/order,...) + "", // set categoryBoost(fieldname,matchType,boostID,boostKeyword) + "", // set categoryGroupBy (fieldname:value) + "", // set categoryQuery (fieldname:value) + "", // set property group (fieldname,min,max, groupcount) + "TRS_AGE,FIRST_CATEGORY,SECOND_CATEGORY,FIRST_CLASS,SECOND_CLASS,SOJANG_COUNCIL,MGNT_NO,SIDO_NAME,THEME_CD,THEME_NM,SERIES_CD,SERIES_NM,SEARCH_THEME_NM,SEARCH_THEME_CD", // use check prefix query filed + "READ_CNT,GENYEAR,CHRONOLOGICAL_START,CHRONOLOGICAL_END", // set use check fast access field + "", // set multigroupby field + "", // set auth query (Auth Target Field, Auth Collection, Auth Reference Field, Authority Query) + "", // set Duplicate Detection Criterion Field, RANK/DESC,DATE/DESC + "total" // collection display name + } + , + { + "culturePostHot", // set index name + "culturePostHot", // set collection name + "0,3", // set pageinfo (start,count) + "1,0,0,1,0", // set query analyzer (useKMA,isCase,useOriginal,useSynonym, duplcated detection) + "RANK/DESC,DATE/DESC", // set sort field (field,order) multi sort '/' + "basic,rpfmo,100", // set sort field (field,order) multi sort '/' + "TITLE,SUMMARY,INTERFACE_ID,GENYEAR_SCH,TRS_AGE_EX,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,FIRST_TOPIC,SECOND_TOPIC",// set search field + "DOCID,DATE,TITLE,SUMMARY,LINK_DATA,TAGS,MAIN_IMG,READ_CNT,INTERFACE_ID,GENYEAR,TRS_AGE,CHRONOLOGICAL_START,CHRONOLOGICAL_END,FIRST_TOPIC,SECOND_TOPIC,ID,KEYWORDS,THEME_CD,THEME_NM,SERIES_CD,SERIES_NM,ALIAS,GENYEAR_SCH,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH",// set document field + "", // set date range + "", // set rank range + "", // set prefix query, example: |/1, (fieldname:contains:value) and ' ', or '|', not '!' / operator (AND:1, OR:0) + "", // set collection query (/option...) and ' ', or '|' + "", // set boost query ( | ...) and ' ', or '|' + "", // set filter operation () + "", // set groupby field(field, count) + "", // set sort field group(field/order,field/order,...) + "", // set categoryBoost(fieldname,matchType,boostID,boostKeyword) + "", // set categoryGroupBy (fieldname:value) + "", // set categoryQuery (fieldname:value) + "", // set property group (fieldname,min,max, groupcount) + "TRS_AGE,KEYWORDS", // use check prefix query filed + "READ_CNT,GENYEAR,CHRONOLOGICAL_START,CHRONOLOGICAL_END", // set use check fast access field + "", // set multigroupby field + "", // set auth query (Auth Target Field, Auth Collection, Auth Reference Field, Authority Query) + "", // set Duplicate Detection Criterion Field, RANK/DESC,DATE/DESC + "culturePostHot" // collection display name + } + , + { + "toon", // set index name + "toon", // set collection name + "0,3", // set pageinfo (start,count) + "1,0,0,1,0", // set query analyzer (useKMA,isCase,useOriginal,useSynonym, duplcated detection) + "RANK/DESC,DATE/DESC", // set sort field (field,order) multi sort '/' + "basic,rpfmo,100", // set sort field (field,order) multi sort '/' + "TITLE,SUMMARY,INTERFACE_ID,GENYEAR_SCH,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,FIRST_CLASS_NM,SECOND_CLASS_NM,TAGS",// set search field + "DOCID,DATE,TITLE,SUMMARY,FIRST_CLASS,SECOND_CLASS,SOJANG_COUNCIL,TAGS,KEYWORDS,READ_CNT,INTERFACE_ID,GENYEAR,TRS_AGE,CHRONOLOGICAL_START,CHRONOLOGICAL_END,FIRST_CATEGORY,SECOND_CATEGORY,SEARCH_CLASS,AUTHOR,PUBLISHER,FIRST_CATEGORY_NM,SECOND_CATEGORY_NM,SOJANG_COUNCIL_NM,SIDO_NAME,SIGUNGU_NAME,TRS_SIDO_NAME,TRS_SIGUNGU_NAME,FIRST_CLASS_NM,SECOND_CLASS_NM,SEARCH_AREA_COUNCIL,LINK_DATA,ASSETS_ID,MEDIA_ID,MAIN_IMG,MGNT_NO,ASSET_TYPE,THEME,SERIES,ORG_OPEN_AT,STRE_FILE_NAME,SUBTITLE,ADDITION,ORIGNL_FILE_NAME,FILE_SIZE,WIDTH,HEIGHT,IMG_ALT,MEDIA_TYPE,PLAYER_AT,PLAY_TIME,VOLUME,TOTAL_PAGE,ISBN,WEBSITE_NAME,LINK_USE_AT,MAKING_DATE,FILMING_LOCATION,SUBTITLE_AT,SUBTITLE_ORG_FILE_NAME,SUBTITLE_STRE_FILE_NAME,SUBTITLE_DESC,PROVIDER,SOURCE_AT,SOURCE,COPYRIGHT,RETENTION_PERIOD,COPYRIGHT_MGNT_DEPART,THIRD_COPYRIGHT,CCL_TYPE,UPDATED_AT,DELETED_AT,USE_AT,REMARKS_DESC,RECOMMEND_YN,GENYEAR_SCH,CHRONOLOGICAL_START_SCH,CHRONOLOGICAL_END_SCH",// set document field + "", // set date range + "", // set rank range + "", // set prefix query, example: |/1, (fieldname:contains:value) and ' ', or '|', not '!' / operator (AND:1, OR:0) + "", // set collection query (/option...) and ' ', or '|' + "", // set boost query ( | ...) and ' ', or '|' + "", // set filter operation () + "", // set groupby field(field, count) + "", // set sort field group(field/order,field/order,...) + "", // set categoryBoost(fieldname,matchType,boostID,boostKeyword) + "", // set categoryGroupBy (fieldname:value) + "", // set categoryQuery (fieldname:value) + "", // set property group (fieldname,min,max, groupcount) + "TRS_AGE,KEYWORDS", // use check prefix query filed + "READ_CNT,GENYEAR,CHRONOLOGICAL_START,CHRONOLOGICAL_END", // set use check fast access field + "", // set multigroupby field + "", // set auth query (Auth Target Field, Auth Collection, Auth Reference Field, Authority Query) + "", // set Duplicate Detection Criterion Field, RANK/DESC,DATE/DESC + "toon" // collection display name + } + , + { + "ocr", // set index name + "ocr", // set collection name + "0,3", // set pageinfo (start,count) + "1,0,0,1,0", // set query analyzer (useKMA,isCase,useOriginal,useSynonym, duplcated detection) + "RANK/DESC,DATE/DESC", // set sort field (field,order) multi sort '/' + "basic,rpfmo,100", // set sort field (field,order) multi sort '/' + "OCR_TEXT",// set search field + "DOCID,ID,MEDIA_ID,FIRST_PAGE_NUM,LAST_PAGE_NUM,ORDER_NUM,OCR_TEXT,FILE_NAME,ALIAS",// set document field + "", // set date range + "", // set rank range + "", // set prefix query, example: |/1, (fieldname:contains:value) and ' ', or '|', not '!' / operator (AND:1, OR:0) + "", // set collection query (/option...) and ' ', or '|' + "", // set boost query ( | ...) and ' ', or '|' + "", // set filter operation () + "", // set groupby field(field, count) + "", // set sort field group(field/order,field/order,...) + "", // set categoryBoost(fieldname,matchType,boostID,boostKeyword) + "", // set categoryGroupBy (fieldname:value) + "", // set categoryQuery (fieldname:value) + "", // set property group (fieldname,min,max, groupcount) + "MEDIA_ID", // use check prefix query filed + "ID", // set use check fast access field + "", // set multigroupby field + "", // set auth query (Auth Target Field, Auth Collection, Auth Reference Field, Authority Query) + "", // set Duplicate Detection Criterion Field, RANK/DESC,DATE/DESC + "ocr" // collection display name + } + + }; + } + } diff --git a/src/main/java/kccf/sch/common/WNCommon.java b/src/main/java/kccf/sch/common/WNCommon.java new file mode 100644 index 00000000..f99657fa --- /dev/null +++ b/src/main/java/kccf/sch/common/WNCommon.java @@ -0,0 +1,1583 @@ +package kccf.sch.common; + + +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import QueryAPI530.Search; +import static kccf.sch.common.WNUtils.*; + +public class WNCommon { + private static final Logger LOGGER = LoggerFactory.getLogger(WNCommon.class); + private Search search = null; + boolean isDebug = false; + + /** + * SF-1 Search 클래스 객체를 생성하는 WNCommon의 생성자 함수이다. + */ + public WNCommon() { + this.search = new Search(); + } + + /** + * 검색 질의 키워드와 질의나 출력에 사용될 문자집합을 정한다. v4.x 호환 method이므로 + * COMMON_OR_WHEN_NORESULT을 지정하지 않는다. + * + * @param query + * @param charSet + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + * @deprecated As of v4.x, replaced by + * {@link #setCommonQuery(String,String,int)} + */ + public int setCommonQuery(String query, String charSet) { + int ret = 0; + ret = search.w3SetCodePage(charSet); + ret = search.w3SetQueryLog(1); + ret = search.w3SetTraceLog(0); + ret = search.w3SetCommonQuery(query, 0); + return ret; + } + + /** + * 검색 질의 UID와 질의나 출력에 사용될 문자집합을 정한다. + * + * @param charSet + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setUidQuery(String charSet) { + int ret = 0; + ret = search.w3SetCodePage(charSet); + ret = search.w3SetQueryLog(0); + return ret; + } + + /** + * 검색 질의 키워드와 질의나 출력에 사용될 문자집합을 정한다. + * + * @param query + * @param charSet + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setCommonQuery(String query, String charSet, int useOrResult, + boolean useSuggestedQuery) { + int ret = 0; + ret = search.w3SetCodePage(charSet); + ret = search.w3SetQueryLog(1); + ret = search.w3SetTraceLog(0); + ret = search.w3SetCommonQuery(query, useOrResult); + if (useSuggestedQuery) { + ret = search.w3SetSpellCorrectionQuery(query, 0); + } + return ret; + } + + /** + * setCommonQuery의 오버로딩(overloading) 함수로 session정보를 부가기능으로 사용할 수 있다. v4.x 호환 + * method이므로 COMMON_OR_WHEN_NORESULT을 지정하지 않는다. + * + * @param query + * @param charSet + * @param logInfo + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + * @deprecated As of v4.x, replaced by + * {@link #setCommonQuery(String,String,String[],int)} + */ + public int setCommonQuery(String query, String charSet, String[] logInfo) { + int ret = 0; + if (logInfo != null && logInfo.length > 2) { + ret = search.w3SetSessionInfo(logInfo[0], logInfo[1], logInfo[2]); + } + setCommonQuery(query, charSet); + return ret; + } + + /** + * setCommonQuery의 오버로딩(overloading) 함수로 session정보를 부가기능으로 사용할 수 있다. + * + * @param query + * @param charSet + * @param logInfo + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setCommonQuery(String query, String charSet, int useOrResult, + String[] logInfo) { + int ret = 0; + if (logInfo != null && logInfo.length > 2) { + ret = search.w3SetSessionInfo(logInfo[0], logInfo[1], logInfo[2]); + } + ret = search.w3SetCodePage(charSet); + ret = search.w3SetQueryLog(1); + ret = search.w3SetCommonQuery(query, useOrResult); + return ret; + } + + /** + * setCommonQuery의 오버로딩(overloading) 함수로 session정보를 부가기능으로 사용할 수 있다. + * + * @param query + * @param charSet + * @param logInfo + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setCommonQuery(String query, String charSet, int useOrResult, + boolean useSuggestedQuery, String[] logInfo) { + int ret = 0; + if (logInfo != null && logInfo.length > 2) { + ret = search.w3SetSessionInfo(logInfo[0], logInfo[1], logInfo[2]); + } + ret = search.w3SetCodePage(charSet); + ret = search.w3SetQueryLog(1); + ret = search.w3SetCommonQuery(query, useOrResult); + if (useSuggestedQuery) { + ret = search.w3SetSpellCorrectionQuery(query, 0); + } + return ret; + } + + /** + * 컬렉션 별로 검색어 지정 + * + * @param collectionName + * @param query + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setCollectionQuery(String collectionName, String query) { + return search.w3SetCollectionQuery(collectionName, query); + } + + /** + * 컬렉션 별로 boost query 지정 + * + * @param collectionName + * @param boost + * query + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setBoostQuery(String collectionName, String query) { + int idx = query.lastIndexOf("/"); + int option = Integer.parseInt(query.substring(idx, query.length())); + return search.w3SetBoostQuery(collectionName, query, option); + } + + /** + * 컬렉션 별로 boost query 지정 + * + * @param collectionName + * @param boost + * query + * @param option + * 0,1,2 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setBoostQuery(String collectionName, String query, int option) { + return search.w3SetBoostQuery(collectionName, query, option); + } + + /** + * 검색하고자 하는 컬렉션의 UID를 설정한다. + * + * @param collectionName + * @param values + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setUid(String collectionName, String[] values, String searcherId) { + int ret = 0; + for (int i = 0; i < values.length; i++) { + long uid = 0L; + try { + uid = Long.parseLong(values[i]); + } catch (NumberFormatException e) { + return -1; + } + ret = search.w3AddUid(collectionName, uid, searcherId); + } + return ret; + } + + /** + * 검색대상 컬렉션, 언어분석기 사용유무, 대소문자 구분유무를 설정한다. v4.x 호환 method이므로 USEORIGINAL, + * USESYNONYM을 지정하지 않는다. + * + * @param collectionName + * @param useKma + * @param isCase + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + * @deprecated As of v4.5, replaced by + * {@link #addCollection(String,int,int,int,int,int)} + */ + public int addCollection(String collectionName, int useKma, int isCase) { + int ret = 0; + ret = search.w3AddCollection(collectionName); + // USEMA, ISCASE, USEORIGINAL, USESYNONYM + ret = search.w3SetQueryAnalyzer(collectionName, useKma, isCase, 1, 1); + ret = search.w3SetDuplicateDetection(collectionName); + // systemOut("[w3AddCollection] "+collectionName); + return ret; + } + + /** + * 검색대상 컬렉션, 언어분석기 사용유무, 대소문자 구분유무를 설정한다. + * + * @param collectionName + * @param useKma + * @param isCase + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addCollection(String collectionName, int useKma, int isCase, + int useOriginal, int useSynonym, int duplicateDectection) { + int ret = 0; + ret = search.w3AddCollection(collectionName); + // USEMA, ISCASE, USEORIGINAL, USESYNONYM + ret = search.w3SetQueryAnalyzer(collectionName, useKma, isCase, + useOriginal, useSynonym); + // systemOut("[w3AddCollection] "+collectionName); + if (duplicateDectection == 1) { + ret = search.w3SetDuplicateDetection(collectionName); + } + return ret; + } + + /** + * 추상 컬렉션 추가 v4.x 호환 method이므로 USEORIGINAL, USESYNONYM을 지정하지 않는다. + * + * @param aliasName + * 설정한 별칭 컬렉션명 + * @param collectionName + * 실제 컬렉션 + * @param useKma + * @param isCase + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + * @deprecated As of v4.5, replaced by + * {@link #addAliasCollection(String,String,int,int,int,int,int)} + */ + public int addAliasCollection(String aliasName, String collectionName, + int useKma, int isCase) { + int ret = 0; + ret = search.w3AddAliasCollection(aliasName, collectionName); + ret = search.w3SetQueryAnalyzer(aliasName, useKma, isCase, 1, 1); + ret = search.w3SetDuplicateDetection(aliasName); + return ret; + } + + /** + * 추상 컬렉션 추가 + * + * @param aliasName + * 설정한 별칭 컬렉션명 + * @param collectionName + * 실제 컬렉션 + * @param useKma + * @param isCase + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addAliasCollection(String aliasName, String collectionName, + int useKma, int isCase, int useOriginal, int useSynonym, + int duplicateDectection) { + int ret = 0; + ret = search.w3AddAliasCollection(aliasName, collectionName); + ret = search.w3SetQueryAnalyzer(aliasName, useKma, isCase, useOriginal, + useSynonym); + if (duplicateDectection == 1) { + ret = search.w3SetDuplicateDetection(aliasName); + } + return ret; + } + + /** + * 검색기 연결 + * + * @param ip + * @param port + * @param timeOut + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int getConnection(String ip, int port, int timeOut) { + int ret = search.w3ConnectServer(ip, port, timeOut); + return ret; + } + + /** + * 해당 컬렉션의 검색 대상 필드를 여러 개를 설정한다. v4.x 호환 method이므로 fieldscore를 지정하지 않는다. + * + * @param collectionName + * @param fields + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + * @deprecated As of v4.5, replaced by + * {@link #setSearchField(String,String)} + **/ + public int addSearchField(String collectionName, String[] fields) { + int ret = 0; + for (int i = 0; i < fields.length; i++) { + ret = search.w3AddSearchField(collectionName, fields[i]); + systemOut("[w3AddSearchField] " + collectionName + " / " + + fields[i]); + } + return ret; + } + + /** + * 검색 필드별 랭킹 스코어(score)를 설정한다. + * + * @param collectionName + * @param fields + * TITLE,CONTENT + * @param rankScores + * 100,30 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addSearchFieldScore(String collectionName, String[] fields, + int[] rankScores) { + int ret = 0; + for (int i = 0; i < fields.length; i++) { + ret = search.w3AddSearchFieldScore(collectionName, fields[i], + rankScores[i]); + systemOut("[w3AddSearchFieldScore] " + collectionName + " / " + + fields[i] + "/" + rankScores[i]); + } + return ret; + } + + /** + * 해당 컬렉션의 검색 대상 필드를 여러 개를 설정한다. + * + * @param collectionName + * @param fields + * TITLE/100,CONTENT/30 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setSearchField(String collectionName, String fields) { + int ret = 0; + String[] searchFieldTemp = split(fields, ","); // TITLE/100,CONTENT/30 + for (int i = 0; i < searchFieldTemp.length; i++) { + String[] searchField = split(searchFieldTemp[i], "/"); + if (searchField != null && searchField.length > 0) { + ret = search.w3AddSearchField(collectionName, searchField[0]); + systemOut("[w3AddSearchField] " + collectionName + " / " + + searchField[0]); + } + } + ret = search.w3SetSearchFieldScore(collectionName, fields); + systemOut("[w3AddSearchField] " + collectionName + " / " + fields); + return ret; + } + + /** + * 검색결과의 정렬필드를 설정한다. v4.x 호환 method + * + * @param collectionName + * @param sortField + * @param sortOrder + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + * @deprecated As of v4.5, replaced by {@link #setSortField(String,String)} + */ + public int addSortField(String collectionName, String sortField, + int sortOrder) { + int ret = 0; + ret = search.w3AddSortField(collectionName, sortField, sortOrder); + systemOut("[w3AddSortField] " + collectionName + " / " + sortField); + return ret; + } + + /** + * 검색결과의 정렬필드를 설정한다. + * + * @param collectionName + * @param sortValue + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setSortField(String collectionName, String sortValue) { + int ret = 0; + ret = search.w3SetSortField(collectionName, sortValue); + systemOut("[w3SetSortField] " + collectionName + " / " + sortValue); + return ret; + } + + /** + * 검색결과 RANKING을 설정한다. SF-1 v5.0 신규 추가 method. + * + * @param collectionName + * @param method + * 랭킹 메소드( basic, custom, BM25 ) + * @param option + * - p( proximity ) - r( field weight ) - k( multi keyword factor + * ) - f( frequency ) - m( morpheme ) - o( offset ) - l( length ) + * @param maxcount + * Ranking 표기의 MAX 값. (예) %로 표기할 시 100 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setRanking(String collectionName, String method, String option, + int maxcount) { + return search.w3SetRanking(collectionName, method, option, maxcount); + } + + /** + * 검색한 결과 랭크값에 대한 범위를 지정 + * + * @param collectionName + * Collection 이름 + * @param minRank + * 최소 랭킹 값 + * @param maxRank + * 최대 랭킹 값 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setRankRange(String collectionName, int minRank, int maxRank) { + return search.w3SetRankRange(collectionName, minRank, maxRank); + + } + + /** + * + * @param collectionName + * @param fieldNameValues + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setPrefixQuery(String collectionName, String fieldNameValues) { + // value값에 /가 있을 수 있으므로 >/로 찾아서 query와 연산자를 분리한다. + fieldNameValues = fieldNameValues.trim(); + int index = fieldNameValues.lastIndexOf("/"); + String prefixQuery = ""; + int operator = 1; + if (index != -1) { + prefixQuery = fieldNameValues.substring(0, index); + String temp = fieldNameValues.substring(index + 1, + fieldNameValues.length()); + temp = temp.trim(); + operator = Integer.parseInt(temp); + } else { + prefixQuery = fieldNameValues.trim(); + } + int ret = search + .w3SetPrefixQuery(collectionName, prefixQuery, operator); + systemOut("[w3SetPrefixQuery]" + fieldNameValues); + return ret; + } + + /** + * + * @param collectionName + * @param fieldNameValues + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setFilterOperation(String collectionName, String fieldNameValues) { + int ret = search.w3SetFilterQuery(collectionName, fieldNameValues); + systemOut("[w3SetFilterQuery]" + fieldNameValues); + return ret; + } + + /** + * + * @param collectionName + * @param fieldNameValues + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setFilterQuery(String collectionName, String fieldNameValues) { + int ret = search.w3SetFilterQuery(collectionName, fieldNameValues); + systemOut("[w3SetFilterQuery]" + fieldNameValues); + return ret; + } + + /** + * setResultField에서 지정한 결과 필드들의 값을 얻는 함수이다. v4.x 호환 method이다. displaylength를 + * 지정하지 않으므로 주의해야한다. + * + * @param collectionName + * @param fields + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + * @deprecated As of v4.5, replaced by + * {@link #setResultField(String,String)} + */ + public int setResultField(String collectionName, String[] fields) { + int ret = 0; + for (int i = 0; i < fields.length; i++) { + ret = search.w3AddDocumentField(collectionName, fields[i], 0); + systemOut("[w3AddDocumentField] " + collectionName + " / " + + fields[i]); + } + return ret; + } + + /** + * setResultField에서 지정한 결과 필드들의 값을 얻는 함수이다. + * + * @param collectionName + * @param fields + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setResultField(String collectionName, String fields) { + int ret = 0; + ret = search.w3SetDocumentField(collectionName, fields); + systemOut("[w3SetDocumentField] " + collectionName + " / " + fields); + return ret; + } + + /** + * 해당 컬렉션의 몇 번째 검색 결과부터 몇 개를 가져올 것인지를 지정하고 하이라이트 기능과 요약기능을 지정하는 함수이다. 검색 API + * v3.5에서는 w3SetHighlight의 파라미터가 2개이지만 v3.7에서는 3개이다. + * + * @param collName + * @param highlight + * @param startPos + * @param resultCnt + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setPageInfo(String collName, int highlight, int startPos, + int resultCnt) { + int ret = 0; + if (highlight == 1) { // OFF, ON + ret = search.w3SetHighlight(collName, 0, 1); + } else if (highlight == 2) { // ON , OFF + ret = search.w3SetHighlight(collName, 1, 0); + } else if (highlight == 3) { // ON, ON + ret = search.w3SetHighlight(collName, 1, 1); + } else {// OFF, OFF + ret = search.w3SetHighlight(collName, 0, 0); + } + // 페이지, 기본정렬 설정 + ret = search.w3SetPageInfo(collName, startPos, resultCnt); + + return ret; + } + + /** + * 검색한 결과 날짜/시간 범위를 지정하고 시작날짜와 종료날짜의 형식이 YYYY/MM/DD가 아니라면 변경할 문자를 인자로 지정한다. + * + * @param collectionName + * @param startDate + * @param endDate + * @param replaceChr + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setDateRange(String collectionName, String startDate, + String endDate, String replaceChr) { + // 날짜 조건 세팅 + int ret = 0; + if (!startDate.equals("") && !endDate.equals("")) { + startDate = replace(startDate, replaceChr, "/"); + endDate = replace(endDate, replaceChr, "/"); + ret = search.w3SetDateRange(collectionName, startDate, endDate); + } + return ret; + } + + /** + * + * @param collectionName + * @param field + * @param matchType + * @param boostID + * @param boostKeyword + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + * @deprecated As of v4.x, replaced by + * {@link #setBoostCategory(String,String,String,String)} + */ + public int setCategoryBoost(String collectionName, String field, + String matchType, String boostID, String boostKeyword) { + int ret = 0; + ret = search.w3SetBoostCategory(collectionName, field, matchType, + boostKeyword); + return ret; + } + + /** + * + * @param collectionName + * @param field + * @param matchType + * @param boostID + * @param boostKeyword + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setBoostCategory(String collectionName, String field, + String matchType, String boostID, String boostKeyword) { + return search.w3SetBoostCategory(collectionName, field, matchType, + boostKeyword); + } + + /** + * 검색결과에서 중복문서 정렬 기준을 설정한다. + * + * @param collectionName + * Collection 명 + * @param categoryGroup + * Category 그룹정보 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addDuplicateDetectionCriterionField(String collection, + String field, int nOrder) { + int ret = -1; + ret = search.w3AddDuplicateDetectionCriterionField(collection, field, + nOrder); + return ret; + } + + /** + * 검색결과에서 중복문서 정렬 기준을 설정한다. + * + * @param collectionName + * Collection 명 + * @param categoryGroup + * Category 그룹정보 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setDuplicateDetectionCriterionField(String collection, + String fieldList) { + int ret = -1; + ret = search.w3SetDuplicateDetectionCriterionField(collection, + fieldList); + return ret; + } + + /** + * 검색결과 패킷에 카테고리 지정 컬렉션의 카테고리 필드에서 Depth별 Category의 리스트를 포함시킨다. + * + * @param collectionName + * Collection 명 + * @param categoryGroup + * Category 그룹정보 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addCategoryGroupBy(String collectionName, String[] categoryGroup) { + int ret = -1; + int length = categoryGroup.length; + for (int i = 0; i < length; i++) { + String[] dataFields = split(categoryGroup[i], ":"); + if (dataFields.length == 2) { + // depthList depth의 list를 콤마(:) 로 구분하여 입력 + ret = search.w3AddCategoryGroupBy(collectionName, + dataFields[0], dataFields[1]); + } + } + return ret; + } + + /** + * 선택한 컬렉션 내의 선택 카테고리 필드의 값으로 검색결과를 필터링 한다. 혹은 다른 쿼리없이 본쿼리를 실행하면 해당 카테고리의 값에 + * 매치되는 문서를 출력한다. + * + * @param collectionName + * Collection 명 + * @param categoryQuery + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addCategoryQuery(String collectionName, String[] categoryQuery) { + int ret = -1; + int length = categoryQuery.length; + for (int i = 0; i < length; i++) { + String[] dataFields = split(categoryQuery[i], ":"); + if (dataFields.length == 2) { + ret = search.w3AddCategoryQuery(collectionName, dataFields[0], + dataFields[1]); + } + } + return ret; + } + + /** + * w3SetCategoryGroupBy를 통해 패킷에 포함된 해당 collection-field-depth를 key로 하는 카테고리의 + * 총 개수를 반환 + * + * @param collectionName + * 검색 대상 collection명 + * @param fieldName + * Category Field 명 + * @param depth + * 현재 그룹핑하여 보고자 하는 depth + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int getCategoryCount(String collectionName, String field, int depth) { + return search.w3GetCategoryCount(collectionName, field, depth); + } + + /** + * w3SetCategoryGroupBy를 통해 패킷에 포함된 해당 collection-field-depth를 key로 하는 카테고리 + * 중 categoryIdx번째의 완전한 카테고리 이름을 반환 + * + * @param collectionName + * 검색 대상 collection명 + * @param fieldName + * Category Field 명 + * @param depth + * 현재 그룹핑하여 보고자 하는 depth + * @param idx + * 해당 컬렉션-카테고리-Depth에 해당하는 카테고리 결과의 인덱스 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public String getCategoryName(String collectionName, String field, + int depth, int idx) { + return search.w3GetCategoryName(collectionName, field, depth, idx); + } + + /** + * w3SetCategoryGroupBy를 통해 패킷에 포함된 해당 collection-field-depth를 key로 하는 카테고리 + * 중 categoryIdx번째의 카테고리안에 몇 개의 문서가 포함되어있는지(검색 결과내에서)를 반환 + * + * @param collectionName + * 검색 대상 collection명 + * @param fieldName + * Category Field 명 + * @param depth + * 현재 그룹핑하여 보고자 하는 depth + * @param idx + * 해당 컬렉션-카테고리-Depth에 해당하는 카테고리 결과의 인덱스 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int getDocumentCountInCategory(String collectionName, String field, + int depth, int idx) { + return search.w3GetDocumentCountInCategory(collectionName, field, + depth, idx); + } + + /** + * 특정 필드의 값을 기준으로 범위 별로 그룹을 만들거나, 이 필드 값이 특정 범위에 속하는 레코드만 추출 @ + * collectionName @ field @ min @ max @ groupCount + */ + public int setPropertyGroup(String collectionName, String field, int min, + int max, int groupCount) { + int ret = 0; + ret = search.w3SetPropertyGroup(collectionName, field, min, max, + groupCount); + return ret; + } + + /** + * v3.7에서는 2개의 전달인자 v4.0에서는 3개의 전달인자 + * + * @param collectionName + * @param field + * @param docCount + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setGroupBy(String collectionName, String field, int docCount) { + int ret = 0; + ret = search.w3SetGroupBy(collectionName, field, docCount); + return ret; + } + + /** + * 단순히 최종 결과에서 특정 필드(들)값의 그룹핑된 결과를 얻어오기 원할 때 사용 + * + * @param collectionName + * 컬렉션명 + * @param fieldName + * 그룹핑할 필드명 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addMultiGroupBy(String collectionName, String fields) { + int ret = 0; + String[] field = split(fields, ","); + int length = field.length; + for (int i = 0; i < length; i++) { + ret = search.w3AddMultiGroupBy(collectionName, field[i]); + } + return ret; + } + + public int setMultiGroupBy(String collectionName, String fields) { + return search.w3SetMultiGroupBy(collectionName, fields); + } + + /** + * 멀티 그룹바이된 결과를 반환 + * + * @param collectionName + * 컬렉션명 + * @param fieldName + * 그룹핑할 필드명 + * @return 성공 시 해당 컬렉션 결과에서 인자로 주어진 필드의 그룹핑 결과 문자열을 반환하며, 에러 발생시 빈 문자열을 반환 + */ + public String getMultiGroupByResult(String collectionName, String field) { + String ret = ""; + ret = search.w3GetMultiGroupByResult(collectionName, field); + return ret; + } + + /** + * 그룹 검색결과의 정렬필드를 설정한다. + * + * @param collectionName + * @param sortField + * @param sortOrder + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addSortFieldInGroup(String collectionName, String sortField, + int sortOrder) { + int ret = 0; + ret = search + .w3AddSortFieldInGroup(collectionName, sortField, sortOrder); + systemOut("[w3AddSortFieldInGroup] " + collectionName + " / " + + sortField); + return ret; + } + + /** + * 그룹내의 문서들의 정렬 정보들을 지정해 주는 함수 + * + * @param collectionName + * @param sortValue + * url/DESC,RANK/DESC,DATE/ASC + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setSortFieldInGroup(String collectionName, String sortValue) { + int ret = 0; + ret = search.w3SetSortFieldInGroup(collectionName, sortValue); + systemOut("[w3SetSortFieldInGroup] " + collectionName + " / " + + sortValue); + return ret; + } + + /** + * 권한 쿼리 (Authority Query) + * + * @param collection + * @param authTargetField + * @param authCollection + * @param authReferField + * @param authorityQuery + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int setAuthorityQuery(String collection, String authTargetField, + String authCollection, String authReferField, String authorityQuery) { + int ret = search.w3SetAuthorityQuery(collection, authTargetField, + authCollection, authReferField, authorityQuery); + systemOut("[w3SetAuthorityQuery]" + authorityQuery); + return ret; + } + + /** + * + * @param collectionName + * @return 검색기로부터 받아온 속성 그룹의 개수를 반환 + */ + public int getCountPropertyGroup(String collectionName) { + return search.w3GetCountPropertyGroup(collectionName); + } + + /** + * + * @param collectionName + * @return 전체 그룹 개수 + */ + public int getResultGroupCount(String collectionName) { + return search.w3GetResultGroupCount(collectionName); + } + + /** + * + * @param collectionName + * @return 전체 그룹 개수 + */ + public int getResultTotalGroupCount(String collectionName) { + return search.w3GetResultTotalGroupCount(collectionName); + } + + /** + * + * @param collectionName + * @parma groupIndex + * @return 그룹에 속하는 문서 중 가져온 문서 개수 + */ + public int getCountInGroup(String collectionName, int groupIndex) { + return search.w3GetCountInGroup(collectionName, groupIndex); + } + + /** + * + * @param collectionName + * @parma groupIndex + * @return 그룹에 속하는 전체문서 개수 + */ + public int getTotalCountInGroup(String collectionName, int groupIndex) { + return search.w3GetTotalCountInGroup(collectionName, groupIndex); + } + + /** + * + * @param collectionName + * @return 성공시 해당 속성 그룹의 최소값을 반환하며, 에러 발생시 음수를 반환 + */ + public int getMinValuePropertyGroup(String collectionName) { + return search.w3GetMinValuePropertyGroup(collectionName); + } + + /** + * + * @param collectionName + * @return 성공시 해당 속성 그룹의 최대값을 반환하며, 에러 발생시 음수를 반환 + */ + public int getMaxValuePropertyGroup(String collectionName) { + return search.w3GetMaxValuePropertyGroup(collectionName); + } + + /** + * + * @param collectionName + * @parma groupIndex + * @return 성공시 속성 그룹 결과의 최소값을 반환하며, 에러 발생시 음수를 반환 + */ + public int getMinValueInPropertyGroup(String collectionName, int groupIndex) { + return search.w3GetMinValueInPropertyGroup(collectionName, groupIndex); + } + + /** + * + * @param collectionName + * @parma groupIndex + * @return 성공시 속성 그룹 결과의 최대값을 반환하며, 에러 발생시 음수를 반환 + */ + public int getMaxValueInPropertyGroup(String collectionName, int groupIndex) { + return search.w3GetMaxValueInPropertyGroup(collectionName, groupIndex); + } + + /** + * + * @param collectionName + * @parma groupIndex + * @return 지정된 속성 그룹 내 문서개수를 반환 + */ + public int getDocumentCountInPropertyGroup(String collectionName, + int groupIndex) { + return search.w3GetDocumentCountInPropertyGroup(collectionName, + groupIndex); + } + + /** + * 그룹화된 문서 중 지정된 순서의 그룹 내에서 주어진 collection 결과 에서 index 번째 문서의 Collection ID를 + * 반환 + * + * @param collectionName + * @param groupIndex + * @param docIndex + * @return 그룹에 속하는 문서중 원하는 문서의 필드값 + */ + public String getCollectionIdInGroup(String collectionName, int groupIndex, + int docIndex) { + return search.w3GetCollectionIdInGroup(collectionName, groupIndex, + docIndex); + } + + /** + * + * @param collectionName + * @param groupIndex + * @param docIndex + * @return 그룹에 속하는 문서중 원하는 문서의 필드값 + */ + public long getRankInGroup(String collectionName, int groupIndex, + int docIndex) { + return search.w3GetRankInGroup(collectionName, groupIndex, docIndex); + } + + /** + * + * @param collectionName + * @param groupIndex + * @param docIndex + * @return 그룹에 속하는 문서중 원하는 문서의 필드값 + */ + public String getFieldInGroup(String collectionName, String fieldName, + int groupIndex, int docIndex) { + return search.w3GetFieldInGroup(collectionName, fieldName, groupIndex, + docIndex); + } + + /** + * + * @param collectionName + * @param groupIndex + * @param docIndex + * @return 그룹에 속하는 문서중 원하는 문서의 uid값 + */ + public long getUidInGroup(String collectionName, int groupIndex, + int docIndex) { + return search.w3GetUidInGroup(collectionName, groupIndex, docIndex); + } + + /** + * + * @param collectionName + * @param groupIndex + * @param docIndex + * @return 그룹에 속하는 문서중 원하는 문서의 가중치 값 + */ + public long getWeightInGroup(String collectionName, int groupIndex, + int docIndex) { + return search.w3GetWeightInGroup(collectionName, groupIndex, docIndex); + } + + /** + * + * @param collectionName + * @param groupIndex + * @param docIndex + * @return 그룹에 속하는 문서중 원하는 문서의 날짜 정보 + */ + public String getDateInGroup(String collectionName, int groupIndex, + int docIndex) { + return search.w3GetDateInGroup(collectionName, groupIndex, docIndex); + } + + /** + * + * @param collectionName + * @param groupIndex + * @param docIndex + * @return 그룹에 속하는 문서중 원하는 문서의 sc 정보 + */ + public String getSearcherIdInGroup(String collectionName, int groupIndex, + int docIndex) { + return search.w3GetSearcherIdInGroup(collectionName, groupIndex, + docIndex); + } + + /** + * v4.x 호환 method v5.0에서는 삭제되었다. 하이라이팅될 문자열을 보여주는 함수이다. + * + * @return 하이라이팅될 문자열 public String getHighlightKeyword() { String keyWord = + * this.search.w3GetHighlightKeyword().trim(); return keyWord; } + */ + + /** + * 형태소 분석된 결과 문자열을 보여주는 함수이다. + * + * @param colName + * @param field + * @return 하이라이팅될 문자열 + */ + public String getHighlightKeywordByField(String colName, String searchField) { + String keyWord = this.search + .w3GetHighlightByField(colName, searchField); + return keyWord; + } + + /** + * + * @param collectionName + * @return 검색결과 개수 + */ + public int getResultCount(String collectionName) { + return search.w3GetResultCount(collectionName); + } + + /** + * + * @param collectionName + * @return 검색결과 총 개수 + */ + public int getResultTotalCount(String collectionName) { + return search.w3GetResultTotalCount(collectionName); + } + + /** + * + * @param collectionName + * @param idx + * @return 검색한 해당 문서의 중복문서 개수를 반환 + */ + public int getDuplicateDocumentCount(String collectionName, int idx) { + return search.w3GetDuplicateDocumentCount(collectionName, idx); + } + + /** + * + * @param collectionName + * @param groupIndex + * @param docIndex + * @return 그룹화된 문서 중 지정된 순서의 그룹 내에서 각 결과들이 중복된 문서의 개수를 반환 + */ + public int getDuplicateDocumentCountInGroup(String collectionName, + int groupIndex, int docIndex) { + return search.w3GetDuplicateDocumentCountInGroup(collectionName, + groupIndex, docIndex); + } + + /** + * 최근에 검색된 키워드리스트를 반환한다. + * + * @param count + * @return 최근에 검색된 키워드리스트 + */ + public String[] receiveRecentQueryListResult(int mode, int count) { + int ret = search.w3ReceiveRecentQueryListResult(mode, count); + if (ret < 0) { + systemOut("[W3ReceiveRecentQueryListResult] " + + search.w3GetErrorInfo() + ", ret=" + ret); + return null; + } + int size = search.w3GetRecentQueryListSize(); + String[] keyList = new String[size]; + for (int i = 0; i < size; i++) { + keyList[i] = search.w3GetRecentQuery(i); + } + return keyList; + } + + /** + * 최근에 검색된 키워드리스트를 반환한다. + * + * @param count + * @return 최근에 검색된 키워드리스트 + */ + public int receiveRecentQueryListResultAsXml(int mode, int count) { + int ret = search.w3ReceiveRecentQueryListResultAsXml(mode, count); + if (ret < 0) { + systemOut("[w3ReceiveRecentQueryListResultAsXml] " + + search.w3GetErrorInfo() + ", ret=" + ret); + return -1; + } + return ret; + } + + /** + * 최근에 검색된 키워드리스트를 반환한다. + * + * @param count + * @return 최근에 검색된 키워드리스트 + */ + public int receiveRecentQueryListResultAsJson(int mode, int count) { + int ret = search.w3ReceiveRecentQueryListResultAsJson(mode, count); + if (ret < 0) { + systemOut("[w3ReceiveRecentQueryListResultAsJson] " + + search.w3GetErrorInfo() + ", ret=" + ret); + return -1; + } + return ret; + } + + /** + */ + public String getSuggestedQuery() { + return search.w3GetSuggestedQuery(); + } + + /** + * v4.x 호환 method + * + * @param mode + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + * @deprecated As of v4.x, replaced by + * {@link #receiveSearchQueryResult(int)} + */ + public int recvResult(int mode) { + int ret = search.w3ReceiveSearchQueryResult(mode); + return ret; + } + + /** + * + */ + public int recvDuplicateDocumentsResult(int mode) { + int ret = search.w3ReceiveDuplicateDocumentsResult(mode); + return ret; + } + + /** + * + */ + public int recvDuplicateDocumentsResultAsJson(int mode) { + int ret = search.w3ReceiveDuplicateDocumentsResultAsJson(mode); + return ret; + } + + /** + * + */ + public int recvDuplicateDocumentsResultAsXml(int mode) { + int ret = search.w3ReceiveDuplicateDocumentsResultAsXml(mode); + return ret; + } + + /** + * + * @param mode + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int receiveSearchQueryResult(int mode) { + int ret = search.w3ReceiveSearchQueryResult(mode); + return ret; + } + + /** + * + * @param mode + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int receiveSearchQueryResultAsXml(int mode) { + int ret = search.w3ReceiveSearchQueryResultAsXml(mode); + return ret; + } + + /** + * + * @param mode + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int receiveSearchQueryResultAsJson(int mode) { + int ret = search.w3ReceiveSearchQueryResultAsJson(mode); + return ret; + } + + /** + * + * @return 성공이면 검색결과를 XML로 반환한다. + */ + public String getResultXml() { + String ret = search.w3GetResultXml(); + return ret; + } + + /** + * + * @return 성공이면 검색결과를 JSON data로 반환한다. + */ + public String getResultJson() { + String ret = search.w3GetResultJson(); + return ret; + } + + /** + * UID 검색을 검색기에 전달하고, 결과를 받는 함수이다. v4.x 호환 method + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + * @deprecated As of v4.x, replaced by {@link #receiveUidResult(int)} + */ + public int recvDocument(int mode) { + int ret = search.w3ReceiveUidResult(mode); + return ret; + } + + /** + * UID 검색을 검색기에 전달하고, 결과를 받는 함수이다. + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int receiveUidResult(int mode) { + int ret = search.w3ReceiveUidResult(mode); + return ret; + } + + /** + * UID 검색을 검색기에 전달하고, 결과를 받는 함수이다. + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int receiveUidResultAsXml(int mode) { + int ret = search.w3ReceiveUidResultAsXml(mode); + return ret; + } + + /** + * UID 검색을 검색기에 전달하고, 결과를 받는 함수이다. + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int receiveUidResultAsJson(int mode) { + int ret = search.w3ReceiveUidResultAsJson(mode); + return ret; + } + + /** + * v4.x 호환 method + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + * @deprecated As of v4.x, replaced by + * {@link #receiveMorphemeAnalysisResult(int)} + */ + public int recvAnalyzedQuery(int mode) { + int ret = search.w3ReceiveMorphemeAnalysisResult(mode); + return ret; + } + + /** + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int receiveMorphemeAnalysisResult(int mode) { + int ret = search.w3ReceiveMorphemeAnalysisResult(mode); + return ret; + } + + /** + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int receiveMorphemeAnalysisResultAsXml(int mode) { + int ret = search.w3ReceiveMorphemeAnalysisResultAsXml(mode); + return ret; + } + + /** + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int receiveMorphemeAnalysisResultAsJson(int mode) { + int ret = search.w3ReceiveMorphemeAnalysisResultAsJson(mode); + return ret; + } + + /** + * 주어진 collection 결과 에서 index 번째 문서의 Collection ID를 반환한다. + * + * @param coll + * @param idx + * @return FIELD VALUE + */ + public String getCollectionId(String coll, int idx) { + return search.w3GetCollectionId(coll, idx); + } + + /** + * + * @param coll + * @param field + * @param idx + * @return FIELD VALUE + */ + public String getField(String coll, String field, int idx) { + return search.w3GetField(coll, field, idx); + } + + /** + * + * @param coll + * @param idx + * @return DATE + */ + public String getDate(String coll, int idx) { + return search.w3GetDate(coll, idx); + } + + /** + * + * @param coll + * @param idx + * @return DATE + */ + public long getWeight(String coll, int idx) { + return search.w3GetWeight(coll, idx); + } + + /** + * + * @param coll + * @param idx + * @return RANK + */ + public long getRank(String coll, int idx) { + return search.w3GetRank(coll, idx); + } + + /** + * + * @param coll + * @param idx + * @return UID + */ + public long getUid(String coll, int idx) { + return search.w3GetUid(coll, idx); + } + + /** + * + * @param coll + * @param idx + * @return SearcherId + */ + public String getSearcherId(String coll, int idx) { + return search.w3GetSearcherId(coll, idx); + } + + /* + * 여러 컬렉션의 검색결과를 하나의 가상 컬렉션(Merge Collection) 결과로 통합하여 가져오기 원할 때 사용하는 함수 + * + * @param mergeCollection 통합 가상 컬렉션명 + * + * @param collections[] (통합대상) 컬렉션명 + * + * @param start (결과 중) 시작 문서 인덱스 + * + * @param count (결과 중) 가져올 문서 개수 + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addMergeCollectionInfo(String mergeCollection, + String[] collections, int start, int count) { + int collectionLen = collections.length; + int ret = 0; + + for (int i = 0; i < collectionLen; i++) { + + ret = search.w3AddMergeCollection(mergeCollection, collections[i]); + } + + ret = search.w3SetMergePageInfo(mergeCollection, start, count); + + return ret; + } + + /* + * 통합 컬렉션(Merge Collection)의 결과 필드(Document Field)와 통합될 개별 컬렉션의 결과 필드를 1:N ( + * 0 < N < 64 ) 관계로 연결시킨다 + * + * @param mergeCollection 통합 가상 컬렉션명 + * + * @param mergeFields[] 가상 통합 컬렉션의 결과 필드명 + * + * @param collections[] (통합대상) 컬렉션명 + * + * @param fields[,] (통합대상) 컬렉션의 결과 필드명 + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addMergeDocumentField(String mergeCollection, + String[] mergeFields, String[] collections, String[][] fields) { + int ret = 0; + int collectionLen = collections.length; + int fieldsLen = mergeFields.length; + + for (int i = 0; i < collectionLen; i++) { + + for (int j = 0; j < fieldsLen; j++) { + ret = search.w3AddMergeDocumentField(mergeCollection, + mergeFields[j], collections[i], fields[i][j]); + } + } + return ret; + } + + /* + * w3AddMergeDocumentField 함수가 통합 컬렉션의 결과 필드를 정의 하였다면, 이 함수는 통합 컬렉션의 + * MultiGroupBy 필드명의 정의 및 개별 컬렉션의 MultiGroupBy 필드명과 연결시키는 역할 + * + * @param mergeCollection 통합 가상 컬렉션명 + * + * @param mergeFields[] 가상 통합 컬렉션의 결과 필드명 + * + * @param collections[] (통합대상) 컬렉션명 + * + * @param fields[,] (통합대상) 컬렉션의 결과 필드명 + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addMergeMultiGroupByField(String mergeCollection, + String[] mergeFields, String[] collections, String[][] fields) { + int ret = 0; + int collectionLen = collections.length; + int fieldsLen = mergeFields.length; + for (int i = 0; i < collectionLen; i++) { + for (int j = 0; j < fieldsLen; j++) { + ret = search.w3AddMergeMultiGroupByField(mergeCollection, + mergeFields[j], collections[i], fields[i][j]); + } + } + return ret; + } + + /* + * 통합 컬렉션의 CategoryGroupBy 필드명의 정의 및 개별 컬렉션의 CategoryGroupBy 필드명과 연결시키는 역할 + * + * @param mergeCollection 통합 가상 컬렉션명 + * + * @param mergeFields[] 가상 통합 컬렉션의 결과 필드명 + * + * @param collections[] (통합대상) 컬렉션명 + * + * @param fields[,] (통합대상) 컬렉션의 결과 필드명 + * + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int addMergeCategoryGroupByField(String mergeCollection, + String[] mergeFields, String[] collections, String[][] fields) { + int ret = 0; + int collectionLen = collections.length; + int fieldsLen = mergeFields.length; + for (int i = 0; i < collectionLen; i++) { + for (int j = 0; j < fieldsLen; j++) { + ret = search.w3AddMergeCategoryGroupByField(mergeCollection, + mergeFields[j], collections[i], fields[i][j]); + } + } + return ret; + } + + /* + * 검색기에서 받아올 통합 컬렉션(Merge Collection) 결과의 시작 인덱스와 문서 개수를 설정 CategoryGroupBy + * 필드명과 연결시키는 역할 + * + * @param mergeCollection 통합 가상 컬렉션명 + * + * @param collections (통합대상) 컬렉션명 + * + * @return 문서 개수 반환한다. + */ + public int getResultTotalCountInMerge(String mergeCollection, + String collection) { + return search.w3GetResultTotalCountInMerge(mergeCollection, collection); + } + + /** + * 네트워크 종료 + */ + public void closeServer() { + if (search != null) { + search.w3CloseServer(); + search = null; + } + } + + /** + * 인자로 전달받은 collection의 검색결과의 에러가 발생하면 에러 코드와 메시지를 반환한다. + * + * @param collectionName + * @return + */ + public String getCollectionErrorInfo(String collectionName) { + String errorMsg = ""; + int errorCode = search.w3GetCollectionError(collectionName); + if (errorCode != 0) { + errorMsg = search.w3GetCollectionErrorInfo(collectionName); + errorMsg = errorMsg + "(code:" + errorCode + + ")"; + } + return errorMsg; + } + + /** + * 검색결과의 에러가 발생하면 에러 코드와 메시지를 반환한다. + * + * @return + */ + public String getErrorInfo() { + String errorMsg = ""; + int errorCode = search.w3GetError(); + if (errorCode != 0) { + errorMsg = search.w3GetErrorInfo(); + errorMsg = errorMsg + "(code:" + errorCode + + ")"; + } + return errorMsg; + } + + /** + * 검색 api의 버전정보를 반환한다. + * + * @return + */ + public String getVersionInfo() { + return search.w3GetVersionInfo(); + } + + /** + * 에러 코드에 대한 에러정보를 web application의 standard out log에 출력한다. + * + * @param msg + */ + public void systemOut(String msg) { + if (isDebug) { + //System.out.println(msg + "
"); + } + } + +} diff --git a/src/main/java/kccf/sch/common/WNDefine.java b/src/main/java/kccf/sch/common/WNDefine.java new file mode 100644 index 00000000..4099103c --- /dev/null +++ b/src/main/java/kccf/sch/common/WNDefine.java @@ -0,0 +1,73 @@ +package kccf.sch.common; +public class WNDefine { + public final static int CONNECTION_TIMEOUT = 20000; + public final static String CHARSET = "UTF-8"; + public final static int REALTIME_COUNT=100; + public final static int PAGE_SCALE = 10; //view page list count + + public final static int CONNECTION_KEEP = 0; //recevive mode + public final static int CONNECTION_REUSE = 2; + public final static int CONNECTION_CLOSE = 3; + + public final static int ASC = 0; //order + public final static int DESC = 1; //order + + public final static int USE_KMA_OFFOFF = 0; //synonym, morpheme + public final static int USE_KMA_ONON = 1; + public final static int USE_KMA_ONOFF = 2; + + public final static int USE_RESULT_STRING = 0; //result data type + public final static int USE_RESULT_XML = 1; + public final static int USE_RESULT_JSON = 2; + public final static int USE_RESULT_DUPLICATE_STRING = 3; //uid result data type + public final static int USE_RESULT_DUPLICATE_XML = 4; + public final static int USE_RESULT_DUPLICATE_JSON = 5; + + public final static int IS_CASE_ON = 1; //case on, off + public final static int IS_CASE_OFF = 0; + + public final static int HI_SUM_OFFOFF = 0; //summarizing, highlighting + public final static int HI_SUM_OFFON = 1; + public final static int HI_SUM_ONOFF = 2; + public final static int HI_SUM_ONON = 3; + + public final static int COMMON_OR_WHEN_NORESULT_OFF = 0; + public final static int COMMON_OR_WHEN_NORESULT_ON = 1; + + public final static int INDEX_NAME = 0; + public final static int COLLECTION_NAME = 1; + public final static int PAGE_INFO = 2; + public final static int ANALYZER = 3; + public final static int SORT_FIELD = 4; + public final static int RANKING_OPTION = 5; + public final static int SEARCH_FIELD = 6; + public final static int RESULT_FIELD = 7; + public final static int DATE_RANGE = 8; + public final static int RANK_RANGE = 9; + public final static int EXQUERY_FIELD = 10; + public final static int COLLECTION_QUERY =11; + public final static int BOOST_QUERY =12; + public final static int FILTER_OPERATION = 13; + public final static int GROUP_BY = 14; + public final static int GROUP_SORT_FIELD = 15; + public final static int CATEGORY_BOOST = 16; + public final static int CATEGORY_GROUPBY = 17; + public final static int CATEGORY_QUERY = 18; + public final static int PROPERTY_GROUP = 19; + public final static int PREFIX_FIELD = 20; + public final static int FAST_ACCESS = 21; + public final static int MULTI_GROUP_BY = 22; + public final static int AUTH_QUERY = 23; + public final static int DEDUP_SORT_FIELD = 24; + public final static int COLLECTION_KOR = 25; + + public final static int MERGE_COLLECTION_NAME = 0; + public final static int MERGE_MAPPING_COLLECTION_NAME = 1; + public final static int MERGE_PAGE_INFO = 2; + public final static int MERGE_RESULT_FIELD = 3; + public final static int MERGE_MAPPING_RESULT_FIELD = 4; + public final static int MERGE_MULTI_GROUP_BY_FIELD = 5; + public final static int MERGE_MAPPING_MULTI_GROUP_BY_FIELD = 6; + public final static int MERGE_CATEGORY_GROUPBY_FIELD = 7; + public final static int MERGE_MAPPING_CATEGORY_GROUPBY_FIELD = 8; +} diff --git a/src/main/java/kccf/sch/common/WNSearch.java b/src/main/java/kccf/sch/common/WNSearch.java new file mode 100644 index 00000000..19909d69 --- /dev/null +++ b/src/main/java/kccf/sch/common/WNSearch.java @@ -0,0 +1,2443 @@ +package kccf.sch.common; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; +import static kccf.sch.common.WNUtils.*; +import static kccf.sch.common.WNDefine.*; + +import kccf.sch.service.vo.Sf1VO; + + + + +public class WNSearch { + private WNCommon common ; + private WNCollection wncol; + private String[] collection ; + private String[] mergeCollections ; + private String[] searchFields; + private String managerURL = ""; + private int hiSum = 0; + private int connectionOpt = 0; + private StringBuffer sb = null; + private StringBuffer warningMsg = null; + + private String searcherId = ""; + private boolean isDebug = false; + private boolean isUidSrch = false; + private int resultType = 0; + + public String realTimeKeywords= ""; + public String suggestedQuery = ""; + + private Sf1VO sf1Vo; + + public void setSf1Vo(Sf1VO sf1Vo) { + this.sf1Vo = sf1Vo; + } + + /** + * WNCommon객체를 생성하고 검색 대상 컬렉션과 검색 대상 필드들을 설정한다. + * @param searcherId 검색 대상 sc id + * @param isDebug 검색설정을 화면에 출력할 것인지 여부를 결정 + * @param isUidSrch 키워드 검색을 할 것인지 UID 검색을 할 것인지 여부를 결정 + * @param collections 검색하고자 하는 컬렉션들을 Array로 지정한다. + * @param searchFields 검색하고자 하는 검색필드들을 Array로 지정한다. + */ + public WNSearch(String searcherId, boolean isDebug, boolean isUidSrch, + String[] collections, String[] searchFields){ + this.common = new WNCommon(); + this.wncol = new WNCollection(); + this.collection = collections; + this.searchFields = searchFields; + this.sb = new StringBuffer(); + this.warningMsg = new StringBuffer(); + this.isDebug = isDebug; + this.isUidSrch = isUidSrch; + this.searcherId = searcherId; + } + + /** + * WNCommon객체를 생성하고 검색 대상 컬렉션과 검색 대상 필드들을 설정한다. + * @param searcherId 검색 대상 sc id + * @param isDebug 검색설정을 화면에 출력할 것인지 여부를 결정 + * @param isUidSrch 키워드 검색을 할 것인지 UID 검색을 할 것인지 여부를 결정 + * @param collections 검색하고자 하는 컬렉션들을 Array로 지정한다. + * @param searchFields 검색하고자 하는 검색필드들을 Array로 지정한다. + * @param resultType 검색결과를 반환받고자 하는 데이터 형태 + */ + public WNSearch(String searcherId, boolean isDebug, boolean isUidSrch, + String[] collections, String[] searchFields, int resultType){ + this.common = new WNCommon(); + this.wncol = new WNCollection(); + this.collection = collections; + this.searchFields = searchFields; + this.sb = new StringBuffer(); + this.warningMsg = new StringBuffer(); + this.isDebug = isDebug; + this.isUidSrch = isUidSrch; + this.searcherId = searcherId; + this.resultType = resultType; + } + + /** + * WNCommon객체를 생성하고 검색 대상 컬렉션과 검색 대상 필드들을 설정한다. + * @param searcherId 검색 대상 sc id + * @param isDebug 검색설정을 화면에 출력할 것인지 여부를 결정 + * @param isUidSrch 키워드 검색을 할 것인지 UID 검색을 할 것인지 여부를 결정 + * @param collections 검색하고자 하는 컬렉션들을 Array로 지정한다. + * @param mergeCollections 검색하고자 하는 가상통합컬렉션을 Array로 지정한다. + * @param searchFields 검색하고자 하는 검색필드들을 Array로 지정한다. + * @param resultType 검색결과를 반환받고자 하는 데이터 형태 + */ + public WNSearch(String searcherId, boolean isDebug, boolean isUidSrch, + String[] collections, String[] mergeCollections, String[] searchFields, int resultType){ + this.common = new WNCommon(); + this.wncol = new WNCollection(); + this.collection = collections; + this.mergeCollections = mergeCollections; + this.searchFields = searchFields; + this.sb = new StringBuffer(); + this.warningMsg = new StringBuffer(); + this.isDebug = isDebug; + this.isUidSrch = isUidSrch; + this.searcherId = searcherId; + this.resultType = resultType; + } + + /** + * WNCommon객체를 생성하고 검색 대상 컬렉션과 검색 대상 필드들을 설정한다. + * @param isDebug 검색설정을 화면에 출력할 것인지 여부를 결정 + * @param isUidSrch 키워드 검색을 할 것인지 UID 검색을 할 것인지 여부를 결정 + * @param collections 검색하고자 하는 컬렉션들을 Array로 지정한다. + * @param searchFields 검색하고자 하는 검색필드들을 Array로 지정한다. + * @param resultType 검색결과를 반환받고자 하는 데이터 형태 + */ + public WNSearch(boolean isDebug, boolean isUidSrch, String[] collections, + String[] searchFields, int resultType){ + this.common = new WNCommon(); + this.wncol = new WNCollection(); + this.collection = collections; + this.searchFields = searchFields; + this.sb = new StringBuffer(); + this.warningMsg = new StringBuffer(); + this.isDebug = isDebug; + this.isUidSrch = isUidSrch; + this.resultType = resultType; + } + + /** + * WNCommon객체를 생성하고 검색 대상 컬렉션과 검색 대상 필드들을 설정한다. + * @param isDebug 검색설정을 화면에 출력할 것인지 여부를 결정 + * @param isUidSrch 키워드 검색을 할 것인지 UID 검색을 할 것인지 여부를 결정 + * @param collections 검색하고자 하는 컬렉션들을 Array로 지정한다. + * @param mergeCollections 검색하고자 하는 가상통합컬렉션을 Array로 지정한다. + * @param searchFields 검색하고자 하는 검색필드들을 Array로 지정한다. + * @param resultType 검색결과를 반환받고자 하는 데이터 형태 + */ + public WNSearch(boolean isDebug, boolean isUidSrch, String[] collections, + String[] mergeCollections, String[] searchFields, int resultType){ + this.common = new WNCommon(); + this.wncol = new WNCollection(); + this.collection = collections; + this.mergeCollections = mergeCollections; + this.searchFields = searchFields; + this.sb = new StringBuffer(); + this.warningMsg = new StringBuffer(); + this.isDebug = isDebug; + this.isUidSrch = isUidSrch; + this.resultType = resultType; + } + + + /** + * WNCommon객체를 생성하고 검색 대상 컬렉션과 검색 대상 필드들을 설정한다. + * @param isDebug 검색설정을 화면에 출력할 것인지 여부를 결정 + * @param isUidSrch 키워드 검색을 할 것인지 UID 검색을 할 것인지 여부를 결정 + * @param collections 검색하고자 하는 컬렉션들을 Array로 지정한다. + * @param searchFields 검색하고자 하는 검색필드들을 Array로 지정한다. + */ + public WNSearch(boolean isDebug, boolean isUidSrch, String[] collections, String[] searchFields){ + this.common = new WNCommon(); + this.wncol = new WNCollection(); + this.collection = collections; + this.searchFields = searchFields; + this.sb = new StringBuffer(); + this.warningMsg = new StringBuffer(); + this.isDebug = isDebug; + this.isUidSrch = isUidSrch; + } + + /** + * WNCommon객체를 생성하고 검색 대상 컬렉션과 검색 대상 필드들을 설정한다. + * @param isDebug 검색설정을 화면에 출력할 것인지 여부를 결정 + * @param isUidSrch 키워드 검색을 할 것인지 UID 검색을 할 것인지 여부를 결정 + * @param collections 검색하고자 하는 컬렉션들을 Array로 지정한다. + * @param mergeCollections 검색하고자 하는 가상통합컬렉션을 Array로 지정한다. + * @param searchFields 검색하고자 하는 검색필드들을 Array로 지정한다. + */ + public WNSearch(boolean isDebug, boolean isUidSrch, String[] collections, + String[] mergeCollections, String[] searchFields){ + this.common = new WNCommon(); + this.wncol = new WNCollection(); + this.collection = collections; + this.mergeCollections = mergeCollections; + this.searchFields = searchFields; + this.sb = new StringBuffer(); + this.warningMsg = new StringBuffer(); + this.isDebug = isDebug; + this.isUidSrch = isUidSrch; + } + + /** + * 검색 키워드를 설정한다. + * @param query 검색 키워드 + * @param isRealQuery 실시간 검색어를 출력한 것인지 여부를 결정 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int search(String query, boolean isRealQuery, String SEARCH_IP, int SEARCH_PORT) { + return search(query, isRealQuery, null, HI_SUM_ONON, COMMON_OR_WHEN_NORESULT_OFF, CONNECTION_CLOSE, false, SEARCH_IP, SEARCH_PORT); + } + + + /** + * 검색 키워드를 설정한다. + * @param query 검색 키워드 + * @param isRealQuery 실시간 검색어를 출력한 것인지 여부를 결정 + * @param useOrResult 검색결과 없을 때 OR로 검색할지 여부를 결정 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int search(String query, boolean isRealQuery, int useOrResult, String SEARCH_IP, int SEARCH_PORT) { + return search(query, isRealQuery, null, HI_SUM_ONON, useOrResult, CONNECTION_CLOSE, false, SEARCH_IP, SEARCH_PORT); + } + + /** + * 검색 키워드를 설정한다. + * @param query 검색 키워드 + * @param isRealQuery 실시간 검색어를 출력한 것인지 여부를 결정 + * @param connectionOpt 검색기와 연결을 유지할 것인지 끊을 것인지 여부를 결정 + * @param useSuggestedQuery speller 결과를 사용할 것인지 여부를 결정 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int search(String query, boolean isRealQuery, int connectionOpt, boolean useSuggestedQuery, String SEARCH_IP, int SEARCH_PORT) { + this.connectionOpt = connectionOpt; + return search(query, isRealQuery, null, HI_SUM_ONON, COMMON_OR_WHEN_NORESULT_OFF, connectionOpt, useSuggestedQuery, SEARCH_IP, SEARCH_PORT); + } + + + /** + * 검색 키워드를 설정한다. + * @param query 검색 키워드 + * @param isRealQuery 실시간 검색어를 출력한 것인지 여부를 결정 + * @param useOrResult 검색결과 없을 때 OR로 검색할지 여부를 결정 + * @param connectionOpt 검색기와 연결을 유지할 것인지 끊을 것인지 여부를 결정 + * @param useSuggestedQuery speller 결과를 사용할 것인지 여부를 결정 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int search(String query, boolean isRealQuery, int useOrResult, int connectionOpt, boolean useSuggestedQuery, String SEARCH_IP, int SEARCH_PORT) { + this.connectionOpt = connectionOpt; + return search(query, isRealQuery, null, HI_SUM_ONON, useOrResult, connectionOpt, useSuggestedQuery, SEARCH_IP, SEARCH_PORT); + } + + /** + * 검색 키워드를 설정한다. + * @param query 검색 키워드 + * @param isRealQuery 실시간 검색어를 출력한 것인지 여부를 결정 + * @param useOrResult 검색결과 없을 때 OR로 검색할지 여부를 결정 + * @param connectionOpt 검색기와 연결을 유지할 것인지 끊을 것인지 여부를 결정 + * @param hisum 하이라이팅과 요약을 사용할 옵션을 결정 + * @param useSuggestedQuery speller 결과를 사용할 것인지 여부를 결정 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int search(String query, boolean isRealQuery, int useOrResult, int connectionOpt, int hiSum, boolean useSuggestedQuery, String SEARCH_IP, int SEARCH_PORT) { + this.connectionOpt = connectionOpt; + return search(query, isRealQuery, null, hiSum, useOrResult, connectionOpt, useSuggestedQuery, SEARCH_IP, SEARCH_PORT); + } + + /** + * 검색 키워드를 설정한다. + * @param query 검색 키워드 + * @param isRealQuery 실시간 검색어를 출력한 것인지 여부를 결정 + * @param userInfo 사용자 정보를 QueryLog파일이 저장할 때 사용된다 + * @param hisum 하이라이팅과 요약을 사용할 옵션을 결정 + * @param useOrResult 검색결과 없을 때 OR로 검색할지 여부를 결정 + * @param connectionOpt 검색기와 연결을 유지할 것인지 끊을 것인지 여부를 결정 + * @param useSuggestedQuery speller 결과를 사용할 것인지 여부를 결정 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + private int search(String query, boolean isRealQuery, String[] userInfo, int hiSum, int useOrResult, int connectionOpt, boolean useSuggestedQuery, String SEARCH_IP, int SEARCH_PORT) { + this.connectionOpt = connectionOpt; + this.hiSum = hiSum; + int ret = 0; + if(!isUidSrch) { + ret = common.setCommonQuery(query, CHARSET, useOrResult, useSuggestedQuery, userInfo); + } else { + ret = common.setUidQuery(CHARSET); + } + + if( collection != null){ + for(int i=0; i", ""); + content = content.replaceAll("", ""); + } + return content; + } + + + /** + * 검색된 키워드의 분석 결과의 리스트를 얻어서 인자로 받은 문자열에 하이라이팅 한다. + * @param content 하이라이팅 하고자 하는 문자열 + * @param startTag 하이라이팅 하고자 하는 Tag의 시작 문자 + * @param endTag 하이라이팅 하고자 하는 Tag의 끝 문자 + * @return 하이라이팅된 문자열을 반환한다. + */ + public String getKeywordHl(String content, String startTag, String endTag) { + if(content != null) { + content = replace(content, "", startTag); + content = replace(content, "", endTag); + } + return content; + } + + + /** + * WNCollection에서 정의된 COLLECTIONS의 index를 얻는다. + * @param collName 검색하고자 하는 컬렉션의 이름 + * @return 컬렉션 index를 반환한다. + */ + public int getCollIdx(String collName) { + for(int i=0; i < WNCollection.COLLECTIONS.length; i++) { + if (WNCollection.COLLECTIONS[i].trim().equals(collName.trim())) return i; + } + return -1; + } + + /** + * WNCollection에서 정의된 MERGE COLLECTIONS의 index를 얻는다. + * @param collName 검색하고자 하는 컬렉션의 이름 + * @return 컬렉션 index를 반환한다. + */ + public int getMergeCollIdx(String collName) { + for(int i=0; i < WNCollection.MERGE_COLLECTIONS.length; i++) { + if( WNCollection.MERGE_COLLECTIONS[i].trim().equals(collName.trim()) ) return i; + } + return -1; + } + + /** + * 검색 후 해당 Collection의 Erro정보를 반환한다. + * @param collectionName 검색을 수행한 컬렉션 이름 + * @return collection의 에러정보 + */ + public String getCollectionErrorInfo(String collectionName) { + return common.getCollectionErrorInfo(collectionName); + } + + /** + * 검색 API의 버전정보를 반환한다. + * @return API 버전정보 + */ + public String getVersionInfo() { + return common.getVersionInfo(); + } + + /** + * 형태소 분석 및 대소문자 값을 체크한다. + * @param useKma 형태소 분석 값 + * @param isCase 대소문자 구분 여부 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int checkKeywordAnalyzer(String collectionName, int useKma, int isCase, int useOriginal, int useSynonym, int useDuplicateDetection) { + int chk = 0; + if(useKma != 0 && useKma != 1 && useKma != 2) { + appendWarnings("[WARNING] [w3SetQueryAnalyzer] [checkKeywordAnalyzer] ["+ collectionName + "] '" + useKma + "' is not kma option"); + return -1; + } + if(isCase != 0 && isCase != 1) { + appendWarnings("[WARNING] [w3SetQueryAnalyzer] [checkKeywordAnalyzer] ["+ collectionName + "] '" + isCase + "' is not case option"); + return -1; + } + if(useOriginal != 0 && useOriginal != 1) { + appendWarnings("[WARNING] [w3SetQueryAnalyzer] [checkKeywordAnalyzer] ["+ collectionName + "] '" + useOriginal + "' is not use original option"); + return -1; + } + if(useSynonym != 0 && useSynonym != 1) { + appendWarnings("[WARNING] [w3SetQueryAnalyzer] [checkKeywordAnalyzer] ["+ collectionName + "] '" + useSynonym + "' is not use synonym option"); + return -1; + } + if(useDuplicateDetection !=0 && useDuplicateDetection != 1) { + appendWarnings("[WARNING] [w3SetQueryAnalyzer] [checkKeywordAnalyzer] ["+ collectionName + "] '" + useDuplicateDetection + "' is not use duplicate detection option"); + return -1; + } + + return chk; + } + + + /** + * 검색하고자 하는 컬렉션을 체크한다. + * @param collectionName 검색하고자 하는 컬렉션 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int checkValidCollection(String msg, String collectionName) { + + int chk = getCollIdx(collectionName); + if(chk == -1 && mergeCollections != null) { //merge collection에서 check를 다시한다. + chk = getMergeCollIdx(collectionName); + } + + if(chk == -1) { + appendWarnings("[WARNING] "+msg+" [" + collectionName + "] Collection name is not exist."); + } + return chk; + } + + + /** + * 필드를 체크하는 각 함수에서 사용된다. + * @param collectionName 검색하고자 하는 컬렉션 + * @param field 필드 이름 + * @param item WNCollection에 지정된 상수 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int checkValidField(String collectionName, String field, int item) { + + int idx = getCollIdx(collectionName); + String[] fields = split(wncol.COLLECTION_INFO[idx][item], ","); + int chk = findArrayValue(field, fields); + return chk; + } + + + /** + * 필드를 체크하는 각 함수에서 사용된다. + * @param collectionName 검색하고자 하는 컬렉션 + * @param field 필드 이름 + * @param item WNCollection에 지정된 상수 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int checkValidDocumentField(String collectionName, String field, int item) { + int chk = -1; + int idx = getCollIdx(collectionName); + if(idx != -1){ + String[] fields = split(wncol.COLLECTION_INFO[idx][item], ","); + int length = fields.length; + + for(int i=0; i 0 && documentFields[0].equals(field)){ + chk = i; + } + } + }else{ //merge collection도 체크한다. + idx = getMergeCollIdx(collectionName); + if(idx != -1) { + String[] fields = split(wncol.MERGE_COLLECTION_INFO[idx][MERGE_RESULT_FIELD], ","); + int length = fields.length; + for(int i=0; i"}; + for(int i=0; i < replaceChar.length; i++) { + value = replace(value, replaceChar[i], " "); + } + + String[] fieldName = split(value, " "); + for(int i=0; i < fieldName.length; i++) { + int index = 0; + if(fieldName[i].indexOf(":", 0) != -1) { + index = fieldName[i].indexOf(":", 0); + fieldName[i] = fieldName[i].trim().substring(0, index); + } + // 확장검색 필드 검사 + if(checkValidField(collectionName, fieldName[i], PREFIX_FIELD) == -1) { + appendWarnings("[WARNING] " + msg + "[" + collectionName + "] " +fieldName[i]+ " is not prefix field."); + chk = -1; + } + } + return chk; + } + + /** + * 검색하고자 하는 컬렉션의 쿼리 필드 값을 체크한다. + * @param msg 화면에 출력할 메시지 + * @param collectionName 검색하고자 하는 컬렉션 + * @param value 체크하고자 하는 필드 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int checkCollectionQueryFieldName(String msg, String collectionName, String value) { + int chk = 0; + String[] replaceChar = new String[]{"!", "|", "(", ")", "[", "]", "{", "}", "\"", "^", "<", ">"}; + for(int i=0; i < replaceChar.length; i++) { + value = replace(value, replaceChar[i], " "); + } + + String[] fieldName = split(value, " "); + for(int i=0; i < fieldName.length; i++) { + int index = 0; + if(fieldName[i].indexOf(":", 0) != -1) { + index = fieldName[i].indexOf(":", 0); + fieldName[i] = fieldName[i].trim().substring(0, index); + } + String[] fields = fieldName[i].split(","); + for(int j=0;j < fields.length; j++){ + // 컬렉션 쿼리 필드 검사 + if(checkValidField(collectionName, fields[j], PREFIX_FIELD) != -1) { + appendWarnings("[WARNING] " + msg + "[" + collectionName + "] " +fields[j]+ " is prefix field."); + chk = -1; + } + } + } + return chk; + } + + /** + * 검색하고자 하는 컬렉션의 필터링 필드 값을 체크한다. + * @param msg 화면에 출력할 메시지 + * @param collectionName 검색하고자 하는 컬렉션 + * @param value 체크하고자 하는 필드 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int checkFilterFieldName(String msg, String collectionName, String value) { + int chk = 0; + String[] replaceChar = new String[]{"|", "(", ")", "[", "]", "{", "}", "\"", "^"}; + for(int i=0; i < replaceChar.length; i++) { + value = replace(value, replaceChar[i], " "); + } + + String[] fieldName = split(value, " "); + for(int i=0; i < fieldName.length; i++) { + int index = 0; + if(fieldName[i].indexOf("<", 0) != -1) { + index = fieldName[i].indexOf("<", 0); + fieldName[i] = fieldName[i].trim().substring(0, index); + // 필터링 검색 필드 검사 + if(checkValidField(collectionName, fieldName[i], FAST_ACCESS) == -1) { + appendWarnings("[WARNING] " + msg + " [" + collectionName + "] " +fieldName[i]+ " is not fastaccess field."); + chk = -1; + } + } + } + return chk; + } + + + /** + * 검색결과의 지정 범위를 체크한다. + * @param collectionName 검색하고자 하는 컬렉션 + * @param highlight 하이라이팅 옵션 값 + * @param startPos 검색결과 시작 offset + * @param resultCnt 검색 결과 count + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int checkSetPageInfo(String collectionName, int highlight, int startPos, int resultCnt) { + int chk = 0; + if(highlight < 0 || highlight> 3 || startPos < 0 || resultCnt < 0) { + appendWarnings("[WARNING] [] [checkSetPageInfo] [" + collectionName + "] Highlight: '" + + highlight + "', StartPosition: '"+startPos+ "', ResultCount: '"+resultCnt+"' is invalid value"); + return -1; + } + return chk; + } + + + /** + * 검색 정렬 필드를 체크한다. + * @param collectionName 검색하고자 하는 컬렉션 + * @param sortField 정렬필드 + * @param sortOrder 오름차순/내림차순 + * @return 성공이면 0을 반환한다. 실패면 0이 아닌 값을 반환한다. + */ + public int checkSortFieldName(String collectionName, String sortField, String sortOrder) { + if(sortField.toUpperCase().equals("DATE")) { + if(sortOrder.equals("DESC") == false && sortOrder.equals("ASC") == false) { + //DATE는 오름차순과 내림차순으로만 정렬 가능 + appendWarnings("[ERROR] [w3AddSortField] [checkSortFieldName] [" + collectionName + "] Date sortOrder is '" + sortOrder + "'. Only DESC or ASC is allowed."); + return -1; + } + } else if(sortField.toUpperCase().equals("RANK")) { + if(sortOrder.equals("DESC") == false) { + //RANK는 내림차순(1)으로만 정렬 가능 + appendWarnings("[ERROR] [w3AddSortField] [checkSortFieldName] [" + collectionName + "] RANK sortOrder is '" + sortOrder +"' Only DESC is allowed."); + return -1; + } + }else if(sortField.toUpperCase().equals("WEIGHT")) { + if(sortOrder.equals("DESC") == false && sortOrder.equals("ASC") == false) { + //WEIGHT는 오름차순(0)과 내림차순(1)으로만 정렬 가능 + appendWarnings("[ERROR] [w3AddSortField] [checkSortFieldName] [" + collectionName + "] WEIGHT sortOrder is '" + sortOrder +"' Only DESC or ASC is allowed"); + return -1; + } + }else { + // 정렬 필드 검사 + if(checkValidDocumentField(collectionName, sortField, RESULT_FIELD) == -1) { + appendWarnings("[ERROR] [w3AddSortField] [checkSortFieldName] [" + collectionName + "] '" + sortField + "' is not exist."); + return -1; + } + if(checkValidField(collectionName, sortField, FAST_ACCESS) == -1) { + // fastaccess가 지정되지 않은 필드에서 속도 느릴수 있음. + appendWarnings("[WARNING] [w3AddSortField] [checkSortFieldName] [" + collectionName + "] " +sortField+ " is not fastaccess field."); + } + } + return 0; + } + + /** + * 디버그 메시지를 구성한다. + * @param isRealQuery + * @param query + */ + public void debugMsg(boolean isRealQuery, String query, String SEARCH_IP, int SEARCH_PORT){ + sb.append("[CHARSET] " + CHARSET + " [QUERY] " + query); + sb.append("
[w3ConnectServer] [IP] " + SEARCH_IP + " [PORT] " + SEARCH_PORT + " [TIMEOUT]" + CONNECTION_TIMEOUT); + if(!isUidSrch) { + sb.append("
[w3RecvResult] Mode : " + this.connectionOpt); + if(isRealQuery){ + sb.append("
[W3ReceiveRecentQueryListResult] Set Count : " + REALTIME_COUNT); + } + } + + sb.append("
"); + for(int i=0; i < collection.length; i++) { + int idx = getCollIdx(collection[i]); + + if(idx < 0){ + return; + } + int count = 0; + + // 컬렉션 정보 + String content = wncol.COLLECTION_INFO[idx][INDEX_NAME]; + if(content != null && !content.equals("")){ + sb.append("
[w3AddCollection] " + content + ""); + } + if(!isUidSrch) { + //페이지 설정 + content = wncol.COLLECTION_INFO[idx][PAGE_INFO]; + if(content != null && !content.equals("")){ + sb.append("
[w3SetPageInfo] " + content); + } + + //분석 정보 + content = wncol.COLLECTION_INFO[idx][ANALYZER]; + if(content != null && !content.equals("")){ + sb.append("
[w3SetQueryAnalyzer] " + content); + } + + //하이라이팅 정보 + count = this.hiSum; + if(count >= 0){ + switch(count){ + case 0: + content = " : Highlight off, Snippet off.";break; + case 1: + content = " : Highlight off, Snippet on.";break; + case 2: + content = " : Highlight on, Snippet off.";break; + case 3: + content = " : Highlight on, Snippet on.";break; + default: + content = " : wrong infomation"; + } + sb.append("
[w3SetQueryAnalyzer] " + count + content); + } + + //정렬 정보 + content = wncol.COLLECTION_INFO[idx][SORT_FIELD]; + if(content != null && !content.equals("")){ + sb.append("
[w3AddSortField] " + content); + } + + //검색 필드 정보 + String search_field = wncol.COLLECTION_INFO[idx][SEARCH_FIELD]; + String[] searchField = search_field.split(","); + + content = wncol.COLLECTION_INFO[idx][SEARCH_FIELD]; + if(content != null && !content.equals("")){ + sb.append("
[w3AddSearchField] " ); + for(int k = 0; k[w3SetDateRange] " + content); + } + + //확장 검색 정보 + content = wncol.COLLECTION_INFO[idx][EXQUERY_FIELD]; + if(content != null && !content.equals("")){ + sb.append("
[w3SetPrefixQuery] " + content.replaceAll("<", "<").replaceAll(">", ">")); + } + + //카테고리 부스트 정보 + content = wncol.COLLECTION_INFO[idx][CATEGORY_BOOST]; + if(content != null && !content.equals("")){ + sb.append("
[w3SetBoostCategory] " + content); + } + + //컬렉션 쿼리 정보 + content = wncol.COLLECTION_INFO[idx][COLLECTION_QUERY]; + if(content != null && !content.equals("")){ + sb.append("
[w3SetCollectionQuery] " + content.replaceAll("<", "<").replaceAll(">", ">")); + } + + //필터 정보 + content = wncol.COLLECTION_INFO[idx][FILTER_OPERATION]; + if(content != null && !content.equals("")){ + sb.append("
[w3SetFilterQuery] " + content.replaceAll("<", "<").replaceAll(">", ">")); + } + + //그룹화 정보 + content = wncol.COLLECTION_INFO[idx][GROUP_BY]; + if(content != null && !content.equals("")){ + sb.append("
[w3SetGroupBy] " + content); + } + + //그룹 정렬 정보 + content = wncol.COLLECTION_INFO[idx][GROUP_SORT_FIELD]; + if(content != null && !content.equals("")){ + sb.append("
[w3AddSortFieldInGroup] " + content); + } + + + if(!wncol.COLLECTION_INFO[idx][GROUP_BY].equals("")){ + //전체 그룹 개수 정보 + count = getResultGroupCount(collection[i]); + if(count > 0){ + sb.append("
[w3GetGroupBycount] " + count); + } + } + + // dedup field + content = wncol.COLLECTION_INFO[idx][DEDUP_SORT_FIELD]; + if(content != null && !content.equals("")){ + sb.append("
[w3SetDuplicateDetectionCriterionField] " + content); + } + } + + //결과 필드 정보 + content = wncol.COLLECTION_INFO[idx][RESULT_FIELD]; + if(content != null && !content.equals("")){ + sb.append("
[w3AddDocumentField] " + content); + } + sb.append("
"); + } + + //merge collection debug info + if(mergeCollections != null) { + for(int i=0; i < mergeCollections.length; i++) { + int idx = getMergeCollIdx(mergeCollections[i]); + + if(idx < 0){ + return; + } + + //merge collection name 정보 + String content = wncol.MERGE_COLLECTION_INFO[idx][MERGE_COLLECTION_NAME]; + String mappingColl = wncol.MERGE_COLLECTION_INFO[idx][MERGE_MAPPING_COLLECTION_NAME]; + if(content != null && !content.equals("") && mappingColl != null && !mappingColl.equals("")){ + sb.append("
[w3AddMergeCollection] " + content + ", [Collection Name]" + mappingColl + ""); + } + + content = wncol.MERGE_COLLECTION_INFO[idx][MERGE_PAGE_INFO]; + if(content != null && !content.equals("")){ + sb.append("
[w3SetMergePageInfo] " + content); + } + + content = wncol.MERGE_COLLECTION_INFO[idx][MERGE_RESULT_FIELD]; + String mappingDocs = wncol.MERGE_COLLECTION_INFO[idx][MERGE_MAPPING_RESULT_FIELD]; + if(content != null && !content.equals("") && mappingDocs != null && !mappingDocs.equals("")){ + sb.append("
[w3AddMergeDocumentField] " + content + ", [Collection Document Fields]" + mappingDocs); + } + + content = wncol.MERGE_COLLECTION_INFO[idx][MERGE_MULTI_GROUP_BY_FIELD]; + String mappingMulti = wncol.MERGE_COLLECTION_INFO[idx][MERGE_MAPPING_MULTI_GROUP_BY_FIELD]; + if(content != null && !content.equals("") && mappingMulti != null && !mappingMulti.equals("")){ + sb.append("
[w3AddMergeMultiGroupByField] " + content + ", [Collection Multi-Groupby Fields]" + mappingMulti); + } + + content = wncol.MERGE_COLLECTION_INFO[idx][MERGE_CATEGORY_GROUPBY_FIELD]; + String mappingCategory = wncol.MERGE_COLLECTION_INFO[idx][MERGE_MAPPING_CATEGORY_GROUPBY_FIELD]; + if(content != null && !content.equals("") && mappingCategory != null && !mappingCategory.equals("")){ + sb.append("
[w3AddMergeCategoryGroupByField] " + content + ", [Collection Category Groupby Fields]" + mappingCategory); + } + } + + sb.append("
"); + } + } + + /** + * 경고 메시지를 버퍼에 저장한다. + * @param msg 경고 메시지 + */ + public void appendWarnings(String msg) { + if(isDebug && !msg.equals("")){ + warningMsg.append(msg + "
"); + } + } + + + /** + * 에러 메시지를 버퍼에 저장한다. + * @param msg 에러 메시지 + */ + public void appendErrors(String msg) { + if(!msg.equals("")){ + sb.append("
" + msg + "
"); + } + } + + /** + * 디버그 정보를 화면에 출력할 경우 메시지를 반환한다. + * @return 디버그 정보 반환 + */ + public String printDebug() { + if(!warningMsg.toString().equals("")){ + return sb.toString() + "
" + warningMsg.toString()+ "
"; + } + return sb.toString(); + } + + /** + * 관리도구의 경로를 지정한다. + * @param managerURL 관리도구 경로 + */ + public void setManagerMode(String managerURL){ + if(managerURL != null && !managerURL.trim().equals("")){ + this.managerURL = managerURL; + } + } + + /* + * 매니저 동작 준비 테그를 생성한다. + * @param colName 컬렉션 명 + * @param idx 결과 인덱스 + * @param docid 특정 결과 DOCID + * @return 매니저 동작 준비 테그 + */ + public String getManagerOperationTag(String colName, int idx, String docid){ + String uniid = colName + "_" + idx; + if (!this.managerURL.equals("")){ + return "" + docid + " "; + }else{ + return ""; + } + } + + /* + * 매니저 동작 테그를 생성한다. + * @param transferURL xml 파싱 파일 경로 + * @return 매니저 동작 테그 + */ + public String getManagerActionTag(String transferURL, String SEARCH_IP, int SEARCH_PORT) { + if (!this.managerURL.equals("")) + return ""; + else + return ""; + } + + /** + * 검색 결과 페이징 번호를 출력한다. + * @param startCount 검색 결과 시작 offset + * @param totalCount 검색 결과의 총 개수 + * @param viewListCount 검색결과로 요청된 offset의 개수 + * @param bundleCount 페이지 이동할 개수 + * @return 페이징 문자열 반환 + */ + public static String getPageLinks(int startCount, int totalCount, int viewListCount, int bundleCount) { + StringBuffer sbRet = new StringBuffer(); + WNAnchor wnanchor = getPageAnchor(startCount, totalCount, viewListCount, bundleCount); + + sbRet.append("
    "); + + if(wnanchor.getFirstPage() != -1) { + sbRet.append("
  • 처음으로
  • "); + sbRet.append("
  • 이전
  • "); + } else { + //sbRet.append("
  • 처음으로
  • "); + //sbRet.append("
  • 이전
  • "); + } + + int pageCount = wnanchor.getPageCount(); + String pages[][] = wnanchor.getPages(); + + for(int i=0; i" + pages[i][0] + ""); + } else { + sbRet.append("
  • "+pages[i][0]+"
  • "); + } + } + + if(wnanchor.getBundleNext() != -1) { + sbRet.append("
  • 다음
  • "); + sbRet.append("
  • 맨끝으로
  • "); + + } else { + //sbRet.append("
  • 다음
  • "); + //sbRet.append("
  • 맨끝으로
  • "); + } + sbRet.append("
"); + + return sbRet.toString(); + } + + /** + * 페이지 Anchor를 생성한다. + * @param startNum 검색 결과 시작 offset + * @param totalcount 검색 결과의 총 개수 + * @param resultCnt 검색결과로 요청된 offset의 개수 + * @param anchorSacle 페이지 이동할 개수 + * @return WNAnchor Object를 반환 + */ + public static WNAnchor getPageAnchor(int startNum, int totalcount, int resultCnt, int anchorSacle) { + WNAnchor anchor = new WNAnchor(); + + if(totalcount == 0) { //등록된 정보가 없으면 페이지 Anchor를 생성 하지 않는다. + return anchor; + } + + int curBunbleNum = startNum / (resultCnt * anchorSacle); + int totalPageCnt = totalcount / resultCnt; + if(totalcount % resultCnt > 0) { + totalPageCnt++; + } + + anchor.setTotalPgCount(totalPageCnt); // 전체 페이지 세팅 + + if ( startNum > 0){ // 이전 페이지 + int beforePg = startNum - resultCnt; + anchor.setBefore(beforePg); + } + + if( startNum+resultCnt < totalcount ){ // 다음페이지 + int nextPg = startNum + resultCnt; + anchor.setNext(nextPg); + } + + //번들 뒤로 이동 + int bunbleBeforePg = (curBunbleNum-1) * resultCnt * anchorSacle; //이전 번들로 이동하는 번호 + if(curBunbleNum > 0){ + anchor.setBundleBefore(bunbleBeforePg); + } + + //번들 앞으로 이동 + int bundleNextPg = (1 + curBunbleNum) * anchorSacle * resultCnt; + if( totalPageCnt >= anchorSacle && (curBunbleNum+1) * anchorSacle < totalPageCnt ){ + anchor.setBundleNext(bundleNextPg); + } + + //맨처음.. + if(startNum != 0 && curBunbleNum != 0){ + anchor.setFirstPage(0); + } + //맨끝... + int lastPage = (resultCnt * totalPageCnt) - resultCnt ; + if( totalPageCnt >= anchorSacle && (curBunbleNum+1) * anchorSacle < totalPageCnt ) { + anchor.setLastPage(lastPage); + } + + int pageCount = 1; + String[][] pages = new String[anchorSacle][2]; + for(int i = 0; i < anchorSacle; i++) { + int startCnt = ((curBunbleNum * anchorSacle) + i) * resultCnt; + int pageNum = (curBunbleNum * anchorSacle) + i + 1; + if(startCnt < totalcount) { + if (startCnt != startNum) { + pages[i][0] = Integer.toString(pageNum); + pages[i][1] = Integer.toString(startCnt); + } else { + pages[i][0] = Integer.toString(pageNum); + pages[i][1] = "-1"; + anchor.setCurPageNumber(pageNum); + } + anchor.setPageCount(pageCount); + pageCount++; + } + } + anchor.setPages(pages); + return anchor; + } + + + + /** + * 검색 결과 페이징 번호를 출력한다. + * @param startCount 검색 결과 시작 offset + * @param totalCount 검색 결과의 총 개수 + * @param viewListCount 검색결과로 요청된 offset의 개수 + * @param bundleCount 페이지 이동할 개수 + * @return 페이징 문자열 반환 + */ + /* public String getPageLinksWebAccess(String base, String url, int startCount, int totalCount, int viewListCount, int bundleCount) { + + String RequestURI = base; + String RequestURL = url; + + StringBuffer sbRet = new StringBuffer(); + WNAnchor wnanchor = getPageAnchor(startCount, totalCount, viewListCount, bundleCount); + String ppreImg=""; + String preImg=""; + String nextImg=""; + String nnextImg=""; + ppreImg = ""; + preImg = ""; + nextImg = ""; + nnextImg = ""; + + if(wnanchor.getFirstPage() != -1) { + sbRet.append(""+ppreImg+"  "); + } else { + sbRet.append(ppreImg+" "); + } + if(wnanchor.getBundleBefore() != -1) { + sbRet.append(""+preImg+"  "); + } else { + sbRet.append(preImg+" "); + } + + int pageCount = wnanchor.getPageCount(); + String pages[][] = wnanchor.getPages(); + + for(int i=0; i" + pages[i][0]+""); + } else { + sbRet.append(" "+pages[i][0]+" "); + } + if(pageCount > i+1) { + sbRet.append(" | ");// 페이지 경계 1 | 2 | 3 + } + } + if(wnanchor.getBundleNext() != -1) { + sbRet.append("  "+nextImg+""); + } else { + sbRet.append("  "+nextImg+""); + } + if(wnanchor.getLastPage() != -1) { + sbRet.append("  "+nnextImg+""); + } else { + sbRet.append("  "+nnextImg+""); + } + return sbRet.toString(); + }*/ + + + public String getCollectionKorName(String col) { + String value = ""; + for ( int idx=0;idx< WNCollection.COLLECTIONS.length; idx++){ + String coll = wncol.COLLECTION_INFO[idx][COLLECTION_NAME].trim(); + if ( coll.equals(col) ) + return wncol.COLLECTION_INFO[idx][COLLECTION_KOR]; + + } + + return value; + } + + public String getCollectionName(String col) { + String value = ""; + for ( int idx=0;idx< WNCollection.COLLECTIONS.length; idx++){ + if ( WNCollection.COLLECTIONS[idx].equals(col) ) { + return WNCollection.COLLECTIONS_NAME[idx]; + } + } + + return value; + } + + public List> getDocList(String collection, int colCount) { + List> docList = new ArrayList>(); + String resultFieldList = getCollectionInfoValue(collection, RESULT_FIELD); + Map docData = null; + for(int j = 0; j < colCount; j++) { + docData = new HashMap(); + for(String docField : resultFieldList.split(",")) { + if(docField.contains("/")) { + docField = docField.substring(0, docField.indexOf("/")); + } + if(collection.equals("kisa") && docField.toLowerCase().equals("title")) { + docData.put("filenm", getField(collection, docField, j, false).replaceAll("", "").replaceAll("","")); + docData.put(docField.toLowerCase(), getField(collection, docField, j, true)); + } else if(collection.equals("kisa") && docField.toLowerCase().equals("filedir")) { + docData.put("filedir", getField(collection, docField, j, false).replaceAll("", "").replaceAll("","")); + } else { + docData.put(docField.toLowerCase(), getField(collection, docField, j, true)); + } + } + docList.add(docData); + } + + return docList; + + } + + public String checkDupQuery(String[] queryList) { + String result = ""; + TreeSet ts = new TreeSet(); + for(String query : queryList) { + ts.add(query); + } + + Iterator it = ts.iterator(); + + while(it.hasNext()) { + result += it.next() + " "; + } + return result.trim(); + } + + /** + * 검색옵션 설정 + * @param query 검색키워드 + * @param searchField 추가검색필드 + * @param viewResultCount 한 화면에 나오는 건수 + * @param startCount 시작번호 + * @param sort 소팅필드 + * @param strOperation + * @param exquery + * @param startDate + * @param endDate + */ + public void set(String query, String searchField, int viewResultCount, int startCount, String sort, String sortDirection, String strOperation, String exquery, String startDate, String endDate) { + for (int i = 0; i < this.collection.length; i++) { + //출력건수 + this.setCollectionInfoValue(collection[i], PAGE_INFO, startCount+","+viewResultCount); + + //검색어가 없으면 DATE_RANGE 로 전체 데이터 출력 + if (!query.equals("") ) { + if(collection[i].contains("theme")){ + this.setCollectionInfoValue(collection[i], SORT_FIELD, "RANK/" + sortDirection); + }else{ + this.setCollectionInfoValue(collection[i], SORT_FIELD, sort + "/" + sortDirection); + } + } else { + this.setCollectionInfoValue(collection[i], DATE_RANGE, "1900/01/01,2030/12/31,-"); + this.setCollectionInfoValue(collection[i], SORT_FIELD, sort + "/" + sortDirection); + } + + //searchField 값이 있으면 설정, 없으면 기본검색필드 + if (!searchField.equals("") && !searchField.equals("WRITER") && searchField.indexOf("ALL") == -1 ) { + this.setCollectionInfoValue(collection[i], SEARCH_FIELD, searchField); + } + + //operation 설정 + if (!strOperation.equals("")) { + this.setCollectionInfoValue(collection[i], FILTER_OPERATION, strOperation); + } + + //exquery 설정 + if (!exquery.equals("")) { + this.setCollectionInfoValue(collection[i], EXQUERY_FIELD, exquery); + } + + //기간 설정 , 날짜가 모두 있을때 + if (!startDate.equals("") && !endDate.equals("")) { + this.setCollectionInfoValue(collection[i], DATE_RANGE, startDate.replaceAll("[.]","/") + "," + endDate.replaceAll("[.]","/") + ",-"); + } + }; + }; +} diff --git a/src/main/java/kccf/sch/common/WNUtils.java b/src/main/java/kccf/sch/common/WNUtils.java new file mode 100644 index 00000000..fc0e2a0c --- /dev/null +++ b/src/main/java/kccf/sch/common/WNUtils.java @@ -0,0 +1,338 @@ +package kccf.sch.common; + + +import java.io.UnsupportedEncodingException; +import java.text.DecimalFormat; +import java.text.FieldPosition; +import java.text.NumberFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.StringTokenizer; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class WNUtils { + private static final Logger LOGGER = LoggerFactory.getLogger(WNUtils.class); + /* + * 문자셋 관련 설정 + */ + final static String ENCODE_ORI = "EUC-KR"; + final static String ENCODE_NEW = "UTF-8"; + + /** + * 문자 배열 값을 검색하여 키 값을 리턴 + * @param fieldName + * @param value + * @param operation + * @return + */ + public static int findArrayValue(String find, String[] arr) { + int findKey = -1; + for (int i = 0; i < arr.length; i++) { + if (find.equals(arr[i])){ + findKey = i; + break; + } + } + return findKey; + } + + /** + * + * @param s + * @param findStr + * @param replaceStr + * @return + */ + public static String replace(String s, String findStr, String replaceStr){ + int pos; + int index = 0; + + while ((pos = s.indexOf(findStr, index)) >= 0) { + s = s.substring(0, pos) + replaceStr + s.substring(pos + findStr.length()); + index = pos + replaceStr.length(); + } + + return s; + } + + /** + * + * @param s + * @return + */ + public static String trimDuplecateSpace(String s){ + StringBuffer sb = new StringBuffer(); + for(int i=0; i 0) { + try { + str = new String(str.getBytes(oriEncode), newEncode); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + LOGGER.info("UnsupportedEncodingException occurred"); + } + } + return str; + } + + + /** + * 구분자를 가지고 있는 문자열을 구분자를 기준으로 나누어주는 메소드 + * @param splittee 구분자를 가진 문자열 + * @param splitChar 구분자 + * @return + */ + public static String[] split(String splittee, String splitChar){ + String taRetVal[] = null; + StringTokenizer toTokenizer = null; + int tnTokenCnt = 0; + + try { + toTokenizer = new StringTokenizer(splittee, splitChar); + tnTokenCnt = toTokenizer.countTokens(); + taRetVal = new String[tnTokenCnt]; + + for(int i=0; i",""); + reqValue = reqValue.replaceAll(">",""); + reqValue = reqValue.replaceAll(">",""); + + //금지 문자열 리스트 + String blockchar[] = {"./", "..", "../", "..\\"}; + + // 금지할 문자열 포함 여부 체크 + for(int i=0; i",""); + req_value = req_value.replaceAll(">",""); + req_value = req_value.replaceAll(">",""); + return req_value; + } +} diff --git a/src/main/java/kccf/sch/service/ArkService.java b/src/main/java/kccf/sch/service/ArkService.java new file mode 100644 index 00000000..fcde843d --- /dev/null +++ b/src/main/java/kccf/sch/service/ArkService.java @@ -0,0 +1,16 @@ +package kccf.sch.service; + + +import kccf.sch.service.vo.ArkVO; +import kccf.sch.service.vo.Sf1VO; + +/** + * @Class Name : SearchService.java + * @Description : SearchService Class + * @Modification Information + * + */ +public interface ArkService { + /** 자동완성 */ + public String getArk(ArkVO arkVo , Sf1VO sf1Vo )throws Exception; +} diff --git a/src/main/java/kccf/sch/service/PopWordService.java b/src/main/java/kccf/sch/service/PopWordService.java new file mode 100644 index 00000000..8c219e54 --- /dev/null +++ b/src/main/java/kccf/sch/service/PopWordService.java @@ -0,0 +1,10 @@ +package kccf.sch.service; + + +import kccf.sch.service.vo.PopWordVO; +import kccf.sch.service.vo.Sf1VO; + +public interface PopWordService { + /** 인기검색어 */ + String getPopWord(PopWordVO popWordVo , Sf1VO sf1Vo )throws Exception; +} diff --git a/src/main/java/kccf/sch/service/SearchCollectionResult.java b/src/main/java/kccf/sch/service/SearchCollectionResult.java new file mode 100644 index 00000000..9364d2aa --- /dev/null +++ b/src/main/java/kccf/sch/service/SearchCollectionResult.java @@ -0,0 +1,112 @@ +package kccf.sch.service; + +import java.util.ArrayList; + +import kccf.sch.service.vo.SearchCollectionVO; + + + +public class SearchCollectionResult { + /** 디버그 메세지 */ + private String debugStr = ""; + /** 엔진 에러 코드 */ + private int errorCode = 0; + /** 컬렉션 리스트 */ + private ArrayList collectionList = null; + public String getDebugStr() { + return debugStr; + } + public void setDebugStr(String debugStr) { + this.debugStr = debugStr; + } + public int getErrorCode() { + return errorCode; + } + public void setErrorCode(int errorCode) { + this.errorCode = errorCode; + } + public ArrayList getCollectionList() { + ArrayList collectionListRet = new ArrayList(); + collectionListRet.addAll(collectionList); + return collectionListRet; + } + public void setCollectionList(ArrayList collectionList) { + if(collectionList != null){ + this.collectionList = new ArrayList(); + for(int i = 0; i < collectionList.size(); ++i){ + this.collectionList.add(collectionList.get(i)); + } + } + } + + /** + * 검색 결과를 XML 형태로 제공(선언부) + * @param charset xml 선언부 언어셋(euc-kr , UTF-8) + * @return 검색 결과를 XML 형태 String 값 + */ + public String toXml(String charset){ + String encoding = "UTF-8"; + if(null != charset){ + if(charset.toUpperCase().equals("EUC-KR")){ + encoding = charset; + } + } + StringBuffer xmlBr = new StringBuffer(1024); + xmlBr.append("").append(System.getProperty("line.separator")); + xmlBr.append("").append(System.getProperty("line.separator")); + xmlBr.append("").append(System.getProperty("line.separator")); + xmlBr.append("").append(System.getProperty("line.separator")); + ArrayList collectionList = getCollectionList(); + int collectionListCount = collectionList.size(); + for(int i = 0 ; i < collectionListCount ; i++){ + SearchCollectionVO collVo = collectionList.get(i); + xmlBr.append(collVo.getXml()).append(System.getProperty("line.separator")); + } + xmlBr.append("").append(System.getProperty("line.separator")); + xmlBr.append(""); + return xmlBr.toString(); + } + + /** + * 검색결과를 json 형태로 반환 + * @return 검색결과를 json 형태 String 값 + */ + public String toJson(){ + StringBuffer jsonBr = new StringBuffer(1024); + jsonBr.append("{\"wisenutSearch\":{"); + jsonBr.append("\"DebugStr\":").append("\"").append(getDebugStr()).append("\","); + jsonBr.append("\"CollectionList\":"); + jsonBr.append("["); + ArrayList collectionList = getCollectionList(); + int collectionListCount = collectionList.size(); + for(int i = 0 ; i < collectionListCount ; i++){ + SearchCollectionVO collVo = collectionList.get(i); + jsonBr.append(collVo.getJson()); + if(i != collectionListCount-1 ){ + jsonBr.append(","); + } + } + jsonBr.append("]}}"); + return jsonBr.toString(); + + } + + /** + * 검색결과 String 형태로 반환 + * @return 검색결과를 문자열 형태 String 값 + */ + public String toStr(){ + StringBuffer br = new StringBuffer(1024); + br.append("[DebugStr:").append(getDebugStr()).append(System.getProperty("line.separator")); + ArrayList collectionList = getCollectionList(); + int collectionListCount = collectionList.size(); + for(int i = 0 ; i < collectionListCount ; i++){ + SearchCollectionVO collVo = collectionList.get(i); + br.append(collVo.getStr()); + } + return br.toString(); + } + + + +} diff --git a/src/main/java/kccf/sch/service/SearchService.java b/src/main/java/kccf/sch/service/SearchService.java new file mode 100644 index 00000000..97c0aa9e --- /dev/null +++ b/src/main/java/kccf/sch/service/SearchService.java @@ -0,0 +1,18 @@ +package kccf.sch.service; + +import kccf.sch.service.vo.SearchVO; +import kccf.sch.service.vo.Sf1VO; + + + +public interface SearchService { + /** 검색결과 받기 */ + SearchCollectionResult getSearch(SearchVO searchVO , Sf1VO sf1Vo) throws Exception; + + String getSearchEtc(SearchVO searchVO , Sf1VO sf1Vo) throws Exception; + + int getSearch_All_cnt(SearchVO searchVO, Sf1VO sf1Vo) throws Exception; + + SearchCollectionResult getSearch_ajax(SearchVO searchVO , Sf1VO sf1Vo) throws Exception; + +} diff --git a/src/main/java/kccf/sch/service/impl/ArkServiceImpl.java b/src/main/java/kccf/sch/service/impl/ArkServiceImpl.java new file mode 100644 index 00000000..5dfd830e --- /dev/null +++ b/src/main/java/kccf/sch/service/impl/ArkServiceImpl.java @@ -0,0 +1,123 @@ +package kccf.sch.service.impl; + + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; +import kccf.sch.service.ArkService; +import kccf.sch.service.vo.ArkVO; +import kccf.sch.service.vo.Sf1VO; + +@Service("ArkService") +public class ArkServiceImpl extends EgovAbstractServiceImpl implements ArkService{ + private static final Logger LOGGER = LoggerFactory.getLogger(ArkServiceImpl.class); + + /** + * 자동완성 호출 + */ + @Override + public String getArk(ArkVO arkVo, Sf1VO sf1Vo) throws Exception { + StringBuffer urlSb = new StringBuffer(); + urlSb.append("http://"); + urlSb.append(sf1Vo.getManagerIp()).append(":"); + urlSb.append(sf1Vo.getManagerPort()); + urlSb.append("/manager/WNRun.do?"); + + urlSb.append("target=").append(arkVo.getTarget()); + urlSb.append("&query=").append(URLEncoder.encode(arkVo.getQuery(), "UTF-8")); + urlSb.append("&convert=").append(arkVo.getConvert()); + /*urlSb.append("&eq=").append(arkVo.getCharset()); + urlSb.append("&es=").append(arkVo.getCharset());*/ + + String url = urlSb.toString(); + if(arkVo.getDebugType().equals("Y")){ + LOGGER.info("[getArk() URL]["+url+"]"); + LOGGER.info("[getArk() sf1Vo.toString()]["+sf1Vo.toString()+"]"); + LOGGER.info("[getArk() arkVo.toString()]["+arkVo.toString()+"]"); + } + return getHtmls(url, arkVo.getTimeOut() , arkVo.getDataType(), arkVo.getCharset()); + } + + /** + * 관리도구 자동완성 URL 호출해야 해당 결과 담기 + * @param receiverURL 관리도구 URL 정보 + * @param parameter ark 파라미터값 + * @param timeout ark 연결 시간 고정으로 1000 + * @param datatype 관리도구 web화면 데이타 타입 + * @param charset 케릭터 타임 + * @return dataType 에 따른 자동완성 결과 + */ + private String getHtmls(String receiverURL, int timeout, String datatype , String charset) { + StringBuffer receiveMsg = new StringBuffer(); + BufferedReader in = null; + int errorCode = 0; + try { + + // -- receive servlet connect + URL servletUrl = new URL(receiverURL); + HttpURLConnection uc = (HttpURLConnection)servletUrl.openConnection(); + uc.setReadTimeout(timeout); + uc.setRequestMethod("GET"); + uc.setDoOutput(true); + uc.setDoInput(true); + uc.setUseCaches(false); + uc.connect(); + // init + errorCode = 0; + //System.out.println("[URLConnection Response Code] " + uc.getResponseCode()); + // -- Network error check + if (uc.getResponseCode() == HttpURLConnection.HTTP_OK) { + String currLine = new String(); + //UTF-8인 경우 + in = new BufferedReader(new InputStreamReader(uc.getInputStream(), "UTF-8")); + while ((currLine = in.readLine()) != null) { + receiveMsg.append(currLine).append("\r\n"); + } + } else { + errorCode = uc.getResponseCode(); + return receiveMsg.toString(); + } + uc.disconnect(); + } catch(Exception ex) { + receiveMsg.setLength(0); + if(datatype.toLowerCase().equals("xml")){ + receiveMsg.append(""); + receiveMsg.append(""); + receiveMsg.append(""); + receiveMsg.append("0"); + receiveMsg.append(" "); + receiveMsg.append("0"); + receiveMsg.append(""); + receiveMsg.append(""); + receiveMsg.append(" 0"); + receiveMsg.append(""); + receiveMsg.append(""); + receiveMsg.append(""); + }else if(datatype.toLowerCase().equals("json")){ + receiveMsg.append("{\"responsestatus\":0,\"result\":[{\"totalcount\":0},{\"totalcount\":0}]}"); + } + LOGGER.debug("[getHtmls() URL]["+ receiverURL +"]"); + LOGGER.debug("[getHtmls() error][errorCode:"+errorCode+"]["+ex+"]"); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException ex) { + LOGGER.info("IOException occurred"); + } + } + } + return receiveMsg.toString(); + } + + +} diff --git a/src/main/java/kccf/sch/service/impl/PopWordServiceImpl.java b/src/main/java/kccf/sch/service/impl/PopWordServiceImpl.java new file mode 100644 index 00000000..40dfd3bf --- /dev/null +++ b/src/main/java/kccf/sch/service/impl/PopWordServiceImpl.java @@ -0,0 +1,133 @@ +package kccf.sch.service.impl; + + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; +import kccf.sch.service.PopWordService; +import kccf.sch.service.vo.PopWordVO; +import kccf.sch.service.vo.Sf1VO; + +@Service("PopwordService") +public class PopWordServiceImpl extends EgovAbstractServiceImpl implements PopWordService{ + private static final Logger LOGGER = LoggerFactory.getLogger(PopWordServiceImpl.class); + /** + * 인기검색어 호출 + */ + @Override + public String getPopWord(PopWordVO popWordVo, Sf1VO sf1Vo) throws Exception { + StringBuffer urlSb = new StringBuffer(); + urlSb.append("http://"); + urlSb.append(sf1Vo.getManagerIp()).append(":"); + urlSb.append(sf1Vo.getManagerPort()); + urlSb.append("/manager/WNRun.do?"); + + urlSb.append("target=").append(popWordVo.getTarget()); + urlSb.append("&charset=").append(popWordVo.getCharset()); + urlSb.append("&range=").append(popWordVo.getRange()); + urlSb.append("&collection=").append(popWordVo.getCollection()); + urlSb.append("&datatype=").append(popWordVo.getDataType()); + + //urlSb.append("&convert=fw"); + + String url = urlSb.toString(); + if(popWordVo.getDebugType().equals("Y")){ + LOGGER.info("[getPopWord() URL]["+url+"]"); + LOGGER.info("[getPopWord() sf1Vo.toString()]["+sf1Vo.toString()+"]"); + LOGGER.info("[getPopWord() popWordVo.toString()]["+popWordVo.toString()+"]"); + } + return getHtmls(url, popWordVo.getTimeOut() , popWordVo.getRange() , popWordVo.getDataType() , popWordVo.getCharset()); + } + + /** + * 관리도구 자동완성 URL 호출해야 해당 결과 담기 + * @param receiverURL 호출 URL + * @param timeout 연결시간 + * @param range 인기검색어 조회 범위설정[D:하루 ,W:주 ,M:월] + * @param datatype 데이타 타입 [xml or json] + * @param charset 인코딩 셋 [euc-kr or UTF-8] + * @return + */ + public String getHtmls(String receiverURL, int timeout , String range , String datatype , String charset){ + StringBuffer receiveMsg = new StringBuffer(); + BufferedReader in = null; + int errorCode = 0; + try{ + + // -- receive servlet connect + URL servletUrl = new URL(receiverURL); + HttpURLConnection uc = (HttpURLConnection)servletUrl.openConnection(); + uc.setReadTimeout(timeout); + uc.setRequestMethod("POST"); + uc.setDoOutput(true); + uc.setDoInput(true); + uc.setUseCaches(false); + uc.connect(); + // init + errorCode = 0; + // -- Network error check + if(uc.getResponseCode() == HttpURLConnection.HTTP_OK){ + String currLine = new String(); + //UTF-8인 경우 + in = new BufferedReader(new InputStreamReader(uc.getInputStream(), "UTF-8")); + //BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream())); + while ((currLine = in.readLine()) != null){ + receiveMsg.append(currLine).append("\r\n"); + } + }else{ + /* + errorCode = uc.getResponseCode(); + return receiveMsg.toString(); + */ + errorCode = uc.getResponseCode(); + receiveMsg.setLength(0); + if(datatype.toLowerCase().equals("xml")){ + receiveMsg.append("").append("\r\n"); + receiveMsg.append("").append("\r\n"); + receiveMsg.append("error:"+errorCode+"").append("\r\n"); + receiveMsg.append("").append("\r\n"); + receiveMsg.append("").append("\r\n"); + receiveMsg.append("").append("\r\n"); + }else if(datatype.toLowerCase().equals("json")){ + receiveMsg.append("{\"Data\":{\"MakeTime\":\"error\",\"Query\":[{}],\"Type\":{\"content\":\""+errorCode+"\",\"id\":\""+range+"\"},\"Label\":{\"content\":\""+errorCode+"\",\"id\":\""+range+"\"}}}"); + } + } + uc.disconnect(); + }catch(Exception ex){ + receiveMsg.setLength(0); + if(datatype.toLowerCase().equals("xml")){ + receiveMsg.append("").append("\r\n"); + receiveMsg.append("").append("\r\n"); + receiveMsg.append("error").append("\r\n"); + receiveMsg.append("").append("\r\n"); + receiveMsg.append("").append("\r\n"); + receiveMsg.append("").append("\r\n"); + }else if(datatype.toLowerCase().equals("json")){ + receiveMsg.append("{\"Data\":{\"MakeTime\":\"error\",\"Query\":[{}],\"Type\":{\"content\":\""+ex+"\",\"id\":\""+range+"\"},\"Label\":{\"content\":\""+ex+"\",\"id\":\""+range+"\"}}}"); + } + LOGGER.debug("[getHtmls() URL]["+receiverURL+"]"); + LOGGER.debug("[getHtmls() error][errorCode:"+errorCode+"]["+ex+"]"); + }finally { + if (in != null) { + try { + in.close(); + } catch (IOException ex) { + LOGGER.info("IOException occurred"); + } + } + } + return receiveMsg.toString(); + } + + + + +} diff --git a/src/main/java/kccf/sch/service/impl/SearchServiceImpl.java b/src/main/java/kccf/sch/service/impl/SearchServiceImpl.java new file mode 100644 index 00000000..f1ce6496 --- /dev/null +++ b/src/main/java/kccf/sch/service/impl/SearchServiceImpl.java @@ -0,0 +1,2470 @@ +package kccf.sch.service.impl; + +import static kccf.sch.common.WNDefine.*; + +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import kccf.sch.common.WNSearch; +import kccf.sch.common.WNUtils; +import kccf.sch.service.SearchCollectionResult; +import kccf.sch.service.SearchService; +import kccf.sch.service.vo.SearchCollectionVO; +import kccf.sch.service.vo.SearchVO; +import kccf.sch.service.vo.Sf1VO; + +import org.apache.commons.lang3.StringEscapeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +@Service("searchService") +public class SearchServiceImpl implements SearchService{ + + /** SearchDAO + @Resource(name="searchDAO") + SearchDAO searchDAO; + */ + + /** LOGGER */ + @SuppressWarnings("unused") + private static final Logger LOGGER = LoggerFactory.getLogger(SearchServiceImpl.class); + + + + /** 검색 결과 받기 */ + @Override + public SearchCollectionResult getSearch(SearchVO searchVO, Sf1VO sf1Vo) throws Exception { + try{ + boolean isDebug = true; //디버그 설정 + String[] collections = null; + String[] searchFields = null; + boolean isRealTimeKeyword = false; + boolean useSuggestedQuery = true; + + String exquery= ""; + String strOperation =""; + String exquery_info=""; + + + /** 검색어 */ + String query = searchVO.getQuery(); + query = StringEscapeUtils.unescapeHtml4(query); + query = WNUtils.checkReqXSS(query, ""); + searchVO.setQuery(query); + + /** 결과내 검색어 */ + String realQuery = searchVO.getRealQuery(); + realQuery = StringEscapeUtils.unescapeHtml4(realQuery); + realQuery = WNUtils.checkReqXSS(realQuery, ""); + + String reQuery = searchVO.getReQuery(); + reQuery = StringEscapeUtils.unescapeHtml4(reQuery); + reQuery = WNUtils.checkReqXSS(reQuery, ""); + searchVO.setReQuery(reQuery); + + /** 결과내 재검색 체크필드 */ + String rt = searchVO.getRt(); + rt = StringEscapeUtils.unescapeHtml4(rt); + + if(!reQuery.equals("")){ + rt = WNUtils.checkReqXSS(rt, "1"); + }else{ + rt = WNUtils.checkReqXSS(rt, ""); + } + + + /** 정렬조건 */ + String sortField = searchVO.getSortField(); + sortField = WNUtils.checkReqXSS(sortField, "RANK/DESC"); + searchVO.setSortField(sortField); + + /** 검색 필드*/ + String searchField = searchVO.getSearchField(); + searchField = WNUtils.checkReqXSS(searchField, "ALL"); + + + /** 검색 시작날짜 */ + String startDate = searchVO.getStartDate(); + startDate = WNUtils.checkReqXSS(startDate, "1970/01/01"); + + /** 검색 종료날짜*/ + String endDate = searchVO.getEndDate(); + endDate = WNUtils.checkReqXSS(endDate, WNUtils.getCurrentDate()); + + /** 컬렉션 이름*/ + String collection = searchVO.getCollection(); + if("".equals(collection)) searchVO.setCollection("ALL"); + collection = WNUtils.checkReqXSS(collection, "ALL"); + + + /** 시작위치 */ + int startCount = searchVO.getStartCount(); + if(startCount == 0 || collection.equals("ALL") || collection.equals("")){ + startCount =1; + } + + + /** 출력갯수 */ + int viewCount = searchVO.getViewCount(); + if ( collection.equals("ALL") || collection.equals("") ||viewCount == 0){ + viewCount = 4; + } + + /** 디버그 YN*/ + String debug = searchVO.getDebug(); + debug = WNUtils.checkReqXSS(debug, "Y"); + + /** 검색 연산자**/ + String operator = searchVO.getOperator(); + operator = WNUtils.checkReqXSS(operator, "N"); + String tmpQuery = query; + if("OR".equals(operator)){ + tmpQuery = tmpQuery.replaceAll(" ", "|"); + } + + /*********************고급 검색*********************************/ + //정확히 일치 + String exactQuery = searchVO.getExactQuery(); + exactQuery = StringEscapeUtils.unescapeHtml4(exactQuery); + exactQuery = WNUtils.checkReqXSS(exactQuery, ""); + searchVO.setExactQuery(exactQuery); + if(!exactQuery.equals("")){ + tmpQuery += "\"" + exactQuery + "\""; + } + + //반드시 포함 + String andQuery = searchVO.getAndQuery(); + andQuery = StringEscapeUtils.unescapeHtml4(andQuery); + andQuery = WNUtils.checkReqXSS(andQuery, ""); + searchVO.setAndQuery(andQuery); + if(!andQuery.equals("")){ + tmpQuery += " " + andQuery +"" ; + } + + //포함하지 않는 + String notQuery = searchVO.getNotQuery(); + notQuery = StringEscapeUtils.unescapeHtml4(notQuery); + notQuery = WNUtils.checkReqXSS(notQuery, ""); + searchVO.setNotQuery(notQuery); + if(!notQuery.equals("")){ + tmpQuery += "!" + notQuery +""; + } + + + /**********************상세 검색*********************************/ + //상세검색 - 관리번호(입력) + String mgnt_no = searchVO.getMgnt_no(); + mgnt_no = StringEscapeUtils.unescapeHtml4(mgnt_no); + mgnt_no = WNUtils.checkReqXSS(mgnt_no, ""); + //searchVO.setMgnt_no(mgnt_no); + if ( !mgnt_no.equals("") ) { + exquery += " "; + } + + //상세검색 - 시대(선택) + String trs_age = searchVO.getTrs_age(); + trs_age = StringEscapeUtils.unescapeHtml4(trs_age); + trs_age = WNUtils.checkReqXSS(trs_age, ""); + trs_age = trs_age.replace(",","|"); + if ( !trs_age.equals("") ) { + if(trs_age.indexOf("ALL") == -1){ + exquery += " "; + } + } + + //상세검색 - 주제분야(선택) + String second_category = searchVO.getSecond_category(); + second_category = StringEscapeUtils.unescapeHtml4(second_category); + second_category = WNUtils.checkReqXSS(second_category, ""); + second_category = second_category.replace(",","|"); + if ( !second_category.equals("") ) { + exquery += " "; + } + + //상세검색 - 문화테마(선택) + String series_cd = searchVO.getSeries_cd(); + series_cd = StringEscapeUtils.unescapeHtml4(series_cd); + series_cd = WNUtils.checkReqXSS(series_cd, ""); + series_cd = series_cd.replace(",","|"); + if ( !series_cd.equals("") ) { + exquery += " "; //역사문화유산^유교 + } + + + //상세검색 - 자료유형(선택) + String second_class = searchVO.getSecond_class(); + second_class = StringEscapeUtils.unescapeHtml4(second_class); + second_class = WNUtils.checkReqXSS(second_class, ""); + second_class = second_class.replace(",","|"); + if ( !second_class.equals("") ) { + exquery += " "; + } + + //상세검색 - 지역/문화원(선택) + String sojang_council = searchVO.getSojang_council(); + sojang_council = StringEscapeUtils.unescapeHtml4(sojang_council); + sojang_council = WNUtils.checkReqXSS(sojang_council, ""); + sojang_council = sojang_council.replace(",","|"); + if ( !sojang_council.equals("") && !sojang_council.equals("|")) { + exquery += " "; + } + + //상세검색 - 지역 (지역문화정보) + String search_area_council_info = searchVO.getSearch_area_council_info(); + search_area_council_info = StringEscapeUtils.unescapeHtml4(search_area_council_info); + search_area_council_info = WNUtils.checkReqXSS(search_area_council_info, ""); + search_area_council_info = search_area_council_info.replace(",","|"); + if ( !search_area_council_info.equals("") && !search_area_council_info.equals("|")) { + exquery_info+= " "; + } + + //상세검색 - 유형 (지역문화정보) + String content_type = searchVO.getContent_type(); + content_type = StringEscapeUtils.unescapeHtml4(content_type); + content_type = WNUtils.checkReqXSS(content_type, ""); + content_type = content_type.replace(",","|"); + if ( !content_type.equals("") && !content_type.equals("|")) { + exquery_info += " "; + } + + + //상세검색 - 발행년도(기간) + String genyear_start = searchVO.getGenyear_start(); + genyear_start = WNUtils.checkReqXSS(genyear_start, ""); + if( !genyear_start.equals("")) { + strOperation += " "; + } + + String genyear_end = searchVO.getGenyear_end(); + genyear_end = WNUtils.checkReqXSS(genyear_end, ""); + if( !genyear_end.equals("")) { + strOperation += ""; + } + + //상세검색 - 연대(기간) + String chronological_start = searchVO.getChronological_start(); + chronological_start = WNUtils.checkReqXSS(chronological_start, ""); + if( !chronological_start.equals("")) { + strOperation += " "; + } + + String chronological_end = searchVO.getChronological_end(); + chronological_end = WNUtils.checkReqXSS(chronological_end, ""); + if( !chronological_end.equals("")) { + strOperation += ""; + } + + /** 상세검색 컬렉션 체크박스 + String chkColls = searchVO.getChkColls(); + chkColls = WNUtils.checkReqXSS(chkColls, ""); + */ + + //쿼리 설정 + if (rt.equals("1")) { + realQuery = tmpQuery + " (" + reQuery+")"; //realQuery + } else if (!rt.equals("1") || "".equals(realQuery)) { + realQuery = tmpQuery; + } + + + String collection_real =""; + String[] collections_real = null; + + // 컬렉션 설정 + if(collection.equals("ALL") || collection.equals("")){ + collections = new String[]{"info","map","number","pick","reference","story","culturePost","total","toon"}; //COLLECTIONS; + collections_real = new String[]{"info","map","number","pick","reference","story","culturePost","total","toon"}; + collection_real = collection; + } + else if(collection.indexOf("_Coll") >= 0){ + collection_real = collection.replace("_Coll", ""); + if(collection.indexOf("culturePost") >= 0){ + collections = new String[]{"info","map","number","pick","reference","story","culturePost","culturePostHot","toon"}; + collections_real = new String[]{"culturePost","culturePostHot"}; + collection_real = "culturePost"; + }else{ + collections = new String[]{"info","map","number","pick","reference","story","culturePost","toon"}; + collections_real = new String[]{collection_real}; + } + } + + + WNSearch wnsearch = new WNSearch(isDebug, false, collections, searchFields); + + wnsearch.setSf1Vo(sf1Vo); + + for (int i = 0; i < collections.length; i++) { + + // PAGE_INFO 페이지 + int tmpViewCnt =viewCount; + if(collections[i].equals("info")){ + if(tmpViewCnt == 4){ + tmpViewCnt = 6; + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * tmpViewCnt) +","+tmpViewCnt); + }else{ + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * viewCount) +","+viewCount); + } + + } + else if(collections[i].equals("total")){ + tmpViewCnt=8; + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * tmpViewCnt) +","+tmpViewCnt); + } + else if(collections[i].equals("toon")){ //지역문화 툰 그리드형식으로 12건씩 출력 + if(collection.equals("ALL")||collection.equals("")){ //collection ALL일 경우 + tmpViewCnt = 6; + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * tmpViewCnt) +","+tmpViewCnt); + }else if(viewCount == 10){ + tmpViewCnt = 12; + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * tmpViewCnt) +","+tmpViewCnt); + }else{ + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * tmpViewCnt) +","+viewCount); + } + } + else{ + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * viewCount) +","+viewCount); + } + + // DATE_RANGE 날짜 + if("".equals(query) && "".equals(realQuery)){ + wnsearch.setCollectionInfoValue(collections[i], DATE_RANGE, "1970/01/01,2030/01/01,-"); + }else{ + wnsearch.setCollectionInfoValue(collections[i], DATE_RANGE, startDate.replaceAll("\\.","/") + "," + endDate.replaceAll("\\.","/") +",/"); + } + + // SORT_FIELD 정렬 필드 + if(collections[i].equals("total")){ + wnsearch.setCollectionInfoValue(collections[i], SORT_FIELD, "READ_CNT/DESC,DATE/DESC,RANK/DESC" ); + }else{ + if((collections[i].equals("info") ||collections[i].equals("culturePost") )&& sortField.equals("READ_CNT/DESC") ){ + wnsearch.setCollectionInfoValue(collections[i], SORT_FIELD, "RANK/DESC" ); + }else if (collections[i].equals("reference")){ + wnsearch.setCollectionInfoValue(collections[i], SORT_FIELD, "MAIN_IMG_EXIST/DESC,ORG_OPEN_EXIST/DESC," + sortField ); + }else{ + wnsearch.setCollectionInfoValue(collections[i], SORT_FIELD, sortField ); + } + } + + //exquery 설정 + if ( !collections[i].equals("map")){ + if( !collections[i].equals("info") && !exquery.equals("") ){ + wnsearch.setCollectionInfoValue(collections[i], EXQUERY_FIELD, exquery ); + }else if( collections[i].equals("info") && (!exquery.equals("") || !exquery_info.equals(""))){ + wnsearch.setCollectionInfoValue(collections[i], EXQUERY_FIELD, exquery + exquery_info ); + } + } + + //SearchField 값이 있으면 설정, 없으면 기본검색필드 + if ( !(searchVO.getSearchField()).equals("") && (searchVO.getSearchField()).indexOf("ALL") == -1 ) wnsearch.setCollectionInfoValue(collections[i], SEARCH_FIELD, (searchVO.getSearchField()) ); + + //operation 설정 + if ( !strOperation.equals("") ) { + wnsearch.setCollectionInfoValue(collections[i], FILTER_OPERATION, strOperation); + } + + if(!"ALL".equals(collection)){ + if("culturePost".equals(collections[i]) && "culturePost".equals(collection_real)) { + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "TAGS:1/SC,KEYWORDS:1/SC"); // + }else if ( "number".equals(collections[i]) && "number".equals(collection_real)){ + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "SEARCH_AREA_COUNCIL:1/SN,SEARCH_AREA_COUNCIL:2/SN,SEARCH_THEME_CD:1/SN,SEARCH_THEME_CD:2/SN,SEARCH_CLASS:1/SN,SEARCH_CLASS:2/SN"); + }else if ( "story".equals(collections[i]) && "story".equals(collection_real)){ + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "SEARCH_THEME_CD:1/SN,SEARCH_THEME_CD:2/SN,SEARCH_AREA_COUNCIL:1/SN,SEARCH_AREA_COUNCIL:2/SN"); //TAGS:1/SN,TAGS:1/SN + }else if ( "reference".equals(collections[i])&& "reference".equals(collection_real) ){ + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "SEARCH_CLASS:1/SN,SEARCH_CLASS:2/SN,SEARCH_CATEGORY:1/SN,SEARCH_CATEGORY:2/SN,SEARCH_AREA_COUNCIL:1/SN,SEARCH_AREA_COUNCIL:2/SN"); + }else if ( "info".equals(collections[i])&& "info".equals(collection_real) ){ + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "CONTENT_TYPE_NAME:1/SN,SEARCH_AREA_COUNCIL_INFO:1/SN"); + }else if ( "pick".equals(collections[i]) && "pick".equals(collection_real) ){ + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "SEARCH_CLASS:1/SN,SEARCH_CLASS:2/SN,SEARCH_AREA_COUNCIL:1/SN,SEARCH_AREA_COUNCIL:2/SN"); //TAGS:1/SN,TAGS:1/SN + }else if ( "toon".equals(collections[i])&& "toon".equals(collection_real) ){ + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "TAGS:1/SC"); + } + }else if("ALL".equals(collection)){ + if("total".equals(collections[i])) { + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "TAGS:1/SC"); + } + } + + } + + wnsearch.search(realQuery, isRealTimeKeyword, CONNECTION_CLOSE, useSuggestedQuery, sf1Vo.getSearchIp(), sf1Vo.getSearchPort()); + + searchVO.setRealQuery(realQuery); + + // 결과 담기 + SearchCollectionResult collResultList = new SearchCollectionResult(); + + // 디버그 메시지 출력 + String debugMsg = wnsearch.printDebug() != null ? wnsearch.printDebug().trim() : ""; + collResultList.setDebugStr(debugMsg); + if(isDebug){ + System.out.println("\n\n\n\n\n\n\n/*****************debugMsg********************/"+debugMsg); + } + + + // 결과 arrList + ArrayList collList = new ArrayList(); + for (int i = 0; i < collections.length; i++) { + SearchCollectionVO colVo = new SearchCollectionVO(); + int totalCount = wnsearch.getResultTotalCount(collections[i]); + int resultCount = wnsearch.getResultCount(collections[i]); + String collectionName = wnsearch.getCollectionInfoValue(collections[i], INDEX_NAME); + + String resultField = wnsearch.getCollectionInfoValue(collections[i], RESULT_FIELD); + String[] resultFieldArr = resultField.split(","); + + /** map 방식 1. */ + ArrayList> resultList = new ArrayList>(); + + for(int j = 0 ; j < resultCount ; j++){ + Map resultMap = new HashMap(); + for(int k = 0 ; k < resultFieldArr.length ; k ++){ + String[] documentFields = WNUtils.split(resultFieldArr[k], "/"); + resultMap.put(documentFields[0],wnsearch.getField(collections[i],documentFields[0] , j , false).replace("", "").replace("", "") ); + } + resultList.add(j,resultMap); + } + + colVo.setTotalCount(totalCount); + colVo.setResultCount(resultCount); + colVo.setCollectionName(collectionName); + colVo.setSearchResultList(resultList); + collList.add(i,colVo); + + } + + + int cateListCnt = collections.length ; + + //자료유형 카테고리 + if (collections_real.length == 1 && (collection_real.equals("pick") || collection_real.equals("number") || collection_real.equals("reference") )) { + String collection1 = collection_real; + + int first_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_CLASS", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_CLASS", 2); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + for (int j = 0; j < first_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_CLASS", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_CLASS", 1, j); + + + resultMap.put("first_class_nm", node); + resultMap.put("first_class_cnt", nodeCnt); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + } + + } + + colVo.setCollectionName("first_class_cate"); + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + + for (int j = 0; j < second_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_CLASS", 2, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_CLASS", 2, j); + + + resultMap.put("second_class_nm", node); + resultMap.put("second_class_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + + } + } + + colVo.setCollectionName("second_class_cate"); + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + + } + + //지역문화원 + if (collections_real.length == 1 && (collection_real.equals("pick") || collection_real.equals("reference") || collection_real.equals("story"))) { + String collection1 = collection_real; + int first_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_AREA_COUNCIL", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_AREA_COUNCIL", 2); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + for (int j = 0; j < first_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_AREA_COUNCIL", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_AREA_COUNCIL", 1, j); + + resultMap.put("first_council_nm", node); + resultMap.put("first_council_cnt", nodeCnt); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + } + } + + colVo.setCollectionName("first_council_cate"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + for (int j = 0; j < second_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_AREA_COUNCIL", 2, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_AREA_COUNCIL", 2, j); + + resultMap.put("second_council_nm", node); + resultMap.put("second_council_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + + } + } + + colVo.setCollectionName("second_council_cate"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + + } + + + + if (collections_real.length == 1 && collection_real.equals("number")) { + String collection1 = collection_real; + int second_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_AREA_COUNCIL", 2); + + //first + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + Map first_resultMap = new HashMap(); + + for (int j = 0; j < second_class_cnt; j++) { + String node = wnsearch.getCategoryName(collection1,"SEARCH_AREA_COUNCIL", 2 , j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_AREA_COUNCIL", 2, j); + + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + } + + //first + String[] first_node = node.split("\\^"); + if(first_resultMap.containsKey(first_node[0])){ + nodeCnt = first_resultMap.get(first_node[0]) + nodeCnt; + } + first_resultMap.put(first_node[0],nodeCnt); + } + + for (String key : first_resultMap.keySet()) { + Map resultMap = new HashMap(); + + resultMap.put("first_council_nm", key); + resultMap.put("first_council_cnt", first_resultMap.get(key)); + + resultList.add(j_result, resultMap); + j_result +=1; + + } + + colVo.setCollectionName("first_council_cate"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + //second + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + + for (int j = 0; j < second_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_AREA_COUNCIL", 2, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_AREA_COUNCIL", 2, j); + + //second + resultMap.put("second_council_nm", node); + resultMap.put("second_council_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + + } + } + + colVo.setCollectionName("second_council_cate"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + } + + + //지역,유형 + if (collections_real.length == 1 && collection_real.equals("info")) { + String collection1 = collection_real; + int first_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_AREA_COUNCIL_INFO", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "CONTENT_TYPE_NAME", 1); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + for (int j = 0; j < first_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_AREA_COUNCIL_INFO", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_AREA_COUNCIL_INFO", 1, j); + + resultMap.put("first_council_nm", node); + resultMap.put("first_council_cnt", nodeCnt); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + } + } + + colVo.setCollectionName("first_council_cate"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int nodeCnt_total = 0; + + int j_result = 0; + for (int j = 0; j < second_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"CONTENT_TYPE_NAME", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "CONTENT_TYPE_NAME", 1, j); + + resultMap.put("second_council_nm", node); + resultMap.put("second_council_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + } + } + + colVo.setCollectionName("second_council_cate"); + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + + } + + + //주제분야 + if (collections_real.length == 1 && collection_real.equals("reference") ) { + String collection1 = collection_real; + + int first_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_CATEGORY", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_CATEGORY", 2); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + + for (int j = 0; j < first_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_CATEGORY", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_CATEGORY", 1, j); + + + resultMap.put("first_category_nm", node); + resultMap.put("first_category_cnt", nodeCnt); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + + } + } + + colVo.setCollectionName("first_category_cate"); + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + + for (int j = 0; j < second_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_CATEGORY", 2, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_CATEGORY", 2, j); + + + resultMap.put("second_category_nm", node); + resultMap.put("second_category_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + } + } + + colVo.setCollectionName("second_category_cate"); + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + + } + + //테마 + if (collections_real.length == 1 && ( collection_real.equals("number") || collection_real.equals("story") )) { + String collection1 = collection_real; + + int first_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_THEME_CD", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_THEME_CD", 2); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + + for (int j = 0; j < first_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_THEME_CD", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_THEME_CD", 1, j); + + resultMap.put("first_theme_cd", node); + resultMap.put("first_theme_cnt", nodeCnt); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + + } + } + + colVo.setCollectionName("first_theme_cate"); + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + + for (int j = 0; j < second_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_THEME_CD", 2, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_THEME_CD", 2, j); + + resultMap.put("second_theme_cd", node); + resultMap.put("second_theme_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + + } + } + + colVo.setCollectionName("second_theme_cate"); + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + + } + + + + //지역문화포스트 + if (collections_real.length == 2 && "culturePost".equals(collection_real) ) { + String collection1 = collection_real; + + int first_class_cnt= wnsearch.getCategoryCount(collection1, "TAGS", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "KEYWORDS", 1); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + //int j_result = 0; + int cateCnt = 0; + for (int j = 0; j < first_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"TAGS", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "TAGS", 1, j); + + if (("null").equalsIgnoreCase(node)) { + continue; + }else if(cateCnt < 10 || ("^").equalsIgnoreCase(node)){ + resultMap.put("tags_nm", node); + resultMap.put("tags_cnt", nodeCnt); + + resultList.add(cateCnt, resultMap); + cateCnt ++; + } + } + + colVo.setCollectionName("culturePostHot_tags"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int cateCnt = 0; + for (int j = 0; j < second_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"KEYWORDS", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "KEYWORDS", 1, j); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else if(cateCnt < 10){ + resultMap.put("keywords_nm", node); + resultMap.put("keywords_cnt", nodeCnt); + + resultList.add(cateCnt, resultMap); + cateCnt ++; + } + } + + colVo.setCollectionName("culturePostHot_keywords"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + } + + //지역문화툰 + if (collections_real.length == 1 && "toon".equals(collection_real) ) { + String collection1 = collection_real; + + int first_class_cnt= wnsearch.getCategoryCount(collection1, "TAGS", 1); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + //int j_result = 0; + int cateCnt = 0; + for (int j = 0; j < first_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"TAGS", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "TAGS", 1, j); + + if (("null").equalsIgnoreCase(node)) { + continue; + }else if(cateCnt < 10 || ("^").equalsIgnoreCase(node)){ + resultMap.put("tags_nm", node); + resultMap.put("tags_cnt", nodeCnt); + + resultList.add(cateCnt, resultMap); + cateCnt ++; + } + } + + colVo.setCollectionName("toon_tags"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + } + + //통합검색 total 태그 + if (collections_real.length != 1 && "ALL".equals(collection_real) ) { + String collection1 = "total"; + int first_class_cnt= wnsearch.getCategoryCount(collection1, "TAGS", 1); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int cateCnt = 0; + for (int j = 0; j < first_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"TAGS", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "TAGS", 1, j); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else if(cateCnt < 10){ + resultMap.put("tags_nm", node); + resultMap.put("tags_cnt", nodeCnt); + + resultList.add(cateCnt, resultMap); + cateCnt ++; + } + } + + colVo.setCollectionName("total_tags"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + } + + + + collResultList.setCollectionList(collList); + + // 연결 종료 + if ( wnsearch != null ) { + wnsearch.closeServer(); + } + return collResultList; + }catch(Exception e){ + e.printStackTrace(); + } + return null; + } + + @Override + public String getSearchEtc(SearchVO searchVO ,Sf1VO sf1Vo) throws Exception { + StringBuffer receiverURL = new StringBuffer(); + receiverURL.append("http://"); + receiverURL.append(sf1Vo.getManagerIp()).append(":"); + receiverURL.append(sf1Vo.getManagerPort()); + receiverURL.append("/manage/Manager.do?"); + receiverURL.append("xml="+URLEncoder.encode(" Monitoring Start Module cmanager1 Program theme_k-static etc undefined undefined ", "UTF-8")); + + String receiverURLStr = receiverURL.toString(); + String ret = ""; + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + LOGGER.info("InterruptedException occurred"); + } + + if(getHtmls(receiverURLStr, sf1Vo.getSearchTimeOut())){ + ret = "success"; + }else{ + ret = "fail"; + } + return ret; + } + + /** + * 관리도구 자동완성 URL 호출해야 해당 결과 담기 + * @param receiverURL 관리도구 URL 정보 + * @param parameter 배치 정보 관련 파라미터값 + * @param timeout 연결 시간 고정으로 3000 + */ + private boolean getHtmls(String receiverURL, int timeout) { + boolean result = false; + HttpURLConnection uc = null; + int errorCode = 0; + try { + URL servletUrl = new URL(receiverURL); + uc = (HttpURLConnection) servletUrl.openConnection(); + uc.setRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=UTF-8"); + uc.setRequestMethod("POST"); + uc.setDoOutput(true); + uc.setDoInput(true); + uc.setUseCaches(false); + uc.setConnectTimeout(timeout); + uc.setReadTimeout(timeout); + uc.connect(); + + // -- Network error check + //System.out.println("[URLConnection Response Code] " + uc.getResponseCode()); + if (uc.getResponseCode() == HttpURLConnection.HTTP_OK) { + errorCode = uc.getResponseCode(); + result = true; + } else { + errorCode = uc.getResponseCode(); + result = false; + } + } catch(Exception ex) { + LOGGER.debug("[getHtmls() URL]["+receiverURL+"]"); + LOGGER.debug("[getHtmls() error][errorCode:"+errorCode+"]["+ex+"]"); + } finally { + uc.disconnect(); + } + + return result; + } + + + + + + + + + + + /** 검색 결과 count */ + @Override + public int getSearch_All_cnt(SearchVO searchVO, Sf1VO sf1Vo) throws Exception { + try{ + boolean isDebug = true; + String[] collections = null; + String[] searchFields = null; + boolean isRealTimeKeyword = false; + boolean useSuggestedQuery = true; + isDebug = true; //디버그 설정 + + String exquery= ""; + String strOperation =""; + + + /** 검색어 */ + String query = searchVO.getQuery(); + query = StringEscapeUtils.unescapeHtml4(query); + query = WNUtils.checkReqXSS(query, ""); + searchVO.setQuery(query); + + /** 결과내 검색어 */ + String realQuery = searchVO.getRealQuery(); + realQuery = StringEscapeUtils.unescapeHtml4(realQuery); + realQuery = WNUtils.checkReqXSS(realQuery, ""); + + String reQuery = searchVO.getReQuery(); + reQuery = StringEscapeUtils.unescapeHtml4(reQuery); + reQuery = WNUtils.checkReqXSS(reQuery, ""); + searchVO.setReQuery(reQuery); + + /** 결과내 재검색 체크필드 */ + String rt = searchVO.getRt(); + rt = StringEscapeUtils.unescapeHtml4(rt); + + if(!reQuery.equals("")){ + rt = WNUtils.checkReqXSS(rt, "1"); + }else{ + rt = WNUtils.checkReqXSS(rt, ""); + } + + + /** 정렬조건 */ + String sortField = searchVO.getSortField(); + sortField = WNUtils.checkReqXSS(sortField, "RANK/DESC"); + searchVO.setSortField(sortField); + + /* *//** 정렬 방식*//* + String sortOrder = searchVO.getSortOrder(); + sortOrder = WNUtils.checkReqXSS(sortOrder, "DESC");*/ + + /** 검색 필드*/ + String searchField = searchVO.getSearchField(); + searchField = WNUtils.checkReqXSS(searchField, "ALL"); + + + /** 검색 시작날짜 */ + String startDate = searchVO.getStartDate(); + startDate = WNUtils.checkReqXSS(startDate, "1970/01/01"); + + /** 검색 종료날짜*/ + String endDate = searchVO.getEndDate(); + endDate = WNUtils.checkReqXSS(endDate, WNUtils.getCurrentDate()); + + /** 컬렉션 이름*/ + String collection = searchVO.getCollection(); + if("".equals(collection)) searchVO.setCollection("ALL"); + collection = WNUtils.checkReqXSS(collection, "ALL"); + + + /** 시작위치 */ + int startCount = searchVO.getStartCount(); + if(startCount == 0 || collection.equals("ALL") || collection.equals("")){ + startCount =1; + } + + + /** 출력갯수 */ + int viewCount = searchVO.getViewCount(); + if ( collection.equals("ALL") || collection.equals("") ||viewCount == 0){ + viewCount = 4; + } + + // searchVO.setViewCount(viewCount); + + /** 디버그 YN*/ + String debug = searchVO.getDebug(); + debug = WNUtils.checkReqXSS(debug, "Y"); + + /** 검색 연산자**/ + String operator = searchVO.getOperator(); + operator = WNUtils.checkReqXSS(operator, "N"); + String tmpQuery = query; + if("OR".equals(operator)){ + tmpQuery = tmpQuery.replaceAll(" ", "|"); + } + + /*********************고급 검색*********************************/ + //정확히 일치 + String exactQuery = searchVO.getExactQuery(); + exactQuery = StringEscapeUtils.unescapeHtml4(exactQuery); + exactQuery = WNUtils.checkReqXSS(exactQuery, ""); + searchVO.setExactQuery(exactQuery); + if(!exactQuery.equals("")){ + tmpQuery += "\"" + exactQuery + "\""; + } + + //반드시 포함 + String andQuery = searchVO.getAndQuery(); + andQuery = StringEscapeUtils.unescapeHtml4(andQuery); + andQuery = WNUtils.checkReqXSS(andQuery, ""); + searchVO.setAndQuery(andQuery); + if(!andQuery.equals("")){ + tmpQuery += " " + andQuery +"" ; + } + + //포함하지 않는 + String notQuery = searchVO.getNotQuery(); + notQuery = StringEscapeUtils.unescapeHtml4(notQuery); + notQuery = WNUtils.checkReqXSS(notQuery, ""); + searchVO.setNotQuery(notQuery); + if(!notQuery.equals("")){ + tmpQuery += "!" + notQuery +""; + } + + + /**********************상세 검색*********************************/ + //상세검색 - 관리번호(입력) + String mgnt_no = searchVO.getMgnt_no(); + mgnt_no = StringEscapeUtils.unescapeHtml4(mgnt_no); + mgnt_no = WNUtils.checkReqXSS(mgnt_no, ""); + //searchVO.setMgnt_no(mgnt_no); + if ( !mgnt_no.equals("") ) { + exquery += " "; + } + + //상세검색 - 시대(선택) + String trs_age = searchVO.getTrs_age(); + trs_age = StringEscapeUtils.unescapeHtml4(trs_age); + trs_age = WNUtils.checkReqXSS(trs_age, ""); + trs_age = trs_age.replace(",","|"); + if ( !trs_age.equals("") ) { + if(trs_age.indexOf("ALL") == -1){ + exquery += " "; + } + } + + //상세검색 - 주제분야(선택) + String second_category = searchVO.getSecond_category(); + second_category = StringEscapeUtils.unescapeHtml4(second_category); + second_category = WNUtils.checkReqXSS(second_category, ""); + second_category = second_category.replace(",","|"); + if ( !second_category.equals("") ) { + exquery += " "; + } + + //상세검색 - 문화테마(선택) + String series_cd = searchVO.getSeries_cd(); + series_cd = StringEscapeUtils.unescapeHtml4(series_cd); + series_cd = WNUtils.checkReqXSS(series_cd, ""); + series_cd = series_cd.replace(",","|"); + if ( !series_cd.equals("") ) { + exquery += " "; + } + + + //상세검색 - 자료유형(선택) + String second_class = searchVO.getSecond_class(); + second_class = StringEscapeUtils.unescapeHtml4(second_class); + second_class = WNUtils.checkReqXSS(second_class, ""); + second_class = second_class.replace(",","|"); + if ( !second_class.equals("") ) { + exquery += " "; + }/*else if(second_class.equals("")){ //chk + searchVO.setFirst_class(""); + }*/ + + + + //상세검색 - 지역/문화원(선택) + String sojang_council = searchVO.getSojang_council(); + sojang_council = StringEscapeUtils.unescapeHtml4(sojang_council); + sojang_council = WNUtils.checkReqXSS(sojang_council, ""); + sojang_council = sojang_council.replace(",","|"); + if ( !sojang_council.equals("") && !sojang_council.equals("|")) { + exquery += " "; + }/*else if(second_class.equals("")){ //chk + searchVO.setSido_name(""); + }*/ + + + //System.out.println("\n\n\n\n\n\n\n/*****************[totalCount-exquery]********************"+exquery); + + + //상세검색 - 발행년도(기간) + String genyear_start = searchVO.getGenyear_start(); + genyear_start = WNUtils.checkReqXSS(genyear_start, ""); + if( !genyear_start.equals("")) { + strOperation += " "; + } + + String genyear_end = searchVO.getGenyear_end(); + genyear_end = WNUtils.checkReqXSS(genyear_end, ""); + if( !genyear_end.equals("")) { + strOperation += ""; + } + + //상세검색 - 연대(기간) + String chronological_start = searchVO.getChronological_start(); + chronological_start = WNUtils.checkReqXSS(chronological_start, ""); + if( !chronological_start.equals("")) { + strOperation += " "; + } + + String chronological_end = searchVO.getChronological_end(); + chronological_end = WNUtils.checkReqXSS(chronological_end, ""); + if( !chronological_end.equals("")) { + strOperation += ""; + } + + + + //쿼리 설정 + if (rt.equals("1")) { + realQuery = tmpQuery + " (" + reQuery+")"; //realQuery + } else if (!rt.equals("1") || "".equals(realQuery)) { + realQuery = tmpQuery; + } + + + // 컬렉션 설정 + //if(collection.equals("ALL") || collection.equals("")){ + collections = new String[]{"info","map","number","pick","reference","story","culturePost", "toon"}; + + WNSearch wnsearch = new WNSearch(isDebug, false, collections, searchFields); + + wnsearch.setSf1Vo(sf1Vo); + + for (int i = 0; i < collections.length; i++) { + + // PAGE_INFO 페이지 + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * viewCount) +","+viewCount); + + + // DATE_RANGE 날짜 + if("".equals(query) && "".equals(realQuery)){ + wnsearch.setCollectionInfoValue(collections[i], DATE_RANGE, "1970/01/01,2030/01/01,-"); + }else{ + wnsearch.setCollectionInfoValue(collections[i], DATE_RANGE, startDate.replaceAll("\\.","/") + "," + endDate.replaceAll("\\.","/") +",/"); + } + + // SORT_FIELD 정렬 필드 + /* if(collections[i].equals("total")){ + wnsearch.setCollectionInfoValue(collections[i], SORT_FIELD, "READ_CNT/DESC" ); + }else{ + wnsearch.setCollectionInfoValue(collections[i], SORT_FIELD, sortField ); + } + else{ + if(sortField.equals("READ_CNT/DESC") && collections[i].equals("total") && collections[i].equals("total")){ + wnsearch.setCollectionInfoValue(collections[i], SORT_FIELD, sortField ); + }else{ + wnsearch.setCollectionInfoValue(collections[i], SORT_FIELD, sortField ); + } + }*/ + + + //exquery 설정 + if ( !exquery.equals("") ){ + if(!collections[i].equals("map")){ + wnsearch.setCollectionInfoValue(collections[i], EXQUERY_FIELD, exquery ); + } + + } + + //SearchField 값이 있으면 설정, 없으면 기본검색필드 + if ( !(searchVO.getSearchField()).equals("") && (searchVO.getSearchField()).indexOf("ALL") == -1 ) wnsearch.setCollectionInfoValue(collections[i], SEARCH_FIELD, (searchVO.getSearchField()) ); + + //operation 설정 + if ( !strOperation.equals("") ) { + wnsearch.setCollectionInfoValue(collections[i], FILTER_OPERATION, strOperation); + } + + } + + wnsearch.search(realQuery, isRealTimeKeyword, CONNECTION_CLOSE, useSuggestedQuery, sf1Vo.getSearchIp(), sf1Vo.getSearchPort()); + searchVO.setRealQuery(realQuery); + + // 결과 담기 + SearchCollectionResult collResultList = new SearchCollectionResult(); + + // 디버그 메시지 출력 + String debugMsg = wnsearch.printDebug() != null ? wnsearch.printDebug().trim() : ""; + collResultList.setDebugStr(debugMsg); + //System.out.println("\n\n\n\n\n\n\n/*****************[totalCount-debugMsg]********************/"+debugMsg); + + int totalCount = 0 ; + + // 결과 arrList + for (int i = 0; i < collections.length; i++) { // 컬렉션 for + + totalCount += wnsearch.getResultTotalCount(collections[i]); + + } + + //System.out.println("\n\n\n\n\n\n\n/*****************[totalCount-totalCount]********************/"+totalCount); + + + // 연결 종료 + if ( wnsearch != null ) { + wnsearch.closeServer(); + } + return totalCount; + }catch(Exception e){ + e.printStackTrace(); + } + return 0; + } + + + + /** 검색 결과 받기 */ + @Override + public SearchCollectionResult getSearch_ajax(SearchVO searchVO, Sf1VO sf1Vo) throws Exception { + try{ + boolean isDebug = true; + String[] collections = null; + String[] searchFields = null; + boolean isRealTimeKeyword = false; + boolean useSuggestedQuery = true; + isDebug = true; //디버그 설정 + + String exquery= ""; + String strOperation =""; + String exquery_info=""; + + + /** 검색어 */ + String query = searchVO.getQuery(); + query = StringEscapeUtils.unescapeHtml4(query); + query = WNUtils.checkReqXSS(query, ""); + searchVO.setQuery(query); + + /** 결과내 검색어 */ + String realQuery = searchVO.getRealQuery(); + realQuery = StringEscapeUtils.unescapeHtml4(realQuery); + realQuery = WNUtils.checkReqXSS(realQuery, ""); + + String reQuery = searchVO.getReQuery(); + reQuery = StringEscapeUtils.unescapeHtml4(reQuery); + reQuery = WNUtils.checkReqXSS(reQuery, ""); + searchVO.setReQuery(reQuery); + + /** 결과내 재검색 체크필드 */ + String rt = searchVO.getRt(); + rt = StringEscapeUtils.unescapeHtml4(rt); + + if(!reQuery.equals("")){ + rt = WNUtils.checkReqXSS(rt, "1"); + }else{ + rt = WNUtils.checkReqXSS(rt, ""); + } + + + /** 정렬조건 */ + String sortField = searchVO.getSortField(); + sortField = WNUtils.checkReqXSS(sortField, "RANK/DESC"); + searchVO.setSortField(sortField); + + /** 검색 필드*/ + String searchField = searchVO.getSearchField(); + searchField = WNUtils.checkReqXSS(searchField, "ALL"); + + + /** 검색 시작날짜 */ + String startDate = searchVO.getStartDate(); + startDate = WNUtils.checkReqXSS(startDate, "1970/01/01"); + + /** 검색 종료날짜*/ + String endDate = searchVO.getEndDate(); + endDate = WNUtils.checkReqXSS(endDate, WNUtils.getCurrentDate()); + + /** 컬렉션 이름*/ + String collection = searchVO.getCollection(); + if("".equals(collection)) searchVO.setCollection("ALL"); + collection = WNUtils.checkReqXSS(collection, "ALL"); + + + /** 시작위치 */ + int startCount = searchVO.getStartCount(); + if(startCount == 0 || collection.equals("ALL") || collection.equals("")){ + startCount =1; + } + + + /** 출력갯수 */ + int viewCount = searchVO.getViewCount(); + if ( collection.equals("ALL") || collection.equals("") ||viewCount == 0){ + viewCount = 4; + } + + // searchVO.setViewCount(viewCount); + + /** 디버그 YN*/ + String debug = searchVO.getDebug(); + debug = WNUtils.checkReqXSS(debug, "Y"); + + /** 검색 연산자**/ + String operator = searchVO.getOperator(); + operator = WNUtils.checkReqXSS(operator, "N"); + String tmpQuery = query; + if("OR".equals(operator)){ + tmpQuery = tmpQuery.replaceAll(" ", "|"); + } + + /*********************고급 검색*********************************/ + //정확히 일치 + String exactQuery = searchVO.getExactQuery(); + exactQuery = StringEscapeUtils.unescapeHtml4(exactQuery); + exactQuery = WNUtils.checkReqXSS(exactQuery, ""); + searchVO.setExactQuery(exactQuery); + if(!exactQuery.equals("")){ + tmpQuery += "\"" + exactQuery + "\""; + } + + //반드시 포함 + String andQuery = searchVO.getAndQuery(); + andQuery = StringEscapeUtils.unescapeHtml4(andQuery); + andQuery = WNUtils.checkReqXSS(andQuery, ""); + searchVO.setAndQuery(andQuery); + if(!andQuery.equals("")){ + tmpQuery += " " + andQuery +"" ; + } + + //포함하지 않는 + String notQuery = searchVO.getNotQuery(); + notQuery = StringEscapeUtils.unescapeHtml4(notQuery); + notQuery = WNUtils.checkReqXSS(notQuery, ""); + searchVO.setNotQuery(notQuery); + if(!notQuery.equals("")){ + tmpQuery += "!" + notQuery +""; + } + + + /**********************상세 검색*********************************/ + //상세검색 - 관리번호(입력) + String mgnt_no = searchVO.getMgnt_no(); + mgnt_no = StringEscapeUtils.unescapeHtml4(mgnt_no); + mgnt_no = WNUtils.checkReqXSS(mgnt_no, ""); + //searchVO.setMgnt_no(mgnt_no); + if ( !mgnt_no.equals("") ) { + exquery += " "; + } + + //상세검색 - 시대(선택) + String trs_age = searchVO.getTrs_age(); + trs_age = StringEscapeUtils.unescapeHtml4(trs_age); + trs_age = WNUtils.checkReqXSS(trs_age, ""); + trs_age = trs_age.replace(",","|"); + if ( !trs_age.equals("") ) { + if(trs_age.indexOf("ALL") == -1){ + exquery += " "; + } + } + + //상세검색 - 주제분야(선택) + String second_category = searchVO.getSecond_category(); + second_category = StringEscapeUtils.unescapeHtml4(second_category); + second_category = WNUtils.checkReqXSS(second_category, ""); + second_category = second_category.replace(",","|"); + if ( !second_category.equals("") ) { + exquery += " "; + } + + //상세검색 - 문화테마(선택) + String series_cd = searchVO.getSeries_cd(); + series_cd = StringEscapeUtils.unescapeHtml4(series_cd); + series_cd = WNUtils.checkReqXSS(series_cd, ""); + series_cd = series_cd.replace(",","|"); + if ( !series_cd.equals("") ) { + exquery += " "; //역사문화유산^유교 + } + + + //상세검색 - 자료유형(선택) + String second_class = searchVO.getSecond_class(); + second_class = StringEscapeUtils.unescapeHtml4(second_class); + second_class = WNUtils.checkReqXSS(second_class, ""); + second_class = second_class.replace(",","|"); + if ( !second_class.equals("") ) { + exquery += " "; + }/*else if(second_class.equals("")){ //chk + searchVO.setFirst_class(""); + }*/ + + //상세검색 - 지역/문화원(선택) + String sojang_council = searchVO.getSojang_council(); + sojang_council = StringEscapeUtils.unescapeHtml4(sojang_council); + sojang_council = WNUtils.checkReqXSS(sojang_council, ""); + sojang_council = sojang_council.replace(",","|"); + if ( !sojang_council.equals("") && !sojang_council.equals("|")) { + exquery += " "; + } + + + + //상세검색 - 지역 (지역문화정보) + String search_area_council_info = searchVO.getSearch_area_council_info(); + search_area_council_info = StringEscapeUtils.unescapeHtml4(search_area_council_info); + search_area_council_info = WNUtils.checkReqXSS(search_area_council_info, ""); + search_area_council_info = search_area_council_info.replace(",","|"); + if ( !search_area_council_info.equals("") && !search_area_council_info.equals("|")) { + exquery_info+= " "; + } + + //상세검색 - 유형 (지역문화정보) + String content_type = searchVO.getContent_type(); + content_type = StringEscapeUtils.unescapeHtml4(content_type); + content_type = WNUtils.checkReqXSS(content_type, ""); + content_type = content_type.replace(",","|"); + if ( !content_type.equals("") && !content_type.equals("|")) { + exquery_info += " "; + } + + System.out.println("\n\n\n\n\n\n\n/*****************exquery********************"+exquery + exquery_info); + + + + //상세검색 - 발행년도(기간) + String genyear_start = searchVO.getGenyear_start(); + genyear_start = WNUtils.checkReqXSS(genyear_start, ""); + if( !genyear_start.equals("")) { + strOperation += " "; + } + + String genyear_end = searchVO.getGenyear_end(); + genyear_end = WNUtils.checkReqXSS(genyear_end, ""); + if( !genyear_end.equals("")) { + strOperation += ""; + } + + //상세검색 - 연대(기간) + String chronological_start = searchVO.getChronological_start(); + chronological_start = WNUtils.checkReqXSS(chronological_start, ""); + if( !chronological_start.equals("")) { + strOperation += " "; + } + + String chronological_end = searchVO.getChronological_end(); + chronological_end = WNUtils.checkReqXSS(chronological_end, ""); + if( !chronological_end.equals("")) { + strOperation += ""; + } + + /** 상세검색 컬렉션 체크박스*/ + //String chkColls = searchVO.getChkColls(); + //chkColls = WNUtils.checkReqXSS(chkColls, ""); + + + + //쿼리 설정 + if (rt.equals("1")) { + realQuery = tmpQuery + " (" + reQuery+")"; //realQuery + } else if (!rt.equals("1") || "".equals(realQuery)) { + realQuery = tmpQuery; + } + //System.out.println("\n\n\n\n\n\n\n/*****************tmpQuery********************/"+tmpQuery); + + String collection_real =""; + String[] collections_real = null; + + // 컬렉션 설정 + /*if(collection.indexOf("_Coll") >= 0){ + collection_real = collection.replace("_Coll", ""); + if(collection.indexOf("culturePost") >= 0){ + collections = new String[]{"info","map","number","pick","reference","story","culturePost","culturePostHot"}; + collections_real = new String[]{"culturePost","culturePostHot"}; + collection_real = "culturePost"; + }else{ + collections = new String[]{"info","map","number","pick","reference","story","culturePost"}; + collections_real = new String[]{collection_real}; + } + } + */ + + if(collection.equals("ALL") || collection.equals("")){ + collections = new String[]{"info","map","number","pick","reference","story","culturePost","total"};//COLLECTIONS; + collections_real = new String[]{"info","map","number","pick","reference","story","culturePost","total"}; + collection_real = collection; + } + else if(collection.indexOf("_Coll") >= 0){ + collection_real = collection.replace("_Coll", ""); + if(collection.indexOf("culturePost") >= 0){ + collections = new String[]{"info","map","number","pick","reference","story","culturePost","culturePostHot"}; + collections_real = new String[]{"culturePost","culturePostHot"}; + collection_real = "culturePost"; + }else{ + collections = new String[]{"info","map","number","pick","reference","story","culturePost"}; + collections_real = new String[]{collection_real}; + } + } + + System.out.println("\n\n\n\n#################################[collection_real]: "+collection_real); + + WNSearch wnsearch = new WNSearch(isDebug, false, collections, searchFields); + + wnsearch.setSf1Vo(sf1Vo); + + for (int i = 0; i < collections.length; i++) { + // PAGE_INFO 페이지 + int tmpViewCnt =viewCount; + if(collections[i].equals("info")){ + if(tmpViewCnt == 4){ + tmpViewCnt = 6; + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * tmpViewCnt) +","+tmpViewCnt); + }else{ + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * viewCount) +","+viewCount); + } + + } + else if(collections[i].equals("total")){ + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * tmpViewCnt) +","+8); + } + else{ + wnsearch.setCollectionInfoValue(collections[i], PAGE_INFO, ((startCount - 1 ) * viewCount) +","+viewCount); + } + + // DATE_RANGE 날짜 + if("".equals(query) && "".equals(realQuery)){ + wnsearch.setCollectionInfoValue(collections[i], DATE_RANGE, "1970/01/01,2030/01/01,-"); + }else{ + wnsearch.setCollectionInfoValue(collections[i], DATE_RANGE, startDate.replaceAll("\\.","/") + "," + endDate.replaceAll("\\.","/") +",/"); + } + + // SORT_FIELD 정렬 필드 + if(collections[i].equals("total")){ + wnsearch.setCollectionInfoValue(collections[i], SORT_FIELD, "READ_CNT/DESC,DATE/DESC,RANK/DESC" ); + }else{ + wnsearch.setCollectionInfoValue(collections[i], SORT_FIELD, sortField ); + } + + + //exquery 설정 + if ( !collections[i].equals("map")){ + if( !collections[i].equals("info") && !exquery.equals("") ){ + wnsearch.setCollectionInfoValue(collections[i], EXQUERY_FIELD, exquery ); + }else if( collections[i].equals("info") && (!exquery.equals("") || !exquery_info.equals(""))){ + wnsearch.setCollectionInfoValue(collections[i], EXQUERY_FIELD, exquery + exquery_info ); + } + } + + //SearchField 값이 있으면 설정, 없으면 기본검색필드 + if ( !(searchVO.getSearchField()).equals("") && (searchVO.getSearchField()).indexOf("ALL") == -1 ) wnsearch.setCollectionInfoValue(collections[i], SEARCH_FIELD, (searchVO.getSearchField()) ); + + //operation 설정 + if ( !strOperation.equals("") ) { + wnsearch.setCollectionInfoValue(collections[i], FILTER_OPERATION, strOperation); + } + + + if(!"ALL".equals(collection)){ + if("culturePost".equals(collections[i]) && "culturePost".equals(collection_real)) { + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "TAGS:1/SC,KEYWORDS:1/SC"); // + }else if ( "number".equals(collections[i]) && "number".equals(collection_real)){ + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "SEARCH_AREA_COUNCIL:1/SN,SEARCH_AREA_COUNCIL:2/SN,SEARCH_THEME_CD:1/SN,SEARCH_THEME_CD:2/SN,SEARCH_CLASS:1/SN,SEARCH_CLASS:2/SN"); + }else if ( "story".equals(collections[i]) && "story".equals(collection_real)){ + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "SEARCH_THEME_CD:1/SN,SEARCH_THEME_CD:2/SN,SEARCH_AREA_COUNCIL:1/SN,SEARCH_AREA_COUNCIL:2/SN"); //TAGS:1/SN,TAGS:1/SN + }else if ( "reference".equals(collections[i])&& "reference".equals(collection_real) ){ + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "SEARCH_CLASS:1/SN,SEARCH_CLASS:2/SN,SEARCH_CATEGORY:1/SN,SEARCH_CATEGORY:2/SN,SEARCH_AREA_COUNCIL:1/SN,SEARCH_AREA_COUNCIL:2/SN"); + }else if ( "info".equals(collections[i])&& "info".equals(collection_real) ){ + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "CONTENT_TYPE_NAME:1/SN,SEARCH_AREA_COUNCIL_INFO:1/SN"); + }else if ( "pick".equals(collections[i]) && "pick".equals(collection_real) ){ + System.out.println(collections[i]+"########################pick:" + ( "pick".equals(collections[i]) && "pick".equals(collection_real) )); + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "SEARCH_CLASS:1/SN,SEARCH_CLASS:2/SN,SEARCH_AREA_COUNCIL:1/SN,SEARCH_AREA_COUNCIL:2/SN"); //TAGS:1/SN,TAGS:1/SN + }else if("toon".equals(collections[i]) && "toon".equals(collection_real)) { + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "TAGS:1/SC"); // + } + }else if("ALL".equals(collection)){ + if("total".equals(collections[i])) { + wnsearch.setCollectionInfoValue(collections[i], CATEGORY_GROUPBY, "TAGS:1/SC"); + } + } + + } + + wnsearch.search(realQuery, isRealTimeKeyword, CONNECTION_CLOSE, useSuggestedQuery, sf1Vo.getSearchIp(), sf1Vo.getSearchPort()); + + searchVO.setRealQuery(realQuery); + + // 결과 담기 + SearchCollectionResult collResultList = new SearchCollectionResult(); + + // 디버그 메시지 출력 + String debugMsg = wnsearch.printDebug() != null ? wnsearch.printDebug().trim() : ""; + collResultList.setDebugStr(debugMsg); + if(isDebug){ + System.out.println("\n\n\n\n\n\n\n/*****************debugMsg********************/"+debugMsg); + } + + + // 결과 arrList + ArrayList collList = new ArrayList(); + for (int i = 0; i < collections.length; i++) { // 컬렉션 for + SearchCollectionVO colVo = new SearchCollectionVO(); + int totalCount = wnsearch.getResultTotalCount(collections[i]); + int resultCount = wnsearch.getResultCount(collections[i]); + //String collectionNameKr = wnsearch.getCollectionFieldValue(collections[i], WNCollection.COLLECTION_KOR); 안써 + String collectionName = wnsearch.getCollectionInfoValue(collections[i], INDEX_NAME); + + String resultField = wnsearch.getCollectionInfoValue(collections[i], RESULT_FIELD); //DOCID,DATE + String[] resultFieldArr = resultField.split(","); + + /** map 방식 1. */ + ArrayList> resultList = new ArrayList>(); + + for(int j = 0 ; j < resultCount ; j++){ // 검색 결과 for + Map resultMap = new HashMap(); + for(int k = 0 ; k < resultFieldArr.length ; k ++){ // 반환필드 결과 for + String[] documentFields = WNUtils.split(resultFieldArr[k], "/"); + //resultMap.put(documentFields[0],wnsearch.getField(collections[i],documentFields[0] , j , false)); + resultMap.put(documentFields[0],wnsearch.getField(collections[i],documentFields[0] , j , false).replace("", "").replace("", "") ); + } + resultList.add(j,resultMap); + } + + colVo.setTotalCount(totalCount); //info total + colVo.setResultCount(resultCount); + colVo.setCollectionName(collectionName); //info + colVo.setSearchResultList(resultList); + collList.add(i,colVo); + + } + + + + + + // int cateListCnt = collections.length ; + //int cateListCnt = collections_real.length ; + int cateListCnt = collections.length ; + + //자료유형 카테고리 + if (collections_real.length == 1 && (collection_real.equals("pick") || collection_real.equals("number") || collection_real.equals("reference") )) { + String collection1 = collection_real; + /** map 방식 1. */ + int first_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_CLASS", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_CLASS", 2); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + for (int j = 0; j < first_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_CLASS", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_CLASS", 1, j); + + + resultMap.put("first_class_nm", node); + resultMap.put("first_class_cnt", nodeCnt); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + } + + //resultList.add(j, resultMap); + //resultList.add(j_result, resultMap); + } + + colVo.setCollectionName("first_class_cate"); // info + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + + for (int j = 0; j < second_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_CLASS", 2, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_CLASS", 2, j); + + + resultMap.put("second_class_nm", node); + resultMap.put("second_class_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + //System.out.println("node:" + node + "/cnt:" + nodeCnt); + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + + } + //resultList.add(j, resultMap); + } + + colVo.setCollectionName("second_class_cate"); // info + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + + } + + //지역문화원 + if (collections_real.length == 1 && (collection_real.equals("pick") || collection_real.equals("reference") || collection_real.equals("story"))) { + String collection1 = collection_real; + int first_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_AREA_COUNCIL", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_AREA_COUNCIL", 2); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + for (int j = 0; j < first_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_AREA_COUNCIL", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_AREA_COUNCIL", 1, j); + //System.out.println("node:" + node + "/cnt:" + nodeCnt); + + resultMap.put("first_council_nm", node); + resultMap.put("first_council_cnt", nodeCnt); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + } + //resultList.add(j, resultMap); + } + + colVo.setCollectionName("first_council_cate"); // info + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + for (int j = 0; j < second_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_AREA_COUNCIL", 2, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_AREA_COUNCIL", 2, j); + + resultMap.put("second_council_nm", node); + resultMap.put("second_council_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + + } + //resultList.add(j, resultMap); + } + + colVo.setCollectionName("second_council_cate"); // info + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + + } + + if (collections_real.length == 1 && collection_real.equals("number")) { + String collection1 = collection_real; + int second_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_AREA_COUNCIL", 2); + + //first + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + Map first_resultMap = new HashMap(); + + for (int j = 0; j < second_class_cnt; j++) { + String node = wnsearch.getCategoryName(collection1,"SEARCH_AREA_COUNCIL", 2 , j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_AREA_COUNCIL", 2, j); + //System.out.println("node:" + node + "/cnt:" + nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + } + + //first + String[] first_node = node.split("\\^"); + if(first_resultMap.containsKey(first_node[0])){ + nodeCnt = first_resultMap.get(first_node[0]) + nodeCnt; + } + first_resultMap.put(first_node[0],nodeCnt); + } + + for (String key : first_resultMap.keySet()) { // 검색 결과 + Map resultMap = new HashMap(); + + resultMap.put("first_council_nm", key); + resultMap.put("first_council_cnt", first_resultMap.get(key)); + + resultList.add(j_result, resultMap); + j_result +=1; + + //resultList.add(j, resultMap); + } + + colVo.setCollectionName("first_council_cate"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + //second + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + + for (int j = 0; j < second_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_AREA_COUNCIL", 2, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_AREA_COUNCIL", 2, j); + + //second + resultMap.put("second_council_nm", node); + resultMap.put("second_council_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + + } + //resultList.add(j, resultMap); + } + + colVo.setCollectionName("second_council_cate"); // info + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + } + + + //지역,유형 + if (collections_real.length == 1 && collection_real.equals("info")) { + String collection1 = collection_real; + int first_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_AREA_COUNCIL_INFO", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "CONTENT_TYPE_NAME", 1); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + for (int j = 0; j < first_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_AREA_COUNCIL_INFO", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_AREA_COUNCIL_INFO", 1, j); + + resultMap.put("first_council_nm", node); + resultMap.put("first_council_cnt", nodeCnt); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + } + //resultList.add(j, resultMap); + } + + colVo.setCollectionName("first_council_cate"); // info + //colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int nodeCnt_total = 0; + + int j_result = 0; + for (int j = 0; j < second_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"CONTENT_TYPE_NAME", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "CONTENT_TYPE_NAME", 1, j); + + resultMap.put("second_council_nm", node); + resultMap.put("second_council_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + } + //resultList.add(j, resultMap); + } + + colVo.setCollectionName("second_council_cate"); // info + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + + } + + + //주제분야 + if (collections_real.length == 1 && collection_real.equals("reference") ) { + String collection1 = collection_real; + int first_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_CATEGORY", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_CATEGORY", 2); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + + for (int j = 0; j < first_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_CATEGORY", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_CATEGORY", 1, j); + + + resultMap.put("first_category_nm", node); + resultMap.put("first_category_cnt", nodeCnt); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + System.out.println("node:" + node + "/cnt:" + nodeCnt); + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + + } + //resultList.add(j, resultMap); + } + + colVo.setCollectionName("first_category_cate"); // info + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + + for (int j = 0; j < second_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_CATEGORY", 2, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_CATEGORY", 2, j); + + + resultMap.put("second_category_nm", node); + resultMap.put("second_category_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + + } + //resultList.add(j, resultMap); + } + + colVo.setCollectionName("second_category_cate"); // info + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + + } + + //테마 + if (collections_real.length == 1 && ( collection_real.equals("number") || collection_real.equals("story") )) { + String collection1 = collection_real; + int first_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_THEME_CD", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "SEARCH_THEME_CD", 2); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + + for (int j = 0; j < first_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_THEME_CD", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_THEME_CD", 1, j); + + resultMap.put("first_theme_cd", node); + resultMap.put("first_theme_cnt", nodeCnt); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + + } + //resultList.add(j, resultMap); + } + + colVo.setCollectionName("first_theme_cate"); // info + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int j_result = 0; + int nodeCnt_total = 0; + + for (int j = 0; j < second_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"SEARCH_THEME_CD", 2, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "SEARCH_THEME_CD", 2, j); + + resultMap.put("second_theme_cd", node); + resultMap.put("second_theme_cnt", nodeCnt); + + if (("null^null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else{ + resultList.add(j_result, resultMap); + j_result +=1; + nodeCnt_total += nodeCnt; + + } + //resultList.add(j, resultMap); + } + + colVo.setCollectionName("second_theme_cate"); // info + colVo.setTotalCount(nodeCnt_total); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + + } + + + //지역문화포스트 + if (collections_real.length == 2 && "culturePost".equals(collection_real) ) { + String collection1 = collection_real; + + /** map 방식 1. */ + int first_class_cnt= wnsearch.getCategoryCount(collection1, "TAGS", 1); + int second_class_cnt= wnsearch.getCategoryCount(collection1, "KEYWORDS", 1); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + //int j_result = 0; + int cateCnt = 0; + for (int j = 0; j < first_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"TAGS", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "TAGS", 1, j); + //System.out.println("node:" + node + "/cnt:" + nodeCnt); + + if (("null").equalsIgnoreCase(node)) { + continue; + }else if(cateCnt < 10 || ("^").equalsIgnoreCase(node)){ + resultMap.put("tags_nm", node); + resultMap.put("tags_cnt", nodeCnt); + + resultList.add(cateCnt, resultMap); + cateCnt ++; + } + } + + colVo.setCollectionName("culturePostHot_tags"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + if(second_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int cateCnt = 0; + for (int j = 0; j < second_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"KEYWORDS", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "KEYWORDS", 1, j); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else if(cateCnt < 10){ + resultMap.put("keywords_nm", node); + resultMap.put("keywords_cnt", nodeCnt); + + resultList.add(cateCnt, resultMap); + cateCnt ++; + } + } + + colVo.setCollectionName("culturePostHot_keywords"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt+=1; + } + } + + //지역문화툰 + if (collections_real.length == 1 && "toon".equals(collection_real) ) { + String collection1 = collection_real; + + int first_class_cnt= wnsearch.getCategoryCount(collection1, "TAGS", 1); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + //int j_result = 0; + int cateCnt = 0; + for (int j = 0; j < first_class_cnt; j++) { + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"TAGS", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "TAGS", 1, j); + + if (("null").equalsIgnoreCase(node)) { + continue; + }else if(cateCnt < 10 || ("^").equalsIgnoreCase(node)){ + resultMap.put("tags_nm", node); + resultMap.put("tags_cnt", nodeCnt); + + resultList.add(cateCnt, resultMap); + cateCnt ++; + } + } + + colVo.setCollectionName("toon_tags"); + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + + } + + //통합검색 total 태그 + if (collections_real.length != 1 && "ALL".equals(collection_real) ) { + String collection1 = "total"; + int first_class_cnt= wnsearch.getCategoryCount(collection1, "TAGS", 1); + + if(first_class_cnt > 0){ + ArrayList> resultList = new ArrayList>(); + SearchCollectionVO colVo = new SearchCollectionVO(); + + int cateCnt = 0; + for (int j = 0; j < first_class_cnt; j++) { // 검색 결과 + Map resultMap = new HashMap(); + String node = wnsearch.getCategoryName(collection1,"TAGS", 1, j); + int nodeCnt = wnsearch.getDocumentCountInCategory(collection1, "TAGS", 1, j); + //System.out.println("node:" + node + "/cnt:" + nodeCnt); + + if (("null").equalsIgnoreCase(node) || ("^").equalsIgnoreCase(node)) { + continue; + }else if(cateCnt < 10){ + resultMap.put("tags_nm", node); + resultMap.put("tags_cnt", nodeCnt); + + resultList.add(cateCnt, resultMap); + cateCnt ++; + } + } + + colVo.setCollectionName("total_tags"); // info + colVo.setSearchResultList(resultList); + collList.add(cateListCnt, colVo); + + cateListCnt +=1; + } + } + + + collResultList.setCollectionList(collList); + + // 연결 종료 + if ( wnsearch != null ) { + wnsearch.closeServer(); + } + return collResultList; + }catch(Exception e){ + e.printStackTrace(); + } + return null; + } +} + + diff --git a/src/main/java/kccf/sch/service/vo/ArkVO.java b/src/main/java/kccf/sch/service/vo/ArkVO.java new file mode 100644 index 00000000..9e59b62c --- /dev/null +++ b/src/main/java/kccf/sch/service/vo/ArkVO.java @@ -0,0 +1,72 @@ +package kccf.sch.service.vo; + +public class ArkVO { + /** 키워드 */ + private String query = ""; + /** 자동완성 매칭방식 */ + private String convert = ""; + /** 자동완성 타겟 */ + private String target = ""; + /** 케릭터 셋 */ + private String charset = ""; + /** 데이타 타입 */ + private String dataType = ""; + /** 디버그 여부 */ + private String debugType = "N"; + /** 연결 시간 */ + private Integer timeOut = 3000; + + public String getQuery() { + return this.query; + } + public void setQuery(String query) { + this.query = query; + } + public String getConvert() { + return convert; + } + public void setConvert(String convert) { + this.convert = convert; + } + public String getTarget() { + return target; + } + public void setTarget(String target) { + this.target = target; + } + public String getCharset() { + return charset; + } + public void setCharset(String charset) { + this.charset = charset; + } + public String getDataType() { + return dataType; + } + public void setDataType(String dataType) { + this.dataType = dataType; + } + public String getDebugType() { + return debugType; + } + public void setDebugType(String debugType) { + this.debugType = debugType; + } + public int getTimeOut() { + return timeOut; + } + public void setTimeOut(Integer timeOut) { + this.timeOut = timeOut; + } + @Override + public String toString() { + return "ArkVO [query=" + getQuery() + ", convert=" + getConvert() + ", target=" + + getTarget() + ", charset=" + getCharset() + ", dataType=" + getDataType() + + ", debugType=" + getDebugType() + ", timeOut=" + getTimeOut() + "]"; + } + + + + + +} diff --git a/src/main/java/kccf/sch/service/vo/PopWordVO.java b/src/main/java/kccf/sch/service/vo/PopWordVO.java new file mode 100644 index 00000000..2c4f1d8e --- /dev/null +++ b/src/main/java/kccf/sch/service/vo/PopWordVO.java @@ -0,0 +1,86 @@ +package kccf.sch.service.vo; + +public class PopWordVO { + /** 인기검색어 타겟 popword 고정 참조 */ + private String target = "popword"; + /** 인코딩 셋 */ + private String charset = ""; + /** 인기검색어 조회 범위설정 */ + private String range = ""; + /** collection 통계라벨ID */ + private String collection =""; + /** 데이타 타입 */ + private String dataType = ""; + /** 인코딩 셋 */ + private String eq = ""; + /** 인코딩 셋 */ + private String es = ""; + /** 디버그메시지 */ + private String debugType ="N"; + /** 타임 아웃 */ + private Integer timeOut =1000; + + public String getTarget() { + return target; + } + public void setTarget(String target) { + this.target = target; + } + public String getCharset() { + return charset; + } + public void setCharset(String charset) { + this.charset = charset; + } + public String getRange() { + return range; + } + public void setRange(String range) { + this.range = range; + } + public String getCollection() { + return collection; + } + public void setCollection(String collection) { + this.collection = collection; + } + public String getDataType() { + return dataType; + } + public void setDataType(String dataType) { + this.dataType = dataType; + } + public String getDebugType() { + return debugType; + } + public void setDebugType(String debugType) { + this.debugType = debugType; + } + public int getTimeOut() { + return timeOut; + } + public void setTimeOut(Integer timeOut) { + this.timeOut = timeOut; + } + public String getEq() { + return eq; + } + public void setEq(String eq) { + this.eq = eq; + } + public String getEs() { + return es; + } + public void setEs(String es) { + this.es = es; + } + @Override + public String toString() { + return "PopWordVO [target=" + getTarget() + ", charset=" + getCharset() + + ", range=" + getRange() + ", collection=" + getCollection() + + ", dataType=" + getDataType() + ", debugType=" + getDebugType() + + ", timeOut=" + getTimeOut() + ", eq=" + getEq() + ", es=" + getEs() + "]"; + } + + +} diff --git a/src/main/java/kccf/sch/service/vo/SearchCollectionVO.java b/src/main/java/kccf/sch/service/vo/SearchCollectionVO.java new file mode 100644 index 00000000..667ddc46 --- /dev/null +++ b/src/main/java/kccf/sch/service/vo/SearchCollectionVO.java @@ -0,0 +1,140 @@ +package kccf.sch.service.vo; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 검색결과 컬렉션 VO + * + */ +public class SearchCollectionVO { + /** 컬렉션명*/ + private String CollectionName = ""; + /** 컬렉션의 총검색 건수 */ + private int totalCount = 0; + /** 컬렉션의 반환되는 검색 건수 */ + private int resultCount = 0; + /** 컬렉션의 검색결과 리스트 */ + private ArrayList> searchResultList = null; + + public String getCollectionName() { + return CollectionName; + } + + public void setCollectionName(String collectionName) { + CollectionName = collectionName; + } + + public int getTotalCount() { + return totalCount; + } + + public void setTotalCount(int totalCount) { + this.totalCount = totalCount; + } + + public int getResultCount() { + return resultCount; + } + + public void setResultCount(int resultCount) { + this.resultCount = resultCount; + } + + + @Override + public String toString() { + return "SearchCollectionVO [CollectionName=" + CollectionName + + ", totalCount=" + totalCount + ", resultCount=" + resultCount + + ", searchResultList=" + searchResultList + "]"; + } + + public ArrayList> getSearchResultList() { + ArrayList> searchResultListRet = new ArrayList>(); + searchResultListRet.addAll(searchResultList); + return searchResultListRet; + } + + public void setSearchResultList(ArrayList> searchResultList) { + if(searchResultList != null){ + this.searchResultList = new ArrayList>(); + for(int i = 0; i < searchResultList.size(); ++i){ + this.searchResultList.add(searchResultList.get(i)); + } + } + } + + /** + * 컬렉션 단위의 xml 모양 + * @return XML 모양의 String 값 + * @see toXml() 에서 사용됨 + */ + public String getXml(){ + StringBuffer xmlStr = new StringBuffer(1024); + xmlStr.append("").append(System.getProperty("line.separator")); + xmlStr.append("").append(System.getProperty("line.separator")); + xmlStr.append("").append(System.getProperty("line.separator")); + xmlStr.append("").append(System.getProperty("line.separator")); + List searchResultList = getSearchResultList(); + int searchResultListCount = searchResultList.size(); + + /* + for(int i = 0 ; i < SearchResultListCount ; i++){ + AbstractSearchResult resultVo = this.SearchResultList.get(i); + xmlStr.append(resultVo.getXml()); + } + */ + xmlStr.append("").append(System.getProperty("line.separator")); + xmlStr.append(""); + return xmlStr.toString(); + } + + /** + * 컬렉션 단위의 json 모양 + * @return json 형태의 String 값 + * @see toJson() 에서 사용됨 + */ + public String getJson(){ + StringBuffer jsonBr = new StringBuffer(1024); + jsonBr.append("{\"collection\":"); + jsonBr.append("{"); + jsonBr.append("\"totalCount\":\""+ getTotalCount()+"\","); + jsonBr.append("\"resultCount\":\""+ getResultCount()+"\","); + jsonBr.append("\"itemList\":["); + List searchResultList = getSearchResultList(); + int searchResultListCount = searchResultList.size(); + for(int i = 0 ; i < searchResultListCount ; i++){ + /* + AbstractSearchResult resultVo = SearchResultList.get(i); + jsonBr.append(resultVo.getJson()); + if(i != SearchResultListCount-1 ){ + jsonBr.append(","); + } + */ + } + jsonBr.append("]"); + jsonBr.append(",\"collectionName\":\""+ getCollectionName()+"\"}"); + jsonBr.append("}"); + return jsonBr.toString(); + } + /** + * 컬렉션 단위의 str 모양 + * @return + */ + public String getStr(){ + StringBuffer br = new StringBuffer(1024); + br.append("[collection][collectionName:").append(getCollectionName()).append("]").append(System.getProperty("line.separator")); + br.append("[collection][totalCount:").append(getTotalCount()).append("]").append(System.getProperty("line.separator")); + br.append("[collection][resultCount:").append(getResultCount()).append("]").append(System.getProperty("line.separator")); + List searchResultList = getSearchResultList(); + int searchResultListCount = searchResultList.size(); + for(int i = 0 ; i < searchResultListCount ; i++){ + /* + AbstractSearchResult resultVo = SearchResultList.get(i); + br.append("[").append(i).append("]").append(resultVo.getStr()).append(System.getProperty("line.separator")); + */ + } + return br.toString(); + } +} diff --git a/src/main/java/kccf/sch/service/vo/SearchVO.java b/src/main/java/kccf/sch/service/vo/SearchVO.java new file mode 100644 index 00000000..138250d2 --- /dev/null +++ b/src/main/java/kccf/sch/service/vo/SearchVO.java @@ -0,0 +1,393 @@ +package kccf.sch.service.vo; + +import java.util.Arrays; + +/** + * 이용문의 사용 VO + * @Class Name : QnaVO.java + * @author wisenut + * @since 2018-09-12 + * @version 1.0 + */ + +public class SearchVO { + + private String query ; //검색어 + + private String realQuery ; //검색어(최종) + private String reQuery = ""; //결과내 재검색 + private String operator = ""; //검색 연산자 + + private String rt; //결과내재검색 체크 + + private String notQuery ; //제외하는 검색어 + private String andQuery ; //반드시 포함하는 검색어 + private String exactQuery ; //정확히 일치하는 검색어 + + private String sortField = ""; //정렬조건 + private String range = ""; //검색기간 + private int viewCount = 0; //출력갯수(통합) + private String chkColls = ""; //상세검색 컬렉션 체크 + private String searchField = "" ; //검색필드 + + private int startCount = 1; //시작위치 + private String startDate = ""; //시작날짜 + private String endDate = ""; //끝날짜 + + private String collection = ""; //컬렉션이름 + private String debug = "N"; //디버그 Y/N + + /**filter query**/ + private String chronological_start ; //연대 앞 기간 + private String chronological_end ; //연대 뒤 기간 + private String genyear_start ; //발행년대 앞 기간 + private String genyear_end ; //발행년대 뒤 기간 + + /**exquery**/ + private String trs_age; //시대 + private String mgnt_no ; //관리번호 + private String first_category ; //주제분야(대) 선택 + private String second_category ; //주제분야(소) 선택 + private String theme ; //문화테마(대) 선택 + private String series ; //문화테마(소) 선택 + + private String theme_cd ; //이야기자료 테마코드(대) 선택 + private String theme_nm ; //이야기자료 테마(대) 선택 + private String series_cd ; //이야기자료 시리즈코드(소) 선택 + private String series_nm ; //이야기자료 시리즈(소) 선택 + + private String first_class ; //자료유형(대) 선택 + private String second_class; //자료유형(소) 선택 + private String sido_name; //지역문화원(대) 선택 - 카테고리 + private String sojang_council ; //지역문화원(소) 선택 - 카테고리 + //String keywords = ""; //키워드 + + private String search_area_council_info ; //지역문화정보(지역) + private String content_type ; //지역문화정보(유형) + + private String filter_class ; //필터 더보기버튼 유지+depth1 open + private String filter_sido ; //필터 더보기버튼 유지+depth1 open + private String filter_thema ; //필터 더보기버튼 유지+depth1 open + private String filter_category ; //필터 더보기버튼 유지+depth1 open + private String filter_info_sido ; //필터 더보기버튼 유지 + private String filter_info_type ; //필터 더보기버튼 유지 + + private String filter_mylist; //검색결과 필터 순서 저장 + private String filter_info_mylist; //검색결과 필터 info 순서 저장 + + + public String getFilter_info_mylist() { + return filter_info_mylist; + } + public void setFilter_info_mylist(String filter_info_mylist) { + this.filter_info_mylist = filter_info_mylist; + } + public String getFilter_mylist() { + return filter_mylist; + } + public void setFilter_mylist(String filter_mylist) { + this.filter_mylist = filter_mylist; + } + public String getFilter_info_sido() { + return filter_info_sido; + } + public void setFilter_info_sido(String filter_info_sido) { + this.filter_info_sido = filter_info_sido; + } + public String getFilter_info_type() { + return filter_info_type; + } + public void setFilter_info_type(String filter_info_type) { + this.filter_info_type = filter_info_type; + } + public String getContent_type() { + return content_type; + } + public void setContent_type(String content_type) { + this.content_type = content_type; + } + public String getSearch_area_council_info() { + return search_area_council_info; + } + public void setSearch_area_council_info(String search_area_council_info) { + this.search_area_council_info = search_area_council_info; + } + public String getRt() { + return rt; + } + public void setRt(String rt) { + this.rt = rt; + } + public String getQuery() { + return query; + } + public void setQuery(String query) { + this.query = query; + } + public String getRealQuery() { + return realQuery; + } + public void setRealQuery(String realQuery) { + this.realQuery = realQuery; + } + public String getReQuery() { + return reQuery; + } + public void setReQuery(String reQuery) { + this.reQuery = reQuery; + } + + public String getSortField() { + return sortField; + } + public void setSortField(String sortField) { + this.sortField = sortField; + } + public String getRange() { + return range; + } + public void setRange(String range) { + this.range = range; + } + public int getViewCount() { + return viewCount; + } + public void setViewCount(int viewCount) { + this.viewCount = viewCount; + } + public String getChkColls() { + return chkColls; + } + public void setChkColls(String chkColls) { + this.chkColls = chkColls; + } + public String getSearchField() { + return searchField; + } + public void setSearchField(String searchField) { + this.searchField = searchField; + } + public int getStartCount() { + return startCount; + } + public void setStartCount(int startCount) { + this.startCount = startCount; + } + public String getCollection() { + return collection; + } + public void setCollection(String collection) { + this.collection = collection; + } + public String getDebug() { + return debug; + } + public void setDebug(String debug) { + this.debug = debug; + } + public String getChronological_start() { + return chronological_start; + } + public void setChronological_start(String chronological_start) { + this.chronological_start = chronological_start; + } + public String getChronological_end() { + return chronological_end; + } + public void setChronological_end(String chronological_end) { + this.chronological_end = chronological_end; + } + public String getGenyear_start() { + return genyear_start; + } + public void setGenyear_start(String genyear_start) { + this.genyear_start = genyear_start; + } + public String getGenyear_end() { + return genyear_end; + } + public void setGenyear_end(String genyear_end) { + this.genyear_end = genyear_end; + } + public String getTrs_age() { + return trs_age; + } + public void setTrs_age(String trs_age) { + this.trs_age = trs_age; + } + public String getMgnt_no() { + return mgnt_no; + } + public void setMgnt_no(String mgnt_no) { + this.mgnt_no = mgnt_no; + } + public String getFirst_category() { + return first_category; + } + public void setFirst_category(String first_category) { + this.first_category = first_category; + } + public String getSecond_category() { + return second_category; + } + public void setSecond_category(String second_category) { + this.second_category = second_category; + } + public String getTheme() { + return theme; + } + public void setTheme(String theme) { + this.theme = theme; + } + public String getSeries() { + return series; + } + public void setSeries(String series) { + this.series = series; + } + + public String getTheme_cd() { + return theme_cd; + } + public void setTheme_cd(String theme_cd) { + this.theme_cd = theme_cd; + } + public String getTheme_nm() { + return theme_nm; + } + public void setTheme_nm(String theme_nm) { + this.theme_nm = theme_nm; + } + public String getSeries_cd() { + return series_cd; + } + public void setSeries_cd(String series_cd) { + this.series_cd = series_cd; + } + public String getSeries_nm() { + return series_nm; + } + public void setSeries_nm(String series_nm) { + this.series_nm = series_nm; + } + public String getFirst_class() { + return first_class; + } + public void setFirst_class(String first_class) { + this.first_class = first_class; + } + public String getSecond_class() { + return second_class; + } + public void setSecond_class(String second_class) { + this.second_class = second_class; + } + public String getSido_name() { + return sido_name; + } + public void setSido_name(String sido_name) { + this.sido_name = sido_name; + } + public String getSojang_council() { + return sojang_council; + } + public void setSojang_council(String sojang_council) { + this.sojang_council = sojang_council; + } + public String getStartDate() { + return startDate; + } + public void setStartDate(String startDate) { + this.startDate = startDate; + } + public String getEndDate() { + return endDate; + } + public void setEndDate(String endDate) { + this.endDate = endDate; + } + public String getOperator() { + return operator; + } + public void setOperator(String operator) { + this.operator = operator; + } + public String getNotQuery() { + return notQuery; + } + public void setNotQuery(String notQuery) { + this.notQuery = notQuery; + } + public String getAndQuery() { + return andQuery; + } + public void setAndQuery(String andQuery) { + this.andQuery = andQuery; + } + public String getExactQuery() { + return exactQuery; + } + public void setExactQuery(String exactQuery) { + this.exactQuery = exactQuery; + } + public String getFilter_class() { + return filter_class; + } + public void setFilter_class(String filter_class) { + this.filter_class = filter_class; + } + public String getFilter_sido() { + return filter_sido; + } + public void setFilter_sido(String filter_sido) { + this.filter_sido = filter_sido; + } + public String getFilter_thema() { + return filter_thema; + } + public void setFilter_thema(String filter_thema) { + this.filter_thema = filter_thema; + } + public String getFilter_category() { + return filter_category; + } + public void setFilter_category(String filter_category) { + this.filter_category = filter_category; + } + @Override + public String toString() { + return "SearchVO [query=" + query + ", realQuery=" + realQuery + + ", reQuery=" + reQuery + ", operator=" + operator + ", rt=" + + rt + ", notQuery=" + notQuery + ", andQuery=" + andQuery + + ", exactQuery=" + exactQuery + ", sortField=" + sortField + + ", range=" + range + ", viewCount=" + viewCount + + ", chkColls=" + chkColls + ", searchField=" + searchField + + ", startCount=" + startCount + ", startDate=" + startDate + + ", endDate=" + endDate + ", collection=" + collection + + ", debug=" + debug + ", chronological_start=" + + chronological_start + ", chronological_end=" + + chronological_end + ", genyear_start=" + genyear_start + + ", genyear_end=" + genyear_end + ", trs_age=" + trs_age + + ", mgnt_no=" + mgnt_no + ", first_category=" + first_category + + ", second_category=" + second_category + + ", theme_cd=" + theme_cd + + ", theme_nm=" + theme_nm + + ", series_cd=" + series_cd + + ", series_nm=" + series_nm + + ", first_class=" + first_class + + ", second_class=" + second_class + ", sido_name=" + sido_name + + ", sojang_council=" + sojang_council + + ", search_area_council_info=" + search_area_council_info + + ", content_type=" + content_type + ", filter_class=" + + filter_class + ", filter_sido=" + filter_sido + + ", filter_thema=" + filter_thema + ", filter_category=" + + filter_category + ", filter_info_sido=" + filter_info_sido + + ", filter_info_type=" + filter_info_type + ", filter_mylist=" + + filter_mylist + ", filter_info_mylist=" + filter_info_mylist + + "]"; + } + + + + +} diff --git a/src/main/java/kccf/sch/service/vo/Sf1VO.java b/src/main/java/kccf/sch/service/vo/Sf1VO.java new file mode 100644 index 00000000..09100f85 --- /dev/null +++ b/src/main/java/kccf/sch/service/vo/Sf1VO.java @@ -0,0 +1,53 @@ +package kccf.sch.service.vo; + +public class Sf1VO { + /** 검색기 IP */ + private String searchIp = ""; + /** 검색기 PORT*/ + private Integer searchPort = 0; + /** 검색 타임아웃 */ + private Integer searchTimeOut = 3000; + /** */ + private String searchDebugType = "N"; + /** 관리도구 IP */ + private String managerIp; + /** 관리도구 PORT */ + private Integer managerPort; + + public String getSearchIp() { + return searchIp; + } + public void setSearchIp(String searchIp) { + this.searchIp = searchIp; + } + public Integer getSearchPort() { + return searchPort; + } + public void setSearchPort(Integer searchPort) { + this.searchPort = searchPort; + } + public Integer getSearchTimeOut() { + return searchTimeOut; + } + public void setSearchTimeOut(Integer searchTimeOut) { + this.searchTimeOut = searchTimeOut; + } + public String getSearchDebugType() { + return searchDebugType; + } + public void setSearchDebugType(String searchDebugType) { + this.searchDebugType = searchDebugType; + } + public String getManagerIp() { + return managerIp; + } + public void setManagerIp(String managerIp) { + this.managerIp = managerIp; + } + public Integer getManagerPort() { + return managerPort; + } + public void setManagerPort(Integer managerPort) { + this.managerPort = managerPort; + } +} diff --git a/src/main/java/kccf/sch/web/SearchController.java b/src/main/java/kccf/sch/web/SearchController.java new file mode 100644 index 00000000..ad8e3b73 --- /dev/null +++ b/src/main/java/kccf/sch/web/SearchController.java @@ -0,0 +1,842 @@ +package kccf.sch.web; + +import static kccf.sch.common.WNDefine.CONNECTION_CLOSE; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import kccf.res.service.ResourcesService; +import kccf.sch.common.WNSearch; +import kccf.sch.common.WNUtils; +import kccf.sch.service.ArkService; +import kccf.sch.service.PopWordService; +import kccf.sch.service.SearchCollectionResult; +import kccf.sch.service.SearchService; +import kccf.sch.service.vo.ArkVO; +import kccf.sch.service.vo.PopWordVO; +import kccf.sch.service.vo.SearchCollectionVO; +import kccf.sch.service.vo.SearchVO; +import kccf.sch.service.vo.Sf1VO; +import kccf.ton.service.LocalToonService; +import nlib.cmm.service.NlibProperty; + +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; + +import cmm.Constant; +import cmm.service.CmmActivityHstVO; +import cmm.service.CmmService; +import cmm.util.CmmUtil; +import cmm.util.DataMap; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +import egovframework.com.cmm.ComDefaultCodeVO; +import egovframework.rte.fdl.property.EgovPropertyService; +import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; +//추가 + +@Controller +public class SearchController { + /** LOGGER */ + //@SuppressWarnings("unused") + private static final Logger LOGGER = LoggerFactory.getLogger(SearchController.class); + + @Resource(name = "searchService") + private SearchService searchService; + + @Resource(name = "nlibProperty") + protected NlibProperty nlibProperty; + + @Resource(name="ArkService") + private ArkService arkService; + + @Resource(name="PopwordService") + private PopWordService popWordService; + + @Resource(name = "localToonService") + private LocalToonService localToonService; + + /** CmmService */ + @Resource(name = "cmmService") + private CmmService cmmService; + + /** resourcesService */ + @Resource(name = "resourcesService") + private ResourcesService resourcesService; + + /**SEARCHLIST**/ + @RequestMapping(value="/sch/totalSearchList.do") + public String totalSearchList ( + @ModelAttribute("searchVO") SearchVO searchVO + , String all_totalCount + , String gubun + , String gubun_ajax + , ModelMap model + , HttpServletRequest request + , HttpServletResponse res + + ) throws Exception + { + try{ + LOGGER.debug("[PATH][/sch/totalSearchList.do][searchVO][{}]",searchVO.toString()); + //System.out.println("\n\n\n\n\n\n\n/*****************totalSearchList-searchVO.toString()********************/"+searchVO.toString()); + + // 검색관련 서버 설정 + String searchIp = nlibProperty.getString("search.searchIp"); + int searchPort = nlibProperty.getInt("search.searchPort"); + int searchTimeOut = nlibProperty.getInt("search.searchTimeOut"); + + Sf1VO sf1Vo = new Sf1VO(); + sf1Vo.setSearchIp(searchIp); + sf1Vo.setSearchPort(searchPort); + sf1Vo.setSearchTimeOut(searchTimeOut); + + SearchCollectionResult collResult = searchService.getSearch(searchVO, sf1Vo); + + if(gubun.equals("1")){ //&&(searchVO.getCollection().equals("ALL") || searchVO.getCollection().equals("")) + all_totalCount = Integer.toString(searchService.getSearch_All_cnt(searchVO, sf1Vo)); + // all_totalCount = Integer.toString(collResult_all_cnt); +// System.out.println("################################"+searchVO.getCollection()+"/"+all_totalCount+"/"+gubun); + }else { + all_totalCount = Integer.toString(searchService.getSearch_All_cnt(searchVO, sf1Vo)); //2019-11-27 gubun?? +// System.out.println("else ################################:"+searchVO.getCollection()+"/"+all_totalCount+"/"+gubun); + } + //System.out.println("\n\n\n\n\n################################gubun_ajax:"+searchVO.getCollection()+"/"+gubun_ajax); + + // 결과 + SearchCollectionVO collInfo = new SearchCollectionVO(); + SearchCollectionVO collMap = new SearchCollectionVO(); + SearchCollectionVO collNumber = new SearchCollectionVO(); + SearchCollectionVO collPick = new SearchCollectionVO(); + SearchCollectionVO collReferecne = new SearchCollectionVO(); + SearchCollectionVO collStory = new SearchCollectionVO(); + SearchCollectionVO collCulturePost = new SearchCollectionVO(); + SearchCollectionVO collCulturePostHot = new SearchCollectionVO(); + SearchCollectionVO collTotal = new SearchCollectionVO(); + SearchCollectionVO collToon = new SearchCollectionVO(); + + + int totalCount = 0; + int page_totalCount =0; + + ArrayList collList = collResult.getCollectionList(); + + int collListSize = collList.size(); + for(int i = 0 ; i < collListSize ; i++){ + SearchCollectionVO coll = collList.get(i); + String collEn = coll.getCollectionName(); + + + + if(collEn.indexOf("culturePostHot") < 0 && collEn.indexOf("total") < 0 && collEn.indexOf("_cate") < 0){ + totalCount = totalCount + coll.getTotalCount(); + } + + if( !searchVO.getCollection().equals("ALL") && searchVO.getCollection().indexOf("_Coll") >= 0){ + if(searchVO.getCollection().replace("_Coll", "").equals(collEn)){ + page_totalCount = coll.getTotalCount(); + } + } + + if(collEn.equals("info")){ + collInfo = coll; + } + else if(collEn.equals("map")){ + collMap = coll; + } + else if(collEn.equals("number")){ + collNumber = coll; + } + else if(collEn.equals("pick")){ + collPick = coll; + + } + else if(collEn.equals("reference")){ + collReferecne = coll; + for(int j = 0 ; j < collReferecne.getSearchResultList().size() ; j++){ + Map mapResult = collReferecne.getSearchResultList().get(j); + DataMap paramMap = new DataMap(); + paramMap.put("mId", mapResult.get("MEDIA_ID")); + if(StringUtils.isNotEmpty(mapResult.get("MEDIA_ID").toString())){ + DataMap media = cmmService.selectCmmAmsAssetsMediaDetail(paramMap); + String mediaId = media.getString("id"); + String mediaInterfaceId = media.getString("interfaceId"); + String url = ""; + if (StringUtils.isNotEmpty(mediaInterfaceId)) { // mediaInterfaceId가 존재할 경우만 URL 정보 생성 + if(media.get("assetType") != null){ + if(media.get("assetType").toString().equals("문서") ){ + url = CmmUtil.getPropertyStr(Constant.KCCF_HOME_KEY)+"/npdfView.do?"; + url += "npdf="+Constant.UA_TYPE_R+mediaInterfaceId; // MEDIA 의 INTERFACE_ID 사용 + + }else if(media.get("assetType").toString().equals("링크")){ + url = media.get("linkData").toString(); + }else{ + url = CmmUtil.getPropertyStr(Constant.KCCF_HOME_KEY)+"/lib/libraryDetail.do?contentId="+mediaId; + url += "&rfType="+Constant.UA_TYPE_R; // 히스토리 등록 시 사용 + } + } + } + mapResult.put("LINK_URL", url); + } + } + } + else if(collEn.equals("story")){ + collStory = coll; + } + else if(collEn.equals("culturePost")){ + collCulturePost = coll; + } + else if(collEn.equals("total")){ + collTotal = coll; + } + else if(collEn.equals("total_tags")){ + model.addAttribute("total_tags", coll); + } + else if(collEn.indexOf("_cate") >= 0){ //cate + if(collEn.equals("first_class_cate")){ + model.addAttribute("first_class_cate", coll); + } + else if(collEn.equals("second_class_cate")){ + model.addAttribute("second_class_cate", coll); + } + else if(collEn.equals("first_council_cate")){ + model.addAttribute("first_council_cate", coll); + } + else if(collEn.equals("second_council_cate")){ + model.addAttribute("second_council_cate", coll); + } + else if(collEn.equals("first_category_cate")){ + model.addAttribute("first_category_cate", coll); + } + else if(collEn.equals("second_category_cate")){ + model.addAttribute("second_category_cate", coll); + } + else if(collEn.equals("first_theme_cate")){ + model.addAttribute("first_theme_cate", coll); + } + else if(collEn.equals("second_theme_cate")){ + model.addAttribute("second_theme_cate", coll); + } + } + else if(collEn.indexOf("culturePostHot") >= 0){ //cate + if(collEn.equals("culturePostHot")){ + collCulturePostHot = coll; + } + else if(collEn.equals("culturePostHot_keywords")){ + model.addAttribute("culturePostHot_keywords", coll); + } + else if(collEn.equals("culturePostHot_tags")){ + model.addAttribute("culturePostHot_tags", coll); + } + } + else if(collEn.indexOf("toon") >= 0){ + if(collEn.equals("toon")){ + collToon = coll; + } + else if(collEn.equals("toon_tags")){ + model.addAttribute("toon_tags", coll); + } + // 최근열람툰 + CmmActivityHstVO cmmActivityHstVO = new CmmActivityHstVO(); + cmmActivityHstVO.setTargetId(CmmUtil.getCookieId(request)); + cmmActivityHstVO.setUaType(Constant.UA_TYPE_W); + cmmActivityHstVO.setActivityType(Constant.ACTIVITY_TYPE_O); + cmmActivityHstVO.setContentType(Constant.CONTENT_TYPE_T); + model.addAttribute("openPageList", localToonService.selectLocalToonOpenPageList(cmmActivityHstVO)); + model.addAttribute("openPageHotList", localToonService.selectLocalToonOpenPageHotList(cmmActivityHstVO)); + } + } + + + // - 값 (검색엔진 오류 일때 0값 으로 ) + if(totalCount < 0){ + totalCount = 0; + } + model.addAttribute("totalCount",totalCount); + model.addAttribute("info", collInfo); + model.addAttribute("map", collMap); + model.addAttribute("number", collNumber); + model.addAttribute("pick", collPick); + model.addAttribute("reference", collReferecne); + model.addAttribute("story", collStory); + model.addAttribute("culturePost", collCulturePost); + model.addAttribute("culturePostHot", collCulturePostHot); + model.addAttribute("total", collTotal); + model.addAttribute("all_totalCount",all_totalCount); + model.addAttribute("toon",collToon); + + // 경로 + CmmUtil.setNfsPathModelMap(request,model); + + // 페이징 관련 + PaginationInfo paginationInfo = new PaginationInfo(); + paginationInfo.setCurrentPageNo(searchVO.getStartCount()); + if(searchVO.getCollection().indexOf("toon") >= 0){ + if(searchVO.getViewCount() == 10){ + paginationInfo.setRecordCountPerPage(12); + }else{ + paginationInfo.setRecordCountPerPage(searchVO.getViewCount()); + } + }else{ + paginationInfo.setRecordCountPerPage(searchVO.getViewCount()); + } + paginationInfo.setPageSize((CmmUtil.isMobile(request)) ? 5 :10); + //paginationInfo.setTotalRecordCount(totalCount); + + paginationInfo.setTotalRecordCount(searchVO.getCollection().equals("ALL") || searchVO.getCollection().equals("") ? totalCount :page_totalCount ); + model.addAttribute("paginationInfo", paginationInfo); + + + //serviceVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); + //serviceVO.setLastIndex(paginationInfo.getLastRecordIndex()); + //serviceVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); + + model.addAttribute("searchVO", searchVO); + //System.out.println("\n\n\n\n\n\n\n/*****************totalSearchList-searchVO.toString()********************/"+searchVO.toString()); + + }catch(Exception e){ + e.printStackTrace(); + } + + String resultUrl =""; + + + /*if(searchVO.getCollection().equals("ALL") || searchVO.getCollection().equals("")){ + resultUrl = "kccf/sch/totalSearchList.kccf"; + }else if(searchVO.getCollection().equals("pick_Coll")){ + resultUrl = "kccf/sch/searchPickList.kccf"; + }else if(searchVO.getCollection().equals("culturePost_Coll")){ + resultUrl = "kccf/sch/searchCulturePostList.kccf"; + }else if(searchVO.getCollection().equals("number_Coll")){ + resultUrl = "kccf/sch/searchNumberList.kccf"; + }else if(searchVO.getCollection().equals("story_Coll")){ + resultUrl = "kccf/sch/searchStoryList.kccf"; + }else if(searchVO.getCollection().equals("reference_Coll")){ + resultUrl = "kccf/sch/searchReferenceList.kccf"; + }else if(searchVO.getCollection().equals("info_Coll")){ + resultUrl = "kccf/sch/searchInfoList.kccf"; + }*/ + + ComDefaultCodeVO CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS014); + model.addAttribute("firstCategoryList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS015); + model.addAttribute("secondCategoryList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS004); + model.addAttribute("themaList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS005); + model.addAttribute("seriesList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS012); + model.addAttribute("firstClassList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS013); + model.addAttribute("secondClassList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS016); + model.addAttribute("contentTypeList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS018); + model.addAttribute("couSidoList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + List councilList = resourcesService.selectCouncilList(); + model.addAttribute("councilList", councilList); + + if(searchVO.getCollection().equals("ALL") || searchVO.getCollection().equals("")){ + if(gubun_ajax != null && gubun_ajax.equals("2")){ + resultUrl = "kccf/sch/totalSearchListAjax"; + }else{ + resultUrl = "kccf/sch/totalSearchList.kccf"; + } + + }else if(searchVO.getCollection().equals("pick_Coll")){ + resultUrl = "kccf/sch/searchPickListAjax"; + }else if(searchVO.getCollection().equals("culturePost_Coll")){ + resultUrl = "kccf/sch/searchCulturePostList"; + }else if(searchVO.getCollection().equals("number_Coll")){ + resultUrl = "kccf/sch/searchNumberListAjax"; + }else if(searchVO.getCollection().equals("story_Coll")){ + resultUrl = "kccf/sch/searchStoryListAjax"; + }else if(searchVO.getCollection().equals("reference_Coll")){ + resultUrl = "kccf/sch/searchReferenceListAjax"; + }else if(searchVO.getCollection().equals("info_Coll")){ + resultUrl = "kccf/sch/searchInfoListAjax"; + }else if(searchVO.getCollection().equals("toon_Coll")){ + resultUrl = "kccf/sch/searchToonListAjax"; + } + + //System.out.println("\n\n\n\n\n################################gubun_ajax:"+searchVO.getCollection()+"/"+gubun_ajax+"/"+resultUrl); + + // ams 서버 패스 정보 + CmmUtil.setAmsPathModelMap(request,model); + searchVO.setQuery(searchVO.getQuery().replaceAll("\\\"", """)); + searchVO.setExactQuery(searchVO.getExactQuery().replaceAll("\\\"", """)); + + return resultUrl; + } + + + + + + /** POPWORD */ + @RequestMapping(value="/sch/popword.do") + public String popword(@ModelAttribute("PopWordVO") PopWordVO popWordVo, ModelMap model) throws Exception { + + String popWordStr = ""; + String managerIp = nlibProperty.getString("search.managerIp"); + int managerPort = nlibProperty.getInt("search.managerPort"); + + Sf1VO sf1Vo = new Sf1VO(); + sf1Vo.setManagerIp(managerIp); + sf1Vo.setManagerPort(managerPort); + + popWordStr = popWordService.getPopWord(popWordVo, sf1Vo); + model.addAttribute("popWordStr", popWordStr); + + return "kccf/sch/popword/popword.kccf-sch"; + } + + + /** ARK */ + @RequestMapping(value="/sch/ark.do") + public String ark(@ModelAttribute("ArkVO") ArkVO arkVO, ModelMap model) throws Exception { + String arkStr = ""; + String managerIp = nlibProperty.getString("search.managerIp"); + int managerPort = nlibProperty.getInt("search.managerPort") ; + + + Sf1VO sf1Vo = new Sf1VO(); + sf1Vo.setManagerIp(managerIp); + sf1Vo.setManagerPort(managerPort); + + arkStr = arkService.getArk(arkVO, sf1Vo); + + model.addAttribute("arkStr", arkStr); + + return "kccf/sch/ark/ark.kccf-sch"; + + } + + + @RequestMapping(value="/sch/totalSearchList_ajax.do") + public String totalSearchList_ajax ( + @ModelAttribute("searchVO") SearchVO searchVO + , String all_totalCount + , String gubun + , ModelMap model + , HttpServletRequest request + ,HttpServletResponse res + ) throws Exception + { + try{ + LOGGER.debug("[PATH][/sch/totalSearchList.do][searchVO][{}]",searchVO.toString()); + //System.out.println("\n\n\n\n\n\n\n/*****************totalSearchList-searchVO.toString()********************/"+searchVO.toString()); + + // 검색관련 서버 설정 + String searchIp = nlibProperty.getString("search.searchIp"); + int searchPort = nlibProperty.getInt("search.searchPort"); + int searchTimeOut = nlibProperty.getInt("search.searchTimeOut"); + + Sf1VO sf1Vo = new Sf1VO(); + sf1Vo.setSearchIp(searchIp); + sf1Vo.setSearchPort(searchPort); + sf1Vo.setSearchTimeOut(searchTimeOut); + + SearchCollectionResult collResult = searchService.getSearch(searchVO, sf1Vo); + + if(gubun.equals("1")){ //&&(searchVO.getCollection().equals("ALL") || searchVO.getCollection().equals("")) + all_totalCount = Integer.toString(searchService.getSearch_All_cnt(searchVO, sf1Vo)); + // all_totalCount = Integer.toString(collResult_all_cnt); +// System.out.println("################################"+searchVO.getCollection()+"/"+all_totalCount+"/"+gubun); + }else { + all_totalCount = Integer.toString(searchService.getSearch_All_cnt(searchVO, sf1Vo)); //2019-11-27 gubun?? +// System.out.println("else ################################:"+searchVO.getCollection()+"/"+all_totalCount+"/"+gubun); + } + //System.out.println("\n\n\n\n\n################################gubun_ajax:"+searchVO.getCollection()+"/"+gubun_ajax); + + // 결과 + SearchCollectionVO collInfo = new SearchCollectionVO(); + SearchCollectionVO collMap = new SearchCollectionVO(); + SearchCollectionVO collNumber = new SearchCollectionVO(); + SearchCollectionVO collPick = new SearchCollectionVO(); + SearchCollectionVO collReferecne = new SearchCollectionVO(); + SearchCollectionVO collStory = new SearchCollectionVO(); + SearchCollectionVO collCulturePost = new SearchCollectionVO(); + SearchCollectionVO collCulturePostHot = new SearchCollectionVO(); + SearchCollectionVO collTotal = new SearchCollectionVO(); + SearchCollectionVO collToon = new SearchCollectionVO(); + + + int totalCount = 0; + int page_totalCount =0; + + ArrayList collList = collResult.getCollectionList(); + + int collListSize = collList.size(); + for(int i = 0 ; i < collListSize ; i++){ + SearchCollectionVO coll = collList.get(i); + String collEn = coll.getCollectionName(); + + + + if(collEn.indexOf("culturePostHot") < 0 && collEn.indexOf("total") < 0 && collEn.indexOf("_cate") < 0){ + totalCount = totalCount + coll.getTotalCount(); + } + + if( !searchVO.getCollection().equals("ALL") && searchVO.getCollection().indexOf("_Coll") >= 0){ + if(searchVO.getCollection().replace("_Coll", "").equals(collEn)){ + page_totalCount = coll.getTotalCount(); + } + } + + if(collEn.equals("info")){ + collInfo = coll; + } + else if(collEn.equals("map")){ + collMap = coll; + } + else if(collEn.equals("number")){ + collNumber = coll; + } + else if(collEn.equals("pick")){ + collPick = coll; + + } + else if(collEn.equals("reference")){ + collReferecne = coll; + for(int j = 0 ; j < collReferecne.getSearchResultList().size() ; j++){ + Map mapResult = collReferecne.getSearchResultList().get(j); + DataMap paramMap = new DataMap(); + paramMap.put("mId", mapResult.get("MEDIA_ID")); + if(StringUtils.isNotEmpty(mapResult.get("MEDIA_ID").toString())){ + DataMap media = cmmService.selectCmmAmsAssetsMediaDetail(paramMap); + String mediaId = media.getString("id"); + String mediaInterfaceId = media.getString("interfaceId"); + String url = ""; + if (StringUtils.isNotEmpty(mediaInterfaceId)) { // mediaInterfaceId가 존재할 경우만 URL 정보 생성 + if(media.get("assetType") != null){ + if(media.get("assetType").toString().equals("문서") ){ + url = CmmUtil.getPropertyStr(Constant.KCCF_HOME_KEY)+"/npdfView.do?"; + url += "npdf="+Constant.UA_TYPE_R+mediaInterfaceId; // MEDIA 의 INTERFACE_ID 사용 + + }else if(media.get("assetType").toString().equals("링크")){ + url = media.get("linkData").toString(); + }else{ + url = CmmUtil.getPropertyStr(Constant.KCCF_HOME_KEY)+"/lib/libraryDetail.do?contentId="+mediaId; + url += "&rfType="+Constant.UA_TYPE_R; // 히스토리 등록 시 사용 + } + } + } + mapResult.put("LINK_URL", url); + } + } + } + else if(collEn.equals("story")){ + collStory = coll; + } + else if(collEn.equals("culturePost")){ + collCulturePost = coll; + } + else if(collEn.equals("total")){ + collTotal = coll; + } + else if(collEn.equals("total_tags")){ + model.addAttribute("total_tags", coll); + } + else if(collEn.indexOf("_cate") >= 0){ //cate + if(collEn.equals("first_class_cate")){ + model.addAttribute("first_class_cate", coll); + } + else if(collEn.equals("second_class_cate")){ + model.addAttribute("second_class_cate", coll); + } + else if(collEn.equals("first_council_cate")){ + model.addAttribute("first_council_cate", coll); + } + else if(collEn.equals("second_council_cate")){ + model.addAttribute("second_council_cate", coll); + } + else if(collEn.equals("first_category_cate")){ + model.addAttribute("first_category_cate", coll); + } + else if(collEn.equals("second_category_cate")){ + model.addAttribute("second_category_cate", coll); + } + else if(collEn.equals("first_theme_cate")){ + model.addAttribute("first_theme_cate", coll); + } + else if(collEn.equals("second_theme_cate")){ + model.addAttribute("second_theme_cate", coll); + } + } + else if(collEn.indexOf("culturePostHot") >= 0){ //cate + if(collEn.equals("culturePostHot")){ + collCulturePostHot = coll; + } + else if(collEn.equals("culturePostHot_keywords")){ + model.addAttribute("culturePostHot_keywords", coll); + } + else if(collEn.equals("culturePostHot_tags")){ + model.addAttribute("culturePostHot_tags", coll); + } + } + else if(collEn.indexOf("toon") >= 0){ + if(collEn.equals("toon")){ + collToon = coll; + } + else if(collEn.equals("toon_tags")){ + model.addAttribute("toon_tags", coll); + } + // 최근열람툰 + CmmActivityHstVO cmmActivityHstVO = new CmmActivityHstVO(); + cmmActivityHstVO.setTargetId(CmmUtil.getCookieId(request)); + cmmActivityHstVO.setUaType(Constant.UA_TYPE_W); + cmmActivityHstVO.setActivityType(Constant.ACTIVITY_TYPE_O); + cmmActivityHstVO.setContentType(Constant.CONTENT_TYPE_T); + model.addAttribute("openPageList", localToonService.selectLocalToonOpenPageList(cmmActivityHstVO)); + model.addAttribute("openPageHotList", localToonService.selectLocalToonOpenPageHotList(cmmActivityHstVO)); + } + } + + + // - 값 (검색엔진 오류 일때 0값 으로 ) + if(totalCount < 0){ + totalCount = 0; + } + model.addAttribute("totalCount",totalCount); + model.addAttribute("info", collInfo); + model.addAttribute("map", collMap); + model.addAttribute("number", collNumber); + model.addAttribute("pick", collPick); + model.addAttribute("reference", collReferecne); + model.addAttribute("story", collStory); + model.addAttribute("culturePost", collCulturePost); + model.addAttribute("culturePostHot", collCulturePostHot); + model.addAttribute("total", collTotal); + model.addAttribute("all_totalCount",all_totalCount); + model.addAttribute("toon",collToon); + + // 경로 + CmmUtil.setNfsPathModelMap(request,model); + + // 페이징 관련 + PaginationInfo paginationInfo = new PaginationInfo(); + paginationInfo.setCurrentPageNo(searchVO.getStartCount()); + if(searchVO.getCollection().indexOf("toon") >= 0){ + if(searchVO.getViewCount() == 10){ + paginationInfo.setRecordCountPerPage(12); + }else{ + paginationInfo.setRecordCountPerPage(searchVO.getViewCount()); + } + }else{ + paginationInfo.setRecordCountPerPage(searchVO.getViewCount()); + } + paginationInfo.setPageSize((CmmUtil.isMobile(request)) ? 5 :10); + //paginationInfo.setTotalRecordCount(totalCount); + + paginationInfo.setTotalRecordCount(searchVO.getCollection().equals("ALL") || searchVO.getCollection().equals("") ? totalCount :page_totalCount ); + model.addAttribute("paginationInfo", paginationInfo); + + + //serviceVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); + //serviceVO.setLastIndex(paginationInfo.getLastRecordIndex()); + //serviceVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); + + + model.addAttribute("searchVO", searchVO); + //System.out.println("\n\n\n\n\n\n\n/*****************totalSearchList-searchVO.toString()********************/"+searchVO.toString()); + + }catch(Exception e){ + e.printStackTrace(); + } + + String resultUrl =""; + + + /*if(searchVO.getCollection().equals("ALL") || searchVO.getCollection().equals("")){ + resultUrl = "kccf/sch/totalSearchList.kccf"; + }else if(searchVO.getCollection().equals("pick_Coll")){ + resultUrl = "kccf/sch/searchPickList.kccf"; + }else if(searchVO.getCollection().equals("culturePost_Coll")){ + resultUrl = "kccf/sch/searchCulturePostList.kccf"; + }else if(searchVO.getCollection().equals("number_Coll")){ + resultUrl = "kccf/sch/searchNumberList.kccf"; + }else if(searchVO.getCollection().equals("story_Coll")){ + resultUrl = "kccf/sch/searchStoryList.kccf"; + }else if(searchVO.getCollection().equals("reference_Coll")){ + resultUrl = "kccf/sch/searchReferenceList.kccf"; + }else if(searchVO.getCollection().equals("info_Coll")){ + resultUrl = "kccf/sch/searchInfoList.kccf"; + }*/ + + ComDefaultCodeVO CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS014); + model.addAttribute("firstCategoryList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS015); + model.addAttribute("secondCategoryList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS004); + model.addAttribute("themaList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS005); + model.addAttribute("seriesList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS012); + model.addAttribute("firstClassList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS013); + model.addAttribute("secondClassList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS016); + model.addAttribute("contentTypeList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + CodeVO = new ComDefaultCodeVO(); + CodeVO.setCodeId(Constant.CODE_ID_FMS018); + model.addAttribute("couSidoList", cmmUseService.selectCmmCodeDetail(CodeVO)); + + List councilList = resourcesService.selectCouncilList(); + model.addAttribute("councilList", councilList); + + if(searchVO.getCollection().equals("ALL") || searchVO.getCollection().equals("")){ + resultUrl = "kccf/sch/totalSearchListAjax"; + }else if(searchVO.getCollection().equals("pick_Coll")){ + resultUrl = "kccf/sch/searchPickListAjax"; + }else if(searchVO.getCollection().equals("culturePost_Coll")){ + resultUrl = "kccf/sch/searchCulturePostList"; + }else if(searchVO.getCollection().equals("number_Coll")){ + resultUrl = "kccf/sch/searchNumberListAjax"; + }else if(searchVO.getCollection().equals("story_Coll")){ + resultUrl = "kccf/sch/searchStoryListAjax"; + }else if(searchVO.getCollection().equals("reference_Coll")){ + resultUrl = "kccf/sch/searchReferenceListAjax"; + }else if(searchVO.getCollection().equals("info_Coll")){ + resultUrl = "kccf/sch/searchInfoListAjax"; + }else if(searchVO.getCollection().equals("toon_Coll")){ + resultUrl = "kccf/sch/searchToonListAjax"; + } + + //System.out.println("\n\n\n\n\n################################gubun_ajax:"+searchVO.getCollection()+"/"+gubun_ajax+"/"+resultUrl); + + // ams 서버 패스 정보 + CmmUtil.setAmsPathModelMap(request,model); + searchVO.setQuery(searchVO.getQuery().replaceAll("\\\"", """)); + searchVO.setExactQuery(searchVO.getExactQuery().replaceAll("\\\"", """)); + + return resultUrl; + } + + /** + * OCR문서의 몇번째 문서인지 리턴하기 위한 api + * reference.js 에서 function reference_viewOcr(mediaId, query)로 호출 + * @param request + * @param model + * @return + * @throws Exception + */ + @RequestMapping(value="/sch/getOcrId.do") + public String getOcrId (HttpServletRequest request, ModelMap model ) throws Exception { + //디버깅 보기 설정 + boolean isDebug = false; + String exquery = ""; // exquery 조건 필드 + String jsonStr = ""; + + int startCount = 0; //보여줄 페이지 번호 + String strOperation =""; + + int viewResultCount = WNUtils.parseInt(WNUtils.getCheckReqXSS(request, "LISTCOUNT", "1"), 1); // 출력건수 + String sort = WNUtils.getCheckReqXSS(request, "SORT", "ID"); // 정렬방식 + String sortOrder = WNUtils.getCheckReqXSS(request, "SORTORDER", "ASC"); // 정렬방식 + String collection = WNUtils.getCheckReqXSS(request, "COLLECTION", "ocr"); // 컬랙션 + String media_id = WNUtils.getCheckReqXSS(request, "MEDIA_ID", ""); // 메뉴 + String query = WNUtils.getCheckReqXSS(request, "query", ""); + + String[] collections = null; + if(collection.equals("ALL")) { //통합검색인 경우 + collections = new String[]{"info","map","number","pick","reference","story","culturePost","total","toon"}; //COLLECTIONS; + } else { //개별검색인 경우 + collections = new String[] { collection }; + } + + exquery += ""; + + // 검색관련 서버 설정 + String searchIp = nlibProperty.getString("search.searchIp"); + int searchPort = nlibProperty.getInt("search.searchPort"); + int searchTimeOut = nlibProperty.getInt("search.searchTimeOut"); + + Sf1VO sf1Vo = new Sf1VO(); + sf1Vo.setSearchIp(searchIp); + sf1Vo.setSearchPort(searchPort); + sf1Vo.setSearchTimeOut(searchTimeOut); + + WNSearch wnsearch = new WNSearch(isDebug, false, collections, null); +// WNSearch wnsearch = new WNSearch(isDebug, false, collections, null, WNDefine.USE_RESULT_JSON); + wnsearch.setSf1Vo(sf1Vo); + wnsearch.set(query, "ALL", viewResultCount, startCount, sort, sortOrder, strOperation, exquery, "1970.01.01", WNUtils.getCurrentDate()); + wnsearch.search(query, false, CONNECTION_CLOSE, true, sf1Vo.getSearchIp(), sf1Vo.getSearchPort()); + String debugMsg = wnsearch.printDebug() != null ? wnsearch.printDebug().trim() : ""; + + int min = viewResultCount; + if(wnsearch.getResultTotalCount("ocr") < viewResultCount){ + min = wnsearch.getResultTotalCount("ocr"); //가장 적은 수로 결과를 리턴 + } + + + Gson gson = new Gson(); + JsonArray doc = new JsonArray(); + String[] fields = {"ID","MEDIA_ID","FIRST_PAGE_NUM","LAST_PAGE_NUM","ORDER_NUM","FILE_NAME"}; + for(int idx =0 ; idx < min; idx++){ + JsonObject obj = new JsonObject(); + for(String field : fields){ + obj.addProperty(field, wnsearch.getField("ocr", field, idx, false)); + } + doc.add(obj); + } + + jsonStr = gson.toJson(doc); +// jsonStr = wnsearch.getResultJson(); + + model.addAttribute("jsonStr", jsonStr); + model.addAttribute("isDebug", isDebug); //디버그메시지출력여부 + model.addAttribute("debugMsg", debugMsg); //디버그 메시지 출력 + + + if ( wnsearch != null ) + wnsearch.closeServer(); + + return "kccf/sch/ocr/schOcrRetrunId.kccf-sch"; + } + +} diff --git a/src/main/java/nlib/bbs/web/BoardController.java b/src/main/java/nlib/bbs/web/BoardController.java index f014f9bf..5855d1ad 100644 --- a/src/main/java/nlib/bbs/web/BoardController.java +++ b/src/main/java/nlib/bbs/web/BoardController.java @@ -8,7 +8,6 @@ import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; -import org.apache.commons.collections.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -20,17 +19,13 @@ import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import org.springframework.web.servlet.support.RequestContextUtils; import nlib.bbs.service.BoardService; import nlib.cmm.NlibCommonController; import nlib.cmm.crypto.AriaCrypto; import nlib.cmm.crypto.NlibPasswordEncoder; -import nlib.cmm.exception.ErrorMessage; import nlib.cmm.service.CodeService; import nlib.cmm.service.NlibProperty; import nlib.restful.service.DataApiReqVO; @@ -407,7 +402,12 @@ public class BoardController extends NlibCommonController * @return */ @RequestMapping("/board/selectQnA.do") - public String selectQnA(HttpServletRequest req, Authentication authentication, @RequestParam Map paramMap, ModelMap model) throws Exception { + public String selectQnA(HttpServletRequest req + , Authentication authentication + , @RequestParam Map paramMap + , ModelMap model) throws Exception { + + addParamFromInputFlash(paramMap, req); // 목록 이동시 전달할 매개변수 String searchKeyword = paramMap.get("searchKeyword"); @@ -481,7 +481,11 @@ public class BoardController extends NlibCommonController * @return */ @RequestMapping("/board/insertQnA.do") - public String insertQnA(HttpServletRequest req, Authentication authentication, @RequestParam Map paramMap, ModelMap model) throws Exception { + public String insertQnA(HttpServletRequest req + , Authentication authentication + , @RequestParam Map paramMap + , RedirectAttributes redirectAttrs + , ModelMap model) throws Exception { NlibLoginVO loginVO = getNlibLoginVO(authentication); @@ -537,9 +541,9 @@ public class BoardController extends NlibCommonController // 처리결과 확인 if(!resVO.isSuccess()) { message = resVO.getResultMessage(); - model.addAttribute("message", message); - addParamsToModel(paramMap, model, null, "pageIndex,pageSize,searchKeyword"); - addParamsToModel(paramMap, model, null, + redirectAttrs.addFlashAttribute("message", message); + addParamsToRedirect(paramMap, redirectAttrs, null, "pageIndex,pageSize,searchKeyword"); + addParamsToRedirect(paramMap, redirectAttrs, null, "title,articlePassword," + "regDate, regUserName, " + "email, contentQeust"); @@ -547,8 +551,8 @@ public class BoardController extends NlibCommonController return "redirect:/board/insertQnAForm.do"; } - model.addAttribute("pageSize", paramMap.get("pageSize")); - model.addAttribute("message", "성공적으로 등록되었습니다."); + redirectAttrs.addFlashAttribute("pageSize", paramMap.get("pageSize")); + redirectAttrs.addFlashAttribute("message", "성공적으로 등록되었습니다."); return "redirect:/board/listQnAs.do"; } @@ -568,7 +572,12 @@ public class BoardController extends NlibCommonController * @return */ @RequestMapping("/board/updateQnAForm.do") - public String updateQnAForm(HttpServletRequest req, Authentication authentication, @RequestParam Map paramMap, ModelMap model) throws Exception { + public String updateQnAForm(HttpServletRequest req + , Authentication authentication + , @RequestParam Map paramMap + , ModelMap model + , RedirectAttributes redirectAttrs + ) throws Exception { // 목록 이동시 전달할 매개변수 String searchKeyword = paramMap.get("searchKeyword"); @@ -586,9 +595,9 @@ public class BoardController extends NlibCommonController log.debug("updateQnAForm > articlePassword = " + articlePassword); if(StringUtil.isEmpty(articlePassword)) { - model.addAttribute("message", "비밀빈호가 올바르지 않습니다.(U1)"); + redirectAttrs.addFlashAttribute("message", "비밀빈호가 올바르지 않습니다.(U1)"); - addParamsToModel(paramMap, model, null, "pageIndex,pageSize,searchKeyword,articleNo"); + addParamsToRedirect(paramMap, redirectAttrs, null, "pageIndex,pageSize,searchKeyword,articleNo"); return "redirect:/board/selectQnA.do"; } @@ -611,8 +620,8 @@ public class BoardController extends NlibCommonController log.debug("updateQnAForm > 입력받은 비밀번호를 SHA256 암호화한 값 : " + shaArticlePassword); if(!shaArticlePassword.equals(article.get("articlePassword"))) { - model.addAttribute("message", "비밀번호가 올바르지 않습니다.(U2)"); - addParamsToModel(paramMap, model, null, "pageIndex,pageSize,searchKeyword,articleNo"); + redirectAttrs.addFlashAttribute("message", "비밀번호가 올바르지 않습니다.(U2)"); + addParamsToRedirect(paramMap, redirectAttrs, null, "pageIndex,pageSize,searchKeyword,articleNo"); return "redirect:/board/selectQnA.do"; } @@ -646,7 +655,11 @@ public class BoardController extends NlibCommonController * @return */ @RequestMapping("/board/updateQnA.do") - public String updateQnA(HttpServletRequest req, Authentication authentication, @RequestParam Map paramMap, ModelMap model) throws Exception { + public String updateQnA(HttpServletRequest req + , Authentication authentication + , @RequestParam Map paramMap + , RedirectAttributes redirectAttrs + , ModelMap model) throws Exception { log.debug("paramMap > " + paramMap); @@ -681,7 +694,8 @@ public class BoardController extends NlibCommonController DataApiResVO resVO = boardService.selectQnA(reqVO); String oldArticlePassword = resVO.getInfoItem("articlePassword"); if(checkArticlePassword == null || !checkArticlePassword.equals(oldArticlePassword)) { - model.addAttribute("errorMessage", new ErrorMessage("ERR_BRD_UPDTQNA", "잘못된 접근입니다.")); + redirectAttrs.addFlashAttribute("errorCode", "ERR_BRD_UPDTQNA"); + redirectAttrs.addFlashAttribute("errorMessage", "잘못된 접근입니다."); return "redirect:/alert/showError.do"; } diff --git a/src/main/java/nlib/cmm/NlibCommonController.java b/src/main/java/nlib/cmm/NlibCommonController.java index df6f828c..5f715d48 100644 --- a/src/main/java/nlib/cmm/NlibCommonController.java +++ b/src/main/java/nlib/cmm/NlibCommonController.java @@ -14,6 +14,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; import org.springframework.ui.ModelMap; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import org.springframework.web.servlet.support.RequestContextUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -214,5 +216,69 @@ public class NlibCommonController { return model; } + + + public RedirectAttributes addParamsToRedirect(Map paramMap, RedirectAttributes redirectAttrs) { + return addParamsToRedirect(paramMap, redirectAttrs, null, null); + } + public RedirectAttributes addParamsToRedirect(Map paramMap + , RedirectAttributes redirectAttrs + , String upperMapName + , String itemNames) { + + + if(paramMap == null || paramMap.size() < 1) return redirectAttrs; + if(redirectAttrs == null) return redirectAttrs; + + String filter = null; + if(StringUtil.isNotEmpty(itemNames)) { + filter = "," + itemNames + ","; + filter = filter.replaceAll(" ", ""); + } + + boolean existUpperMap = StringUtil.isNotEmpty(upperMapName); + Map uppperMap = null; + if(existUpperMap) uppperMap = new HashMap(); + + for(String key : paramMap.keySet()) { + + if(filter != null && !filter.contains("," + key + ",")) { + continue; + } + if(existUpperMap) { + uppperMap.put(key, paramMap.get(key)); + } else { + redirectAttrs.addFlashAttribute(key, paramMap.get(key)); + } + + } + + if(existUpperMap) redirectAttrs.addFlashAttribute(upperMapName, uppperMap); + + return redirectAttrs; + } + /** + * paramMap에 이전 요청에서 전달할 때 추가한 POST방식의 매개변수값을 paramMap에 추가한다. + * + * @param paramMap + * @param req + */ + public void addParamFromInputFlash(Map paramMap, HttpServletRequest req) { + if(req == null) return; + + Map inFlashMap = (Map)RequestContextUtils.getInputFlashMap(req); + if(inFlashMap == null || inFlashMap.size() < 1) return; + + if(paramMap == null) paramMap = new HashMap(); + + for(String key : inFlashMap.keySet()) { + String value = inFlashMap.get(key); + if(StringUtil.isNotEmpty(value)) { + paramMap.put(key, value); + } + } + + return; + } } diff --git a/src/main/java/nlib/cmm/web/AlertController.java b/src/main/java/nlib/cmm/web/AlertController.java index f2cf519a..3a4e4420 100644 --- a/src/main/java/nlib/cmm/web/AlertController.java +++ b/src/main/java/nlib/cmm/web/AlertController.java @@ -1,5 +1,9 @@ package nlib.cmm.web; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; @@ -7,6 +11,7 @@ import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import nlib.cmm.NlibCommonController; import nlib.cmm.exception.ErrorMessage; /** @@ -32,7 +37,7 @@ import nlib.cmm.exception.ErrorMessage; * */ @Controller -public class AlertController { +public class AlertController extends NlibCommonController { private static final Logger log = LoggerFactory.getLogger(SystemController.class); @@ -44,10 +49,12 @@ public class AlertController { * @return */ @RequestMapping( {"/alert/showError.do"} ) - public String showError(@RequestParam ErrorMessage errorMessage, ModelMap model) { + public String showError(HttpServletRequest req, @RequestParam Map paramMap, ModelMap model) { - model.addAttribute("code", errorMessage.getCode()); - model.addAttribute("message", errorMessage.getMessage()); + addParamFromInputFlash(paramMap, req); + model.addAttribute("code", paramMap.get("errorCode")); + model.addAttribute("message", paramMap.get("errorMessage")); + model.addAttribute("goBackUrl", paramMap.get("goBackUrl")); return "nlib/cmm/common"; } diff --git a/src/main/webapp/WEB-INF/jsp/nlib/board/updateQnAForm.jsp b/src/main/webapp/WEB-INF/jsp/nlib/board/updateQnAForm.jsp index e555862f..aafb4ec8 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/board/updateQnAForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/board/updateQnAForm.jsp @@ -108,7 +108,7 @@ function fn_update() { 기존비밀번호 - + 비밀번호
(변경시 입력) diff --git a/src/main/webapp/WEB-INF/lib/lombok.jar b/src/main/webapp/WEB-INF/lib/lombok.jar new file mode 100644 index 00000000..d3434f69 Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/lombok.jar differ