- 인쇄
- PDF
섹션 및 색인 설정
- 인쇄
- PDF
Classic/VPC 환경에서 이용 가능합니다.
도메인의 섹션과 색인은 검색할 문서의 형식과 검색 목적에 맞게 정의해야 합니다. 제공하려는 검색 방식에 알맞은 색인을 생성하면 더욱 빠른 응답을 얻을 수 있습니다.
<예시> 검색 대상 문서가 상품명, 가격, 상품 설명, 추천 수, 태그로 구성된 경우
- 섹션: 문서의 구성 항목과 동일하게 정의(상품명, 가격, 상품 설명, 추천 수, 태그)
- 색인: 검색 목적에 맞게 섹션을 선택하여 구성
- 상품명만으로 검색하려는 경우: 상품명에 해당하는 섹션만 선택
- 상품명, 가격 등 여러 항목으로 검색하려는 경우: 검색하려는 항목에 해당하는 복수의 섹션 선택
섹션 및 색인 설정에서는 도메인에 섹션을 추가하는 방법과 색인을 추가 및 수정하는 방법을 설명합니다. 또한, 색인 설정 항목과 List 타입의 데이터를 색인하는 방법에 대해 설명합니다.
섹션 추가
도메인에 섹션을 추가하는 방법은 다음과 같습니다.
- 네이버 클라우드 플랫폼 콘솔의 Region 메뉴와 Platform 메뉴에서 이용 중인 환경을 클릭해 주십시오.
- Services > Big Data & Analytics > Cloud Search 메뉴를 차례대로 클릭해 주십시오.
- Domain 메뉴를 클릭해 주십시오.
- 도메인 목록에서 섹션을 추가할 도메인을 선택한 후 [색인 설정] 버튼을 클릭해 주십시오.
- [섹션] 탭을 클릭해 주십시오.
- 섹션 이름 및 랭킹변수(데이터타입)을 입력한 후 [추가] 버튼을 클릭해 주십시오.
- 섹션 저장 후 섹션을 수정하거나 삭제할 수 없습니다.
- 섹션 이름은 알파벳, 숫자, 언더바(_)만 입력 가능합니다.
- 섹션은 도메인에 업로드할 검색 대상 문서의 스키마와 동일하게 구성해야 합니다.
- : 추가한 섹션 삭제
- 섹션 추가를 모두 마쳤다면 [저장] 버튼을 클릭해 주십시오.
- 섹션 및 색인 변경 후 자동 완성 색인은 수동으로 갱신해야 합니다.(자동 완성 색인 갱신 참고)
- 랭킹 변수는 자료형을 의미하는 것이 아닌, 섹션의 속성을 나타내는 변수입니다.
- 문서 검색 시 랭킹 변수(섹션 속성)를 이용해 정렬(sort), 요약 검색(aggregate), 제한 검색(scope, user_scope)을 할 수 있습니다.
- 해당 섹션의 속성으로 정렬, 요약 검색, 제한 검색을 하지 않는다면 랭킹 변수를 추가하지 마십시오.
- 불필요한 랭킹 변수를 추가하면, 문서 업로드 및 색인 수정 시 불필요한 공간을 추가로 사용하거나 시간이 많이 소요됩니다.
색인 변경
기존 도메인의 색인을 추가 및 수정하는 방법은 다음과 같습니다.
- 네이버 클라우드 플랫폼 콘솔의 Region 메뉴와 Platform 메뉴에서 이용 중인 환경을 클릭해 주십시오.
- Services > Big Data & Analytics > Cloud Search 메뉴를 차례대로 클릭해 주십시오.
- Domain 메뉴를 클릭해 주십시오.
- 도메인 목록에서 색인을 변경할 도메인을 선택한 후 [색인 설정] 버튼을 클릭해 주십시오.
- [색인] 탭을 클릭해 주십시오.
- [추가] 버튼 또는 [수정] 버튼을 클릭한 후, 나타나는 팝업 창에서 색인을 추가 또는 수정하고 [저장] 버튼을 클릭해 주십시오.
- 색인 추가 및 수정을 모두 마쳤다면 [저장] 버튼을 클릭해 주십시오.
섹션 및 색인 변경 후 자동 완성 색인은 수동으로 갱신해야 합니다.(자동 완성 색인 갱신 참고)
색인 설정 항목
검색 목적에 따라 색인을 설정할 수 있습니다. 언어 분석기를 포함한 다양한 분석기를 활용하여 상세한 색인을 할 수 있으며, 여러 개의 빌드를 추가하여 섹션별로 섹션 가중치와 색인 옵션을 다르게 지정할 수 있습니다.
텀 위치 활성화
텀 위치 활성화 옵션을 적용하면 색인된 텀의 위치 정보를 저장합니다.
텀 위치 활성화 옵션을 적용한 경우, 색인 수정 시 생성된 분석기의 총 개수를 변경할 수 없습니다. (buildInfos의 배열 크기가 동일해야 합니다.)
텀의 위치 정보를 저장하면 색인된 텀의 위치를 지정하여 일치 검색을 할 수 있습니다.
- 일치 검색: 복수의 색인어의 위치와 거리가 검색어와 일치하는 문서 검색
<예시> 텀 위치 활성화 옵션을 적용한 색인
{
"indexes": [
{
"name": "atomic_idx",
"createTermLoc": true,
"documentTermWeight": "sum_wgt",
"buildInfos": [
{
"name": "index_build",
"sectionTermWeight": "1 * stw_2p(tf, 0.5, 0.25, 0., length / 128.0)",
"indexProcessors": [
{
"type": "atomic",
"method": "atomic",
"option": ""
}
],
"sections": [
"description"
]
}
]
}
]
}
<예시> 일치 검색 쿼리
{
"search": {
"atomic_idx": {
"main": {
"query": "현대 자동차는 어디에서 만드나요",
"term_distance": 1,
"option": "within"
}
}
}
}
문서 가중치 함수
문서 가중치 함수는 검색 결과의 문서 가중치(qds, 질의 문서 유사도) 계산에 사용합니다. 문서 가중치 함수에 따라 섹션 가중치를 이용하여 문서 가중치를 계산하며, 별도 설정이 없다면 문서 가중치가 높은 순서대로 검색 결과를 정렬합니다. 문서 가중치 함수로 다음 중 하나를 선택할 수 있습니다.
- Sum: 함수 sum_wgt 선택(가중치의 총합 계산)
- Max: 함수 max_wgt 선택(가중치의 최댓값 계산)
검색 시 랭킹 수식을 통해 문서 가중치에 한 번 더 가중치를 부여하여 랭킹 점수(_relevance)를 계산할 수 있습니다.(랭킹 수식 참고)
<예시> 질의(q1, q2)별 qds에 가중치를 부여하여 랭킹 점수 계산
_relevance = qry_qds("q1") * 0.7 + qry_qds("q2") * 0.3
섹션 가중치
섹션 가중치는 해당 섹션 정보의 중요도를 나타내는 값입니다. 섹션 가중치의 기본 식과 각 함수 및 변수에 대한 설명은 다음과 같습니다.
imp*stw_2p(tf, A, B, C, dlen)
stw_2p
: 검색 시스템 모델(2 포아송 모델) 함수tf
: 검색 질의어가 해당 섹션에 등장한 횟수(term frequency)min(tf, n)
으로 입력하면 과도하게 반복된 단어의 등장 횟수를 n으로 제한합니다.
A
: 0~1 사이의 값으로 지정하며, 1에 가까울수록 섹션 내용의 길이가 길 경우 받는 페널티 증가B
: 0 이상의 값으로 지정하며, 클수록 tf가 낮은 문서와 tf가 높은 문서의 점수 차이가 증가C
: 0~1 사이의 값으로 지정하며, 1에 가까울수록 문서 간 섹션 가중치의 차이가 감소C
가 0.0이면, 섹션 가중치가 0~1점으로 나타납니다.C
가 0.5이면, 섹션 가중치가 0.5~1점으로 나타납니다.C
가 1.0이면, 모든 문서의 섹션 가중치가 1점으로 같아집니다.
dlen
: 문서의 길이imp
: 섹션의 중요도
섹션 가중치의 기본값 1.0 * stw_2p(tf, 0.5, 0.25, 0., length / 128.0)
은 쇼핑몰 검색을 기준으로 설정된 값입니다.
- 상품명은 128자를 넘지 않는다고 가정하여
A
값의 영향을 작게 설정 B
의 값을 작게 설정하여 질의어가 섹션에 등장한 횟수에 대한 영향을 작게 설정- 분석기로 색인된 단어를 한 개라도 포함한 경우 순위가 올라가며 두 개 이상이 되어도 순위가 크게 차이나지 않습니다.
- 일반적인 게시물 검색(제목+내용)의 경우
B
의 값으로 2.0을 사용합니다.
dlen
의 값을 문서 길이를 128.0으로 나눈 값(length/128.0)으로 설정하여A
값에 의한 페널티의 기준을 128자로 설정
분석 옵션
분석 옵션으로 색인 방식에 따른 분석기와 동의어 사전을 선택할 수 있습니다. Cloud Search는 hanaterm이라는 형태소 분석기를 제공하며, 색인 방식은 atomic과 sgmt를 제공합니다.
- 분석 옵션으로 동의어 사전을 선택하려면 먼저 동의어 사전을 생성해야 합니다.(동의어 사전 생성 방법은 동의어 사전 생성 참고)
- atomic 색인 방식은 API를 통해서만 설정할 수 있습니다.(API를 통한 색인 설정 방법은 Cloud Search API 가이드 참고)
색인 방식별 선택할 수 있는 분석 옵션은 다음과 같습니다.
- atomic
- 옵션 설정 안함: 공백으로 구분된 문자열을 색인
- oneterm: 전체 입력 문자열을 하나로 색인
- sgmt
- 언어 옵션: 언어를 선택하면 해당 언어에 적합한 분석 옵션이 함께 적용됨
- 한국어: korean(+korea +josacat +eomicat)
- 영어: english(+english +revert)
- 일본어: japanese(+japan +josacat +eomicat)
- 중국어(간체): chinese(+china_cn)
- 중국어(번체): taiwanese(+china_tw)
- 태국어: thai(+thai)
- 인도네시아어: indonesian(+indonesian)
- 형태소 분석 옵션(한국어)
- 조사: +josacat
- 어미: +eomicat
- 파생 명사의 어근: +nounstem
- 복합 명사: +compsub
- 세 글자 합성 명사: +compnoun3
- 한국어 외 언어 공통 옵션
- 용언의 원형: +revert
- 공통 옵션
- 전체 어절 색인: +word
- 문자 타입별 분할: +token-all
- 병합된 토큰 분할(+token-all과 함께 사용 불가): +alphanum
- 언어 옵션: 언어를 선택하면 해당 언어에 적합한 분석 옵션이 함께 적용됨
색인 예시
여기에서는 쇼핑몰의 상품을 검색하는 경우를 가정하여 색인과 검색 결과의 예시를 설명합니다. 쇼핑몰의 상품 정보가 다음 표와 같다고 가정합니다.
category | brand | item | description |
---|---|---|---|
TV | LG | 55인치 TV | 설명 |
TV | LG | 65인치 | 설명 |
TV | 삼성 | 65인치 | 설명 |
TV | 삼성 | 75NTAWE3 | 설명 |
TV 주변기기 | 네이버 | LG TV 거치장 | 설명 |
TV 주변기기 | 네이버 | 스탠드 | 설명 |
이 경우 다음과 같이 색인을 생성할 수 있습니다.
- 분석 옵션에 동의어 사전 syno_dic을 추가한 예시입니다.
{
"indexes": [
{
"name": "shopping",
"createTermLoc": true,
"documentTermWeight": "sum_wgt",
"buildInfos": [
{
"name": "exact_oneterm",
"sectionTermWeight": "0.5 * stw_2p(min(tf, 1), 0.25, 0., 0., length / 128.0)",
"indexProcessors": [
{
"type": "hanaterm",
"method": "atomic",
"option": "oneterm"
},
{
"type": "add-normalized-synonym",
"dictName": "syno_dic",
"maxSynoNum": -1
}
],
"sections": [
"category"
]
},
{
"name": "category_sgmt",
"sectionTermWeight": "0.10 * stw_2p(min(tf, 1), 0.25, 0., 0., length / 128.0)",
"indexProcessors": [
{
"type": "hanaterm",
"method": "sgmt",
"option": "+korea +josacat +eomicat +syno=syno_dic"
},
{
"type": "add-normalized-synonym",
"dictName": "syno_dic",
"maxSynoNum": -1
}
],
"sections": [
"category"
]
},
{
"name": "brand_item_atomic",
"sectionTermWeight": "0.05 * stw_2p(min(tf, 1), 0.25, 0., 0., length / 128.0)",
"indexProcessors": [
{
"type": "hanaterm",
"method": "atomic",
"option": ""
},
{
"type": "add-normalized-synonym",
"dictName": "syno_dic",
"maxSynoNum": -1
}
],
"sections": [
"brand",
"item"
]
},
{
"name": "brand_item_name_sgmt",
"sectionTermWeight": "0.05 * stw_2p(min(tf, 1), 0.25, 0., 0., length / 128.0)",
"indexProcessors": [
{
"type": "hanaterm",
"method": "sgmt",
"option": "+english +revert +korea +josacat +eomicat +syno=syno_dic"
},
{
"type": "add-normalized-synonym",
"dictName": "syno_dic",
"maxSynoNum": -1
}
],
"sections": [
"brand",
"item"
]
},
{
"name": "description_sgmt",
"sectionTermWeight": "0.03 * stw_2p(tf, 0.5, 0.25, 0., length / 128.0)",
"indexProcessors": [
{
"type": "hanaterm",
"method": "sgmt",
"option": "+english +revert +korea +josacat +eomicat +syno=syno_dic"
},
{
"type": "add-normalized-synonym",
"dictName": "syno_dic",
"maxSynoNum": -1
}
],
"sections": [
"description"
]
}
]
}
]
}
검색어 'LG TV'를 검색하면 검색은 다음과 같이 처리됩니다.
- category가 TV인 문서는 검색어와 atomic으로 일치하여 가중치를 가장 크게 줍니다.
- LG 55인치 TV는 brand와 item에서 검색어와 일치하여 가중치를 더 줍니다.
- LG 65인치는 검색어와 category가 일치하지만 brand_item_atomic 빌드에 의해 낮은 순위로 정렬됩니다.
- TV 거치장은 검색어가 category와 일치하지 않아 낮은 순위로 정렬됩니다.
List 타입의 데이터 색인
Cloud Search가 제공하는 검색 엔진은 JSON의 List 타입을 지원하지 않습니다. 하지만 다음과 같이 분석 옵션을 설정하면 List 타입의 데이터를 우회하여 사용할 수 있습니다.
콘솔에서는 지원하지 않으며 API를 통해서만 설정할 수 있습니다.(API를 통한 색인 설정 방법은 Cloud Search API 가이드 참고)
<예시> tag라는 섹션에 대한 분석 옵션 지정
{
"indexProcessors": [
{
"distance": 1000,
"delimiter": "\u001f",
"type": "tokenize"
},
{
"type": "hanaterm",
"method": "atomic",
"option": "+atomic"
}
]
}
- 분석 옵션을 통해 JSON List 타입으로 입력한 자료를 검색 엔진이 사용할 수 있도록 구분자(delimiter)를 넣어 저장합니다.
- tag 섹션에 ["정보", "검색"]이라는 정보를 입력하면, 분석 옵션을 통해 "정보\u001f검색"으로 변환 후 색인되며 "정보", "검색"으로 토큰화되어 검색에 사용할 수 있습니다.
- 토큰화된 태그는 다른 태그들 사이에 있는 태그가 검색되지 않도록 텀 간 거리(<예시> 1000)를 임의로 지정합니다. 이 텀 간 거리를 옵션으로 지정해 within 검색을 하면 토큰화된 태그들 사이에 있는 태그를 포함하지 않고 검색할 수 있습니다.(within 검색에 대한 자세한 내용은 search 참고)