Search

다양한 문서를 검색 가능하게 제공한다.

문서 검색

Query

모든 category, section 검색

GET /haystack/v1/_search[?arg=value, ...]

특정 category의 모든 section 검색

GET /haystack/v1/<string:category>/_search[?arg=value, ...]

특정 category의 특정 section 검색

GET /haystack/v1/<string:category>/<string:section>/_search[?arg=value, ...]

Category 및 Section 옵션

  • Category, Section

    • 뉴스: news

      • 정치: politics

      • 경제: economy

      • 사회: society

      • 문화: culture

      • 세계: world

      • 기술/IT: tech

      • 연예: entertainment

      • 사설: opinion

    • 증권사 보고서: research

      • 시장 전망: market

      • 투자전략: strategy

      • 기업 보고서: company

      • 산업 보고서: industry

      • 경제 보고서: economy

      • 채권 보고서: bond

    • 공시,IR : company

      • IR : ir

      • 공시 : disclosure

    • 특허 : patent

      • 특허 : patent

  • 여러 category 및 section을 지정하고자 하는 경우는 `,`를 사용한다. 예를 들어 `정치`, `경제` 뉴스를 검색하고자 하면 다음과 같이 지정한다:

GET /haystack/v1/news/politics,economy/_search[?arg=value, ...]

URL Parameters

  • query

    • 검색어

  • min_score

    • 검색결과에 포함되기 위한 최소 정확도

    • 기본값: 0.15, 큰 값을 지정할수록 정확도가 높은 문서만 검색함

  • uniquify

    • 1 : 중복 문서를 제거 0, : 중복 문서 제거 안함. ( 기본값 : 1 )

  • count

    • 한 페이지에 표시할 문서의 최대 개수

  • page

    • 페이지 번호

  • from / to

    • 검색 대상 날짜 범위 지정 (기본값: 전체)

  • summary

    • 1: 문서 요약, 0: 문서 요약하지 않음 (기본값: 1)

  • highlight

    • 1: 하이라이트 사용, 0: 하이라이트 사용 안 함 (기본값: 0)

  • clustering

    • 1: 문서 클러스터링 사용, 0: 문서 클러스터링 사용 안 함 (기본값: 0)

  • sample_size

    • 클러스터링 시 사용할 샘플 문서 개수 (기본값: 30)

    • count를 10으로 지정하고 sample_size를 50으로 지정하면 50개의 문서를 10개의 클러스터로 분류한다는 의미이다.

  • fields

    • 결과값으로 어떤 항목을 노출한 것인지 지정한다.

    • 예를 들어, fields=title, content_url 로 설정하면, 결과 내역에서 제목 및 원문링크값을 리턴한다.

    • 예시 : 삼성전자에 대한 뉴스 검색 결과 중 제목 및 원문링크만을 리턴https://api.snek.ai/haystack/v1/news/_search?query=삼성전자&clustering=1&fields=title,content_url

