-
공돌이조회 수: 21809, 2018.09.29 15:28:47
-
이전 글에서 급하게 수정해서 올렸지만, 한글형태소 분석기는 최근에 새로나온 nori 를 이용하도록 하겠습니다.
공식 플러그인인 만큼 설치는 장난아니게 쉬워졌습니다.
참고로, Debian에서 서비스로 elasticsearch를 쓰는 경우 플러그인이나 실행파일 찾기 힘드실 수 있는데,
/usr/share 폴더 안에 있습니다.아래는 플러그인 설치프로그램을 full-path를 줘서 실행시킨 예입니다. 귀찮으신 분은 걍 path에 걸어놓으셔도 되겠지요.
1. 플러그인 설치
#설치sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-nori만약 플러그인을 삭제하시려면,
#설치sudo /usr/share/elasticsearch/bin/elasticsearch-plugin remove analysis-nori2. index & mapping creation
- elasticsearch 에 nori 분석기가 적용된 새로운 인덱스를 매핑과 함께 만들어봅니다. 필요한 단어를 추가할 수 있도록 사용자사전도 정의하겠습니다.
아래 예시 코드에서는 분석 시 세가지의 토크나이저 필터가 적용되어 있습니다.
특정품사를 분석 시 제거하는 nori_part_of_speech, 한자를 한글로 변환시켜주는 nori_readingform, 그리고 대문자를 소문자로 변환시켜주는 lowercase 입니다. 노리 분석기의 토크나이저와 필터에 대한 자세한 내용은 엘라스틱서치 사이트의 문서를 참고해주세요 (https://www.elastic.co/guide/en/elasticsearch/plugins/6.4/analysis-nori-analyzer.html)
품사제거필터는 stoptag로 지정을 한 부분이 제거되는 건데, 제가 한글지식이 낮다보니 뭐를 넣고 뭐를 빼야할지 잘 몰라서 웨비나에 나온 거 그대로 넣어뒀습니다..^^ 해보고 이상한거 있으면 빼고 새로 해봐야죠.
- 참고로, 아래에서 fullsearch 라는 필드는 커스텀 필드로 일반 필드들을 다 합쳐서 concatenate 시킨 필드입니다. 엘라스틱서치 5.x 버전에서는 _all method로 전체필드 검색이 가능했으나, 6.x 대 부터는 _all 이 없어졌으므로, 검색이 필요한 전체필드를 검색하기 위해서 아래처럼 적용한 것입니다. 기존필드에 copy_to 를 이용해 커스텀필드에 concatenate 시킨다고 생각하면 될것 같아요.
PUT /testindex/?pretty{"settings" : {"number_of_shards": 1,"number_of_replicas": 0,"index":{"analysis":{"analyzer":{"korean":{"filter":["npos_filter","nori_readingform","lowercase"],"tokenizer":"nori_user_dict"}},"tokenizer": {"nori_user_dict": {"mode":"MIXED","type": "nori_tokenizer","user_dictionary": "userdic_ko.txt"}},"filter":{"npos_filter": {"type": "nori_part_of_speech","stoptags":["E","IC","J","MAG","MM","SP","SSC","SSO","SC","SE","XPN","XSA","XSN","XSV","UNA","NA","VSV"]}}}}},"mappings": {"doc":{"properties": {"uid": {"type": "long"},"category": {"properties": {"code":{"type":"keyword"},"name":{"type":"text","copy_to": "fullsearch"}}},"keywords": {"type": "keyword","copy_to": "fullsearch"},"description": {"type": "text","analyzer": "korean","copy_to": "fullsearch"},"created_at": {"type": "date"},"updated_at": {"type": "date"},"fullsearch": {"type":"text"}}}}}이 명령을 kibana dev console 에 입력하고 실행하면, 일단 오류가 뜹니다. 지정한 사용자 정의사전이 아직 존재하지 않기 때문이죠.
디폴트값이 어느경로인지 오류메시지에 나오니 그 경로에 사용자 사전 명을 생성시켜주시면 됩니다.
debian 서비스기준으로는 /etc/elasticsearch 가 디폴트 경로가 되고 사용자사전 명은 여기서는 userdic_ko.txt 이니까sudo touch /etc/elasticsearch/userdic_ko.txt이렇게 생성시켜주시면 되겠지요.
파일을 생성해주신 후에 다시 명령을 실행시켜 주시거나, 아예 처음부터 사전파일 만든후에 인덱스생성해주셔도 됩니다.
- 사전, 토크나이저 등에 대한 좀 더 자세한 내용은 https://www.elastic.co/guide/en/elasticsearch/plugins/6.4/analysis-nori-tokenizer.html 요기를 참고해 주시면 되겠습니다.
자 이제 인덱스만들고, 분석기 적용하고 매핑까지 했으니 데이터를 넣어야 겠지요.
다음시간 (이번 강좌의 마지막) 에는 RDB(여기서는 MYSQL - 더 정확히는 MARIADB)에 있는 테이블을 Logstash를 이용해서 방금 만들어진 testindex에 넣어서 검색이 잘 되는지 확인해 보겠습니다. - elasticsearch 에 nori 분석기가 적용된 새로운 인덱스를 매핑과 함께 만들어봅니다. 필요한 단어를 추가할 수 있도록 사용자사전도 정의하겠습니다.
번호
|
제목
|
닉네임
| |||
---|---|---|---|---|---|
√ | 프레임워크/기타 | 공돌이 | 21809 | 2018.09.29 | |
1 | 프레임워크/기타 | 공돌이 | 4823 | 2018.09.20 |