엘라스틱서치(Elasticsearch)에서 한글 검색을 위해 검색을 할 데이터를 단순하게 질의하면 결과는 나오지 않습니다.
데이터를 문장 구조에 맞추어서 저장하고 관리를 하기 때문 입니다.
* 사실 한글 검색이든 영문검색이든 공통된 사항입니다. : )
"안녕하세요. 반갑습니다."라는 데이터가 저장이 되어있는데 형태가 노리(nori)라고 가정하여 봅니다.
어떻게 데이터가 구분(token)되어 있는지 확인을 먼저 하여 봅니다.
아래 분석 요청을 통하여 내용을 살펴 봅니다.
#POST
http://주소:9200/_analyze
#Param
{
"tokenizer": "nori_tokenizer",
"explain": true,
"text": ["안녕하세요. 반갑습니다."]
}
이에 따른 결과의 모습 입니다.
여기서 만약 저장되어있는 필드에 단순하게(match, match_pharse 형식) "안녕하세요. 반갑습니다" 로 검색을 하면 데이터가 나오지를 않습니다.
구분되어진 토큰(token)형태에 따라서 검색에 불필요한 데이터를 제거해 주는 것이 효율적이라 생각 합니다.
예를 들어 조사(J), 지정사(VCN, VCP), 보조용언(VX) 같은 단어를 제거하고 데이터를 배열화 하여 검색을 하면 좀 더 나은 결과를 만날 수 있습니다.
결과 속성에서 leftPOS, rightPOS값을 통해서 해당 단어 좌우 형태가 어떠한 형태인지 나타납니다.
물론 제외할 단어의 설정은 충분히 숙고하여 설정하여야 할 것 입니다.
그러므로 사용자가 한글 데이터를 엘라스틱서치에 검색을 하면 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에서 매핑되는 단어를 찾기 못함 |
영문 또한 세부적인 설정과 검색을 하려면 위와 같은 방법으로 가능 합니다.
언급한 방법은 범용적인 개념이 아니라 주관적인 생각이므로 틀리거나 효율적이지 못할 수 있습니다.
기타 의견이나 좋은 말씀 있으시면 댓글 또는 메일로 연락 부탁드립니다.
이상으로 엘라스틱서치 노리 한글검색시 효율적인 방법에 대해서 알아보았습니다. 👻
'엘라스틱서치(Elasticsearch)' 카테고리의 다른 글
엘라스틱서치 and or절 생성시 유의사항(Elasticsearch should minimum_should_match ) (8) | 2021.07.01 |
---|---|
윈도우 엘라스틱서치 + 노리설치(window elasticsearch nori) (0) | 2021.06.08 |
윈도우 엘라스틱서치 + MongoDB 연동(window elasticsearch Mongodb monstache) (2) | 2021.05.28 |
윈도우 엘라스틱서치 + MSSQL 연동(window elasticsearch mssql logstash) (5) | 2021.05.28 |
엘라스틱 서치 기초 질의문 정리(Elasticsearch query) (0) | 2021.03.09 |
댓글