Results

  • uid/uid_str

    • 개별 문서의 unique id.

  • category/section

    • 해당 문서의 카테고리 및 섹션 정보

  • publisher/author

    • 신문사나 증권사 명 등 해당 문서를 작성한 주체 및 작성자

  • title

    • 제목

  • content

    • 요약 혹은 본문

  • highlight

    • title, content 에서 검색어와 일치하는 부분의 내용을 일부 표시한다.

  • securities

    • 연관 종목. 해당 문서가 특정 기업에 대한 뉴스인 것으로 판단될 때에만 표기 한다.

  • entities

    • 언급 종목. 해당 기사에서 언급하고 있는 모든 기업을 리스팅 한다.

  • named_entities

    • 뉴스 등에서 추출한 기업, 인물, 브랜드, 사업자 등록번 등을 추출한다. 이때 기업은 상장 뿐 아니라, 비상장 기업도 포함된다.

  • industry

    • 분류된 산업. 해당 기사의 내용을 기반으로 산업 인식 결과를 표한다.

    • label: 표준산업코드의 중분류 코드값

    • name: 표준산업코드의 중분류 명칭

    • score: label에 대한 신뢰 점수

      • 점수 구간: [0.0 ~ 1.0]

  • polarity

    • 분류된 극성. 해당 기사의 내용을 기반으로 긍정/중립/부정의 인식 결과를 표시한다.

    • polarity.label: 부정(-1), 중립(0), 긍정(1)에 대한 코드값

    • polarity.name: 극성 명칭

    • polarity.score: label에 대한 신뢰 점수

      • 점수 구간: [0.0 ~ 1.0]

  • esg

    • 분류된 ESG(환경(Environmental), 사회(Social), 지배구조(Governance)). 해당 기사의 내용을 기반으로 ESG 인식 결과 및 그에 따른 극성을 표시한다.

    • esg.category: 분류된 ESG 인식 결과

      • esg.category.label: 환경(E), 사회(S), 지배구조(G), 해당없음(U)에 대한 코드값

      • esg.category.name: ESG 명칭

      • esg.category.score: label에 대한 신뢰 점수

        • 점수 구간: [0.0 ~ 1.0]

    • esg.polarity: 분류된 ESG에 따른 극성

      • esg.polarity.label: 부정(-1), 중립(0), 긍정(1)에 대한 코드값

      • esg.polarity.name: 극성 명칭

      • esg.polarity.score: label에 대한 신뢰 점수

        • 점수 구간: [0.0 ~ 1.0]

  • image_urls

    • 이미지 링크 주소

  • content_url

    • 원문 기사 주소

  • created_at

    • 기사 생성 시간

  • updated_at

    • 기사 수정 시간

  • profile

    • 검색에 소요된 시간을 밀리세컨드(천분의 1초) 로 나타낸다.

  • cluster_info

    • 클러스터링 옵션을 켠 경우, 클러스토링 설정 정보를 표기한다.

  • total_matches

    • 검색된 문서 개수

  • max_score

    • 내부에서 사용하는 검색 Score 의 최대값

  • current_page

    • 현재 페이지 번호 ( input 에서 page 로 지정할 수 있다. )

  • last_page

    • 최대 페이지 번호 ( 최대 100 페이지까지만 지원한다. 100 페이지 미만인 경우에는 해당 숫자가, 그 이상인 경우에는 100으로 표기된다. )

Examples

경제 뉴스 전체 검색

api.ddi.deepsearch.com/haystack/v1/news/economy/_search?query=*

경제 뉴스 중 2018-1-1~2018-2-1 검색

api.ddi.deepsearch.com/haystack/v1/news/economy/_search?query=*&from=20180101&to=20180201

전체 뉴스 중 삼성전자 검색

api.ddi.deepsearch.com/haystack/v1/news/_search?query=삼성전자&clustering=1&count=50

경제 뉴스 중 삼성전자 검색

api.ddi.deepsearch.com/haystack/v1/news/economy/_search?query=삼성전자&clustering=1&count=50

삼성전자 뉴스 페이징

api.ddi.deepsearch.com/haystack/v1/news/economy/_search?query=삼성전자&clustering=1&count=50&page=2

연산자의 활용

Query String Syntax

쿼리 문자열은 쿼리 파서를 통해 항(Term)과 연산자들로 파싱된다. 하나의 항은 하나의 단어(예를 들어 금리 혹은 이자)일 수도 있고, 혹은 두 단어 이상이 연속적으로 연결된 문서를 검색하기 위해 사용하는 "로 묶인 문장(예를 들어 "기준금리 인하")일 수도 있다.

연산자는 검색 알고리즘의 동작을 변경하기 위해 사용할 수 있다. 이에 대한 자세한 내용은 후술하기로 한다.

Field Names

입력한 쿼리의 검색 대상은 기본적으로 문서의 제목과 본문이지만, 다음과 같이 특정한 필드를 지정하는 것도 가능하다:

제목에서 `삼성전자`를 검색하는 경우

title:삼성전자

제목에서 `삼성전자` 혹은 `구글`을 검색하는 경우

title:(삼성전자 or 구글)

언론사 이름으로 검색하는 경우

publisher:한겨레

사업자 등록번호로 검색하는 경우

named_entities.entities.company.business_rid:'124-81-00998'
named_entities.entities.company.business_rid:('124-81-00998' or '107-86-14075')

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:갤럭시))

ESG 의 활용

ESG 권한이 부여된 경우, 개별 뉴스에 대한 검색 결과값에 ESG 결과가 추가되며, 결과는 E(환경), S(사회), G(지배구조), U(ESG 아님) 중 하나이며, E,S,G 인 경우 각각에 대해서 긍정/중립/부정의 값을 가지고 있다.

