토이 프로젝트를 진행하면서 ElasticSearch에 대해 공부를 시작했습니다.
토이 프로젝트를 진행하면서 검색엔진에 대한 필요성을 느꼈고 형태소 분석을 통한 검색을 하깅 위해 nori라는 플러그인을 사용해야한다고 하여 이렇게 포스팅을 남기게 되었습니다.
저는 elasticsearch-7.9.1 을사용하였으며 window에서 진행하였습니다.
먼저 다음과 같이 명령어를 입력하여 analysis-nori
플러그인을 설치합니다
# elasticsearch 설치경로의 bin 에서 진행합니다 .
$ bin/elasticsearch-plugin install analysis-nori
설치가 완료되었다면 실행중인 ElasticSearch 서비스를 재시작 해줍니다.
여기까지 되었다면 nori 형태소 분석기 플러그인의 설치는 끝났습니다.
그렇다면 Standard Tokenizer와 Nori Tokenizer가 어떠한 차이가 있는지 tokenizer를 실행하여 테스트 해보겠습니다.
###################### Nori Tokenizer 테스트 #################################
GET _analyze
{
"tokenizer": "standard",
"text" : [
"개발자 최윤진 입니다"
]
}
# 실행 결과
{
"tokens" : [
{
"token" : "개발자",
"start_offset" : 0,
"end_offset" : 3,
"type" : "<HANGUL>",
"position" : 0
},
{
"token" : "최윤진",
"start_offset" : 4,
"end_offset" : 7,
"type" : "<HANGUL>",
"position" : 1
},
{
"token" : "입니다",
"start_offset" : 8,
"end_offset" : 11,
"type" : "<HANGUL>",
"position" : 2
}
]
}
GET _analyze
{
"tokenizer": "nori_tokenizer",
"text" : [
"개발자 최윤진 입니다"
]
}
# 실행 결과
{
"tokens" : [
{
"token" : "개발",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 0
},
{
"token" : "자",
"start_offset" : 2,
"end_offset" : 3,
"type" : "word",
"position" : 1
},
{
"token" : "최윤진",
"start_offset" : 4,
"end_offset" : 7,
"type" : "word",
"position" : 2
},
{
"token" : "이",
"start_offset" : 8,
"end_offset" : 11,
"type" : "word",
"position" : 3
},
{
"token" : "ᄇ니다",
"start_offset" : 8,
"end_offset" : 11,
"type" : "word",
"position" : 4
}
]
}
Standard Tokenizer같은 경우는 공백 외에는 아무런 단어에 대해 분리하지 못하였지만 nori_tokenizer는 한국어 사전 정보를 이용해 자
, 이
, 개발
과 같은 단어들을 분리한 것을 확인할 수 있습니다.
간단하게 title만 넣어서 테스트해보겠습니다
PUT /board
{
"settings": {
"analysis": {
"analyzer": {
"nori" : {
"tokenizer" : "nori_tokenizer"
}
}
}
},
"mappings": {
"properties": {
"boardKey" : {
"type": "keyword"
},
"title" : {
"type": "text",
"analyzer": "nori"
}
}
}
}
다음과 같이 nori
라는 이름으로 nori_tokenizer
를 설정한후 title 필드에 analyzer:"nori"
설정을하고 인덱스를 생성합니다.
# Test Data
POST /board/_doc/1
{
"boardKey" : "board_w30fi31weasd",
"title" : "엘라스틱서치 너무 재미있어요."
}
Text데이터는 다음과 같이 엘라스틱 서치 너무 재미있어요.
라고 넣어주겠습니다.
# standard analyzer
GET _analyze
{
"tokenizer": "standard",
"text" : [
"엘라스틱서치 너무 재미있어요."
]
}
# 검색 결과
[
{
"token" : "엘라스틱서치",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<HANGUL>",
"position" : 0
},
{
"token" : "너무",
"start_offset" : 7,
"end_offset" : 9,
"type" : "<HANGUL>",
"position" : 1
},
{
"token" : "재미있어요",
"start_offset" : 10,
"end_offset" : 15,
"type" : "<HANGUL>",
"position" : 2
}
]
# nori analyzer
GET _analyze
{
"tokenizer": "nori_tokenizer",
"text" : [
"엘라스틱서치 너무 재미있어요."
]
}
# 검색 결과
[
{
"token" : "엘라스틱",
"start_offset" : 0,
"end_offset" : 4,
"type" : "word",
"position" : 0
},
{
"token" : "서치",
"start_offset" : 4,
"end_offset" : 6,
"type" : "word",
"position" : 1
},
{
"token" : "너무",
"start_offset" : 7,
"end_offset" : 9,
"type" : "word",
"position" : 2
},
{
"token" : "재밌",
"start_offset" : 10,
"end_offset" : 13,
"type" : "word",
"position" : 3
},
{
"token" : "어요",
"start_offset" : 13,
"end_offset" : 15,
"type" : "word",
"position" : 4
}
]
일반 형태소분석기와 다른 결과를 얻은것을 볼수 있습니다.
지금당장 어떠한 예를 들어 설명할수는 없지만 앞으로 진행할 토이프로젝트에서 검색쪽에 적절하게 사용할 수 있을듯 합니다.
엘라스틱서치를 좀더 공부해봐야 할것 같습니다.