Haystack API Overview Search APIs Search API 모든 category, section 검색 GET /v1/haystack/_search[?arg=value,...] 특정 category 의모든 section 검색 GET /v1/haystack/<string:category>/_search[?arg=value,...] 특정 category 의특정 section 검색 GET /v1/haystack/<string:category>/<string:section>/_search[?arg=value,...] Category 및 Section 옵션 Category 뉴스 : news 증권사보고서 : research Section Category 가 news일경우정치 : politics 경제 : economy 사회 : society 문화 : culture 세계 : world 기술 /IT: tech 연예 : entertainment 사설 : opinion Category 가 research일경우시장전망 : market 투자전략 : strategy 기업보고서 : company 산업보고서 : industry 경제보고서 : economy 채권보고서 : bond
여러 category 및 section 을지정하고자하는경우는, 를사용한다. 예를들어정치, 경제뉴스를검색하고자 하면다음과같이지정한다 : GET /v1/haystack/news/politics,economy/_search[?arg=value,...] URL Parameters query 검색어 min_score 검색결과에포함되기위한최소정확도기본값 : 0.15, 큰값을지정할수록정확도가높은문서만검색함 count 한페이지에표시할문서의최대개수 page 페이지번호 summary 1 or 0 1일경우 content의내용을요약, 그외의경우본문전체를반환함. clustering 1 or 0 0일경우문서클러스터링기능을사용하지않음, 그외의값일경우문서클러스터링기능사용 sample_size 클러스터링시사용할샘플문서개수. 기본값 : 30 count를 10으로지정하고 sample_size를 50으로지정하면 50개의문서를 10개의클러스터로분류한다는의미이다. Examples 전체뉴스중삼성전자검색 curl XGET 'https://sandbox apigw.koscom.co.kr/v1/haystack/news/_search?query= 삼성전자 &clustering=1&count=50' curl XGET 'https://sandbox apigw.koscom.co.kr/v1/haystack/news/_search?query= 삼성전자 &clustering=1&count=50&since=262408008557006859' 경제뉴스중삼성전자검색 curl XGET 'https://sandbox apigw.koscom.co.kr/v1/haystack/news/economy/_search?query= 삼성전자 &clustering=1&count=50' curl XGET 'https://sandbox apigw.koscom.co.kr/v1/haystack/news/economy/_search?query= 삼성전자 &clustering=1&count=50&since=262408008557006859'
Trends API 지정한쿼리에대한시간대별트렌드를계산한다. 모든 category, section 에대해트렌드계산 GET /v1/haystack/_trends[?arg=value,...] 특정 category 의모든 section 에대해트렌드계산 GET /v1/haystack/<string:category>/_trends[?arg=value,...] 특정 category 의특정 section 에대해트렌드계산 GET /v1/haystack/<string:category>/<string:section>/_trends[?arg=value,...] URL Parameters Result query 트렌드계산에사용할쿼리 interval 트렌드계산단위 1y: 1년단위 1M: 1개월단위 1w: 1주일단위 1d: 1일단위 from/to 트렌드계산시작 / 끝날짜지정하지않으면 1990년부터현재까지의모든기사에대해계산 key 날짜 value 해당기간의모든뉴스대비검색된뉴스가차지하는비중전체뉴스개수가증가하는추세이므로 count보다는 value가트렌드비교대상으로서더적합하다. count 해당기간에포함된검색된뉴스의수 Examples 전체기간에대해북한핵실험트렌드를 1 년단위로계산
curl XGET 'https://sandbox apigw.koscom.co.kr/v1/haystack/news/_trends?query= 북한핵실험 &interval=1y' 위결과를보면 2006 년, 2009 년, 2013 년, 2016 년네차례에걸쳐서북한이핵실험을했다는사실을추정해볼수있 다. 이제 2006 년으로범위를좁혀서월간트렌드를계산해보자. 2006 년의월간북한핵실험트렌드 curl XGET 'https://sandbox apigw.koscom.co.kr/v1/haystack/news/_trends?query= 북한핵실험 &interval=1m&from=20060101&to=20061231' 위결과를통해 2006 년 10 월중에북한이핵실험을했다는사실을추정해볼수있다. 이제다시일간트렌드를통 해정확한날짜를확인해보자. 2006 년 10 월의일간북한핵실험트렌드 https://sandbox apigw.koscom.co.kr/v1/haystack/news/_trends?query= 북한핵실험 &interval=1d&from=20061001&to=20061031 위결과를통해 2016 년 10 월 9 일에북한핵실험이있었고, 이이슈가 4 5 일가량지속되었음을알수있다. Count API 지정한쿼리에해당하는문서혹은특정필드의값 ( 언론사, 기자이름등 ) 을기준으로그개수를집계 (Aggregation) 한다. SQL의집계와완전히동일하진않지만유사한면이많다. 모든 category, section 집계 GET /v1/haystack/_count[?arg=value,...] 특정 category 의모든 section 집계 GET /v1/haystack/<string:category>/_count[?arg=value,...] 특정 category 의특정 section 집계 GET /v1/haystack/<string:category>/<string:section>/_count[?arg=value,...] URL Parameters key 집계의기준쿼리 query 집계대상필드혹은쿼리집계대상필드는 publisher, author를지정할수있다. from/to
Examples 집계시작 / 끝날짜지정하지않으면 1990년부터현재까지의모든기사에대해집계 2015 년 1 년간네이버, 카카오에대한핀테크, 인공지능기사개수집계 curl XGET 'https://sandbox apigw.koscom.co.kr/v1/haystack/news/_count?key= 네이버 ; 카카오 &query= 핀테 크 :: 간편결제 or 인터넷은행 ; 인공지능 :: 인공지능 or 머신러닝 or 딥러닝 &from=20150101&to=20151231' 위쿼리의결과를다음과같은표로표현할수있다 : 네이버 카카오 핀테크 917 2652 인공지능 171 74 2015 년 1 년간네이버, 카카오에대한언론사별기사개수 curl XGET 'https://sandbox apigw.koscom.co.kr/v1/haystack/news/_count?key= 네이버 ; 카카오 &query=publisher&from=20150101&to=20151231' 위쿼리의결과를다음과같은표로표현할수있다 : 네이버 카카오 연합뉴스?? 경향신문?? 한겨레?? 2015 년 1 년간네이버, 카카오에대한언론사및기자별기사개수 curl XGET 'https://sandbox apigw.koscom.co.kr/v1/haystack/news/_count?key= 네이버 ; 카카오 &query=publisher;author&from=20150101&to=20151231' 위쿼리의결과를다음과같은표로표현할수있다 :
네이버 카카오 연합뉴스?? + 기자1?? + 기자2?? 경향신문?? + 기자1?? 한겨레?? + 기자1?? Search Query Query String Syntax 쿼리문자열은쿼리파서를통해항 (Term) 과연산자들로파싱된다. 하나의항은하나의단어 ( 예를들어금리혹은이자 ) 일수도있고, 혹은두단어이상이연속적으로연결된문서를검색하기위해사용하는 " 로묶인문장 ( 예를들어 " 기준금리인하 ") 일수도있다. 연산자는검색알고리즘의동작을변경하기위해사용할수있다. 이에대한자세한내용은후술하기로한다. Field Names 입력한쿼리의검색대상은기본적으로문서의제목과본문이지만, 다음과같이특정한필드를지정하는것도가능하다 : 제목에서삼성전자를검색하는경우 title: 삼성전자 제목에서삼성전자혹은구글을검색하는경우 title:( 삼성전자 or 구글 ) 언론사이름으로검색하는경우 publisher: 한겨레 Proximity Searches " 로묶인문장쿼리의경우나열된두개이상의단어가정확히같은순서로일치하는문서만검색결과에나타난다. 이와달리 Proximity Query를사용하면쿼리에나열된단어가지정한범위내에서일치하는경우에도검색결과에나타난다. 다음쿼리를보자 : " 삼성전자아이폰 "~5
이경우삼성전자와아이폰이란단어가문서내에서 5 단어이내의거리에서함께나타날경우입력쿼리와일치 한다고판단하게된다. 다음은상기쿼리로검색할수있는문장의예이다 : 소장에는삼성전자가아이폰의둥근모서리와베젤디자인특허를침해했다는내용이담겼다. 삼성전자는항소심에서아이폰특허중일부가무효판정을받으면서삼성의손해배상액은 5 억 4817 만 6477 달러로줄 어들었다. Boolean Operators 기본적으로모든단어는 AND 연산으로처리되므로쿼리에나열된모든단어가일치하는문서가검색결과에나타나게된다. 하지만보다정교한검색을위해서 AND, OR, NOT 등의기본적인 boolean 연산자와쿼리그룹핑기능을제공한다. 예를들어삼성전자관련뉴스중에서도갤럭시혹은아이폰에관련된뉴스만을검색하고자하면다음과같은쿼리를사용하면된다 : 삼성전자 and ( 갤럭시 or 아이폰 ) 연산자를명시하지않은모든단어들은기본적으로 AND 로처리되므로상기쿼리는다음과같이재작성할수있 다 : 삼성전자 ( 갤럭시 or 아이폰 ) 이렇게검색된뉴스들중에애플관련소송뉴스를제외하고자한다면다음과같이쿼리를개선할수있다 : 삼성전자 ( 갤럭시 or 아이폰 )! 소송 상기쿼리그대로제목만을대상으로검색하고자하는경우는다음과같이쿼리를재작성할수있다 : title:( 삼성전자 ( 갤럭시 or 아이폰 )! 소송 ) 제목에서소송이언급된경우만을제외하고자한다면다음과같이쿼리를재작성할수있다 : 삼성전자 ( 갤럭시 or 아이폰 )!title: 소송 Named Search Query 검색쿼리가여러단어와연산자들로구성되어복잡할경우해당쿼리에이름을지정하여관리및개발편의성을 높일수있는데, Haystack 에서는이를 Named Query 라한다. 문법은다음과같다 : 쿼리이름 ( 선택 ) :: 검색쿼리 예를들어개성공단관련기사를제외한북한핵실험과사드관련기사만검색하고자할경우다음과같은쿼리 를작성할수있다 : " 북한핵실험 " 사드! 개성공단
사용자에게는이런자세한쿼리는노출하지않고단순히 " 북한핵실험 " 으로만노출하고자하는경우 Named Query 를사용하면된다 : " 북한핵실험 " :: " 북한핵실험 " 사드! 개성공단 참고로쿼리이름이두단어이상일경우는상기예와같이 " 로묶어야한다. 이렇게 Named Query를사용하여검색결과의 docs.attributes.query_name 속성에지정한쿼리이름을포함시킬수있다. Filtered Search Query 문서검색이완료된후선택적으로특정조건에따라문서를검색결과에서제거하는것도가능하다. Haystack 에 서는이를 Filtered Query 라한다. 문법은다음과같다 : 쿼리이름 ( 선택 ) :: 검색쿼리 => 필터조건 ( 선택 ) 보통의검색엔진알고리즘과쿼리문법은개별문서에대한 Term Vector에접근할방법을사용자에게제공하지않는다. 따라서특정단어가문서내에서언급되는빈도와같은정보에직접접근하는것이불가능하다. Haystack 역시동일한한계가있으나, Filtered Query를그대안으로제공한다. 다만 Term Vector를직접접근하는것이아니라이미완성된검색결과에서개별문서에대한조건을재검토하는과정을거치므로사용자가기대한문서의개수보다적은개수의문서가화면에나타날수있다는잠재적인문제점이있으므로주의해서사용해야한다. 예를들어개성공단이제목에서최소한번혹은본문에서최소두번이상언급된문서만을검색결과에노출하고자할경우를생각해보자. Filtered Query를사용하면다음과같이쿼리를작성할수있다 : 개성공단 => term.exists(title:" 개성공단 ") or term.freq(content:" 개성공단 ") >= 2 OR 연산자뿐만아니라검색쿼리와동일하게 AND, NOT 등의 boolean 연산자를사용할수있다. 삼성전자애플소송 => term.exists(title: 소송 ) and (term.exists(content: 아이폰 ) or term.exists(content: 갤럭시 )) Examples 다음은 SNEK 의뉴스카테고리별실제사용중인쿼리이다. 핀테크 간편결제 :: 간편결제 or 애플페이 or 삼성페이 or lg 페이 or 라인페이 ; 로보어드바이저 ; 인터넷은행 :: 인터넷은행 or 카카오뱅크 or k 뱅크 or i 뱅크 ; "P2P 대출 "::" 개인간대출 " or (p2p and ( 금융 or 대출 )) or 8percent or 8 퍼센트 or 렌딧 or lendit; 위버플 ; 옐로금융그룹 ; 블록체인 :: 블록체인 or 비트코인 ; 핀테크 :: 제목 : 핀테크 기관동향 트러스톤자산운용 ; 라자드코리아운용 ; 메리츠운용 ; 에셋플러스운용 ; 한국투자밸류자산 ; 신영운용 ; 스팍스운용 ; 이스트스프 링자산운용 ; 한화운용 ; 마이다스운용
실적 실적 :: ( 실적 AND 매출 ) OR 자산재평가! 파트너 상품 ( 원자재 ) 두바이 ; 유가 :: 유가 ;WTI:: 브렌트 or brent or wti or dubai; 국제 and ( 금값 or 은값 or 온스 ); 반도체 :: 반도체 분양 ; 원자재 and +( 구리 or 주석 or 납 or 니켈 );( 원자재 or 곡물 ) and +( 옥수수 or 소맥 or 대두 );" 농산물 값 "; 원면 ; 커피 :: 국제 and 커피 and +( 원두 or 값 or 가격 ) 배당 배당 :: ( 배당 or 현금배당 or 중간배당 or 주식배당 ) and! 무배당 스타트업 스타트업 ; 옐로모바일 ; 피키캐스트 ; 위버플 ; 나인플라바 ; 넛지 ; 넥스트플로어 ; 넵튠 ; 노리 :: 노리 AND 수학교육 ; 노매드컨넥션 ; 노븐 ; 노태그 ; 눔 :: 눔 AND 헬스케어 ; 다섯시삼십분 ; 다이닝코드 ; 데일리호텔 ; 도돔치게임즈 ; 드라마앤컴퍼니 ; 레이니스트 ; 레진엔터테인먼트 ; 로코모티브랩스 ; 리디북스 ; 리앤컴퍼니 ; 리올플레이 ; 마이돌 ; 망고플레이트 ; 브리치 ; 앱크로스 ; 북팔 ; 코멘토 ; 우아한형제들 ; 에스이웍스 ; 토스랩 VC 동향 알토스벤처스 ; 파트너스인베스트먼트 ; 한국투자파트너스 ; 포메이션 8; 에이티넘인베스트먼트 ; lb 인베스트먼트 ; 케 이큐브벤처스 ; 퓨처플레이 ; dsc 인베스트먼트 바이오 삼성바이오로직스 ; 삼성바이오에피스 ; 메지온 ; 한미약품 ; 동화약품 ; 유한양행 ; 유유제약 ; 일동제약 ; 삼일제약 ; JW중외제약 ::"jw중외제약"; 삼성제약 ; 동성제약 ; 라보젠코리아 ; 한독약품 ; 제일약품 ; 오리엔트바이오 ; 국제약품 ; 부광약품 ; 슈넬생명과학 ; 일성신약 ; 대원제약 ; 영진약품 ; 보령제약 ; 현대약품 ; 우리들제약 ; 삼진제약 ; 코미팜 ; 바이오 :: 바이오 or 임상 or 라이센싱아웃 게임 " 모바일게임 "; " 온라인게임 "; " 콘솔게임 "; " 소셜카지노 "; " 게임플랫폼 " 테크 IT 기술 ; 반도체 ; 로봇 IPO IPO :: ( 기업공개 or ipo) and!(etf or etn or 상장사 )
M&A M&A :: 합병 or 인수 and!( 크림 or 인천 or 반대 or 공장 )