이를 활용하여, 다음과 같은 응용이 가능하다.

  1. 뉴스의 결과에 ESG 여부 및 ESG 긍부정 여부를 표기한다.

  2. 최근 뉴스 중 ESG 뉴스만을 검색한다. 예를 들어, 최근 뉴스 중 지배구조와 관련된 부정적인 뉴스만 검색할 수 있다.

  3. 특정 기업에 대한 ESG 뉴스만을 검색한다. 예를 들어, 삼성전자와 관련된 뉴스 중, ESG 뉴스만을 검색할 수 있다.

각각의 경우에 대한 API 호출 예시는 아래와 같다.

1. 뉴스 결과의 ESG 정보
1) api.ddi.deepsearch.com/haystack/v1/news/economy/_search?query=* 
2) 검색 결과에 추가된 ESG 정보를 활용하여, 결과 표기
(예시) ESG 뉴스 아님 
"esg": {
"category": {
"label": "U",
"name": "해당없음",
"score": 1.0
},
"polarity": {
"label": "0",
"name": "중립",
"score": 1.0
}


2. 최근 뉴스 중 ESG 뉴스만을 검색 ( 지배구조 부정 이슈 )
1) api.ddi.deepsearch.com/haystack/v1/news/economy/_search?query=* 
   and esg.category.label:"G" and esg.polarity.label:"-1"
2) 검색결과에 지배구조 부정 이슈만 검색됨

3. 특정 기업에 대한 ESG 뉴스만을 검색
1) api.ddi.deepsearch.com/haystack/v1/news/economy/_search?query=securities.symbol:"005930"
   and not esg.category.label:"U"
2) 검색결과에 삼성전자 뉴스 중 ESG 이슈만 검색됨   

Examples

다음은 실제 다양한 서비스에서 쿼리를 작성한 예제이다.

핀테크

간편결제::간편결제 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 자산재평가 !파트너

배당

배당 :: (배당 or 현금배당 or 중간배당 or 주식배당) and !무배당

References

산업 분류 코드 리스트

'100': '분류 제외, 기타',

'A01': '농업',
'A02': '임업',
'A03': '어업',
'B05': '석탄, 원유 및 천연가스 광업',
'B06': '금속 광업',
'B07': '비금속광물 광업; 연료용 제외',
'C10': '식료품 제조업',
'C11': '음료 제조업',
'C12': '담배 제조업',
'C14': '의복, 의복 액세서리 및 모피제품 제조업',
'C15': '가죽, 가방 및 신발 제조업',
'C16': '목재 및 나무제품 제조업; 가구 제외',
'C17': '펄프, 종이 및 종이제품 제조업',
'C20': '화학 물질 및 화학제품 제조업; 의약품 제외',
'C21': '의료용 물질 및 의약품 제조업',
'C22': '고무 및 플라스틱제품 제조업',
'C23': '비금속 광물제품 제조업',
'C24': '1차 금속 제조업',
'C26': '전자 부품, 컴퓨터, 영상, 음향 및 통신장비 제조업',
'C27': '의료, 정밀, 광학 기기 및 시계 제조업',
'C28': '전기장비 제조업',
'C29': '기타 기계 및 장비 제조업',
'C30': '자동차 및 트레일러 제조업',
'C31': '기타 운송장비 제조업',
'C32': '가구 제조업',
'C33': '기타 제품 제조업',
'F41': '종합 건설업',
'H49': '육상 운송 및 파이프라인 운송업',
'H50': '수상 운송업',
'H51': '항공 운송업',
'H52': '창고 및 운송관련 서비스업',
'I55': '숙박업',
'I56': '음식점 및 주점업',
'J58': '출판업',
'J59': '영상ㆍ오디오 기록물 제작 및 배급업',
'J61': '우편 및 통신업',
'K64': '금융업',
'K65': '보험 및 연금업',
'L68': '부동산업',
'M71': '전문 서비스업',
'N76': '임대업; 부동산 제외',
'P85': '교육 서비스업',
'Q86': '보건업',
'R90': '창작, 예술 및 여가관련 서비스업',
'R91': '스포츠 및 오락관련 서비스업'

Last updated

Was this helpful?