이 글은 제가 작업했던 내용을 정리하기 위해 수기 형식으로 작성 된 글입니다.
2022.12.09 - [[신.만.추]] - 신입이 만드는 추천시스템-1(개요)
2022.12.09 - [[신.만.추]] - 신입이 만드는 추천시스템-2(데이터 수집, 스크래핑)
2022.12.09 - [[신.만.추]] - 신입이 만드는 추천시스템-3(셀레니움 최소화)
2022.12.09 - [[신.만.추]] - 신입이 만드는 추천시스템-4(한국어 전처리 및 워드임베딩)
2022.12.10 - [[신.만.추]] - 신입이 만드는 추천시스템-5(아이템 벡터화)
2022.12.10 - [[신.만.추]] - 신입이 만드는 추천시스템-6(웹서버 구축)
2022.12.10 - [[신.만.추]] - 신입이 만드는 추천시스템-7(검색성능향상)
2022.12.10 - [[신.만.추]] - 신입이 만드는 추천시스템-8(포트포워딩)
2022.12.10 - [[신.만.추]] - 신입이 만드는 추천시스템-9(WSGI)
2022.12.11 - [[신.만.추]] - 신입이 만드는 추천시스템-10(엘라스틱서치에 관하여)
- 엘라스틱서치에 관하여
- 인덱스 매핑에 관하여
- 엘라스틱서치에 데이터 Bulk
- 검색쿼리와 점수산정식
저번에 작성했던 글에서는 엘라스틱서치 도입 관련한 글을 적었다. 이번 글에서는 엘라스틱서치 도입에 앞서 인덱스 매핑에 대해서 적어보겠다.
2. 인덱스 매핑에 관하여
이전 글에서 RDBMS와 엘라스틱서치의 구조 비교 그림을 보았었다.
엘라스틱서치에서는 database에 해당하는 index의 매핑을 직접 JSON형태로 짜서 입력해 주어야한다.
이전 글에서도 언급했듯이 매핑을 짜는 부분이 생각보다 까다로워서 여러번 인덱스를 지웠다가 새로 만들었다가 하면서 테스트 작업을 진행했다.
PUT /test
{
"settings" : {
"analysis" : {
"tokenizer": {
"nori_tok": {
"type": "nori_tokenizer",
"decompound_mode": "mixed"
}
},
"analyzer": {
"korean": {
"type": "custom",
"tokenizer": "nori_tok"
},
"keyword":{
"type":"custom",
"tokenizer": "nori_tok",
"filter": [
"nori_filter"
]
}
},
"filter": {
"nori_filter":{
"type":"nori_part_of_speech",
"stoptags": [
"E",
"IC",
"J",
"MAG",
"MM",
"NA",
"NR",
"SC",
"SE",
"SF",
"SH",
"SP",
"SSC",
"SSO",
"SY",
"UNA",
"VCN",
"VCP",
"VSV",
"VV",
"VX",
"XPN",
"XR",
"XSA",
"XSN",
"XSV"
]
}
}
}
},
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"channelName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"moreText": {
"type": "text",
"analyzer": "korean",
"fields": {
"keyword": {
"type": "text",
"analyzer":"keyword"
}
}
},
"subscribers": {
"type": "long"
},
"simTag": {
"type": "text",
"analyzer": "korean"
},
"title": {
"type": "text",
"analyzer": "korean",
"fields": {
"keyword": {
"type": "text",
"analyzer":"keyword"
}
}
},
"timeDiff": {
"type": "long"
},
"youtuberVector": {
"type": "dense_vector",
"dims": 200
}
}
}
}
매핑의 경우 직접 CMD에서 한땀한땀 칠 수도 있으나 그럴경우 오탈자나 오류발생시 수정이 까다로워 키바나를 활용하여 인덱스 매핑을 진행하였다.
매핑에서 정리할만한 부분은 analyzer와 type이라고 볼 수 있다.
위의 인덱스 매핑에서 사용된 analyzer는 nori로 엘라스틱서치에서 제공하는 한국어 형태소 분석기이다.
잘 알려진 은전한닢의 mecab을 사용하기보다 빠르게 적용해볼 수 있는 nori로 적용하였다.
type의 경우 검색결과를 좌우하기때문에 중요한 요소이다.
매핑에 사용된 type은 총 5개이다.
“date” : datetime 형태의 데이터
“long” : 정수형태의 데이터
“keyword” : 정확이 일치하는 단어로만 검색 가능 (완전일치검색)
“text” : analyzer를 통해 토큰화 된 단어로도 검색이 가능
“dense_vector” : vector데이터
따라서 text타입의 데이터에서 TF-IDF기반의 검색이 가능하고, dense_vector로 유사도도 계산이 가능하게 된다.
이제 인덱스의 매핑이 완성되었으니 매핑에 따라 데이터를 넣어야 할 차례이다.
참조링크
매핑 정의, 적용방법 및 결과 예시
https://velog.io/@hanblueblue/Elastic-Search-4
한글 매핑 심화
Elasticsearch 에서 한글 형태소 분석 잘 해보기
매핑 정석
'[신.만.추]' 카테고리의 다른 글
신입이 만드는 추천시스템-13(검색쿼리와 점수산정식) (0) | 2022.12.12 |
---|---|
신입이 만드는 추천시스템-12(데이터 bulk) (0) | 2022.12.11 |
신입이 만드는 추천시스템-10(엘라스틱서치에 관하여) (0) | 2022.12.11 |
엘라스틱서치 설치 및 환경구성 (0) | 2022.12.10 |
신입이 만드는 추천시스템-9(WSGI) (0) | 2022.12.10 |