본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


엘라스틱서치(Elasticsearch)

엘라스틱서치 노리 한글검색(Elasticsearch nori) 방법

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2021. 6. 22.

엘라스틱서치(Elasticsearch)에서 한글 검색을 위해 검색을 할 데이터를 단순하게 질의하면 결과는 나오지 않습니다.

데이터를 문장 구조에 맞추어서 저장하고 관리를 하기 때문 입니다.

* 사실 한글 검색이든 영문검색이든 공통된 사항입니다. : )

 

"안녕하세요. 반갑습니다."라는 데이터가 저장이 되어있는데 형태가 노리(nori)라고 가정하여 봅니다.

어떻게 데이터가 구분(token)되어 있는지 확인을 먼저 하여 봅니다.
아래 분석 요청을 통하여 내용을 살펴 봅니다.

#POST
http://주소:9200/_analyze

#Param
{
  "tokenizer": "nori_tokenizer",
  "explain": true,  
  "text": ["안녕하세요. 반갑습니다."]
}

 

이에 따른 결과의 모습 입니다.

안녕 하 시 어요..?

 

여기서 만약 저장되어있는 필드에 단순하게(match, match_pharse 형식) "안녕하세요. 반갑습니다" 로 검색을 하면 데이터가 나오지를 않습니다.

구분되어진 토큰(token)형태에 따라서 검색에 불필요한 데이터를 제거해 주는 것이 효율적이라 생각 합니다.

예를 들어 조사(J), 지정사(VCN, VCP), 보조용언(VX) 같은 단어를 제거하고 데이터를 배열화 하여 검색을 하면 좀 더 나은 결과를 만날 수 있습니다.

명사, 동사, 형용사 등등 구분된 값이 나옵니다.

 

결과 속성에서 leftPOS, rightPOS값을 통해서 해당 단어 좌우 형태가 어떠한 형태인지 나타납니다.

물론 제외할 단어의 설정은 충분히 숙고하여 설정하여야 할 것 입니다.

124개의 데이터가 나오네요

 

그러므로 사용자가 한글 데이터를 엘라스틱서치에 검색을 하면 2단계로 하는 것이 좀 더 효율적이라 생각 합니다.

1. 검색 할 데이터를 분석 합니다. * 주소 : http://주소:9200/_analyze

2. 분석된 데이터에서 검색을 위한 단어, 검색에 필요없는 단어를 분리합니다.

3. 분리가 완료되면 데이터를 조회 합니다. * 주소 : http://주소:9200/인덱스/_search

 

아래 표는 엘라스틱서치의 노리에서 한글 형태값(leftPOS, rightPOS) 목록입니다.

(tag) 영문명 한글명 예시
E Verbal endings 어미 사랑/(E)/
IC Interjection 감탄사 와우(IC), 맙소사(IC)
J Ending Particle 조사 /(J)//에게(J)
MAG General Adverb 일반 부사 빨리(MAG)/달리다, 과연(MAG)/범인//누구/인가
MAJ Conjunctive adverb 접속 부사 그런데(MAJ), 그러나(MAJ)
MM (*) ES:Modifier(한정사), 루씬 API:Determiner(관형사) 설명이 다름 (MM)/
NA Unknown 알 수 없음  
NNB Dependent noun (following nouns) 의존명사  
NNBC Dependent noun 의존명사(단위를 나타내는 명사)  
NNG General Noun 일반 명사 강아지(NNG)
NNP Proper Noun 고유 명사 비숑(NNP)
NP Pronoun 대명사 그것(NP), 이거(NP)
NR Numeral 수사 하나(NR)/밖에, (NR)/더하기/(NR)
SC(*) Separator (· / :) 구분자 nori_tokenizer가 특수문자 제거
SE(*) Ellipsis 줄임표(...) nori_tokenizer가 특수문자 제거
SF(*) Terminal punctuation (? ! .) 물음표, 느낌표, 마침표 nori_tokenizer가 특수문자 제거
SH Chinese character 한자 中國(SH)
SL Foreign language 외국어 hello(SL)
SN Number 숫자 1(SN)
SP Space 공백  
SSC(*) Closing brackets 닫는 괄호 ),] nori_tokenizer가 특수문자 제거
SSO(*) Opening brackets 여는 괄호 (,[ nori_tokenizer가 특수문자 제거
SY Other symbol 심벌  
UNA Unknown 알 수 없음  
UNKNOWN Unknown 알 수 없음  
VA Adjective 형용사 하얀(VA)/
VCN Negative designator 부정 지정사(서술격조사) 사람//아니(VCN)/
VCP Positive designator 긍정 지정사(서술격조사) 사람/(VCN)/
VSV Unknown 알 수 없음  
VV Verb 동사 움직이(VV)/,(VV)/
VX Auxiliary Verb or Adjective 보조 용언 가지//(VX)/, //(VX)/
XPN(*) Prefix 접두사(체언 접두사?) ES에서 매핑되는 단어를 찾지 못함
XR(*) Root 어근 ES에서 매핑되는 단어를 찾기 못함
XSA Adjective Suffix 형용사 파생 접미사 /스럽(XSA)/
XSN(*) Noun Suffix 명사 파생 접미사 ES에서 매핑되는 단어를 찾기 못함
XSV(*) Verb Suffix 동사 파생 접미사 ES에서 매핑되는 단어를 찾기 못함

 

영문 또한 세부적인 설정과 검색을 하려면 위와 같은 방법으로 가능 합니다.

언급한 방법은 범용적인 개념이 아니라 주관적인 생각이므로 틀리거나 효율적이지 못할 수 있습니다.

기타 의견이나 좋은 말씀 있으시면 댓글 또는 메일로 연락 부탁드립니다.

이상으로 엘라스틱서치 노리 한글검색시 효율적인 방법에 대해서 알아보았습니다. 👻

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글