검색엔진의 본연의 기능이 검색기능을 소개한다.
한글 형태소 분석기
은전한닢 형태소분석기
- Mecab-ko-dic 기반으로 만들어진 한국어 형태소 분석기
- 자바 인터페이스, 스칼라 인터페이스 두가지를 제공
- 복합명사, 활용어의 원형 찾기가 가능하고, 시스템 사전을 통해 동작.
- 아파치 라이선스 2.0
- 가장 보편적으로 사용되는 한글 형태소 분석기
설치방법
./bin/elasticsearch-plugin install https://github.com/javacafe-project/elastic-book-etc/raw/master/plugin/elasticsearch-analysis-seunjeon-6.4.3.zip
설치 이후 사용은 인덱스 생성시 tokenizer 항목에 "type"을 seunjeon_tokenizer 로 설정하고, 아래 적을 분석기 설정시 제공하는 옵션을 이용해 옵션을 설정해 사용한다.
분석기에서 제공하는 옵션 정보는 아래와 같다.
파라미터 | 설명 |
user_wods | 사용자 사진을 정의한다(기본값 : [ ]) |
user_dict_path | 사용자 사전 파일의 경로를 설정한다. 해당 파일은 엘라스틱서치의 config폴더 밑에 생성한다. |
decompoud | 복합명사 분해 여부를 정의한다(기본값 : true) |
deinflect | 활용어의 원형을 추출한다(기본값 : true) |
index_eojeol | 어절을 추출한다(기본값 : true) |
index_poses | 추출할 품사를 정의한다. 품사의 정의는 아래 표 참고 (예 : "N", "SL" ...) |
pos_tagging | 품사 태깅 여부를 정의한다(키워드에 품사가 붙어나온다) 기본값은 true |
max_unk_length | Unknown 품사 태깅의 키워드로 뽑을 수 있는 최대 길이를 정의한다(기본값 : 8) |
품사 태그는 아래와 같다
품사 태그명 | 설명 |
UNK | 알 수 없는 단어 |
EP | 선어말어미 |
E | 어미 |
I | 독립언 |
J | 관계언/조사 |
M | 수식언 |
N | 체언 |
S | 부호 |
SL | 외국어 |
SH | 한자 |
SN | 숫자 |
V | 용언 |
VCP | 긍정지정사 |
XP | 접두사 |
XS | 접미사 |
XR | 어근 |
사전 추가
복합명사 (삼성전자, 전자제품 등의 단어가 합해져 하나의 단어처럼 사용되는 것)을 검색하기 위해, 사용자가 사전을 등록할 수 있고, 이를 사용자 사전이라고 한다.
토크나이저 사용시 토크나이저 옵션 중 user_dict_path에 지정되어있는 파일을 참조해 사용자 지정 사전을 만들 수 있다.
사용자 사전은 Term과 Weight 형태로 구성돼 이씨으며 가중치의 값이 작을 수록 그에 따른 우선순위는 높아진다.
즉 우선순위를 통해 복합명사일 경우 분리되지 않도록 구성이 가능하다.
1
2
3
|
삼성전자-100
삼성-50
전자-50
|
cs |
위와 같이 사용사 사전에 등록할 수 있다.
Nori 형태소 분석기
루씬 프로젝트에서 제공되는 한글 형태소 분석기로, 기존 형태소 분석기에 비해 30% 이상 빠르고 메모리 사용량도 줄었으며, 시스템 전반에 영향을 주지 않게 최적화되었으며 아파치 2.0 라이선스를 채택하고 있다.
설치가 필요하며, 명령은 아래와 같다.
bin/elasticsearch-plugin install analysis-nori
Noori 분석기는 하나의 토크나이저와 두개의 토큰 필터로 구성되어있으며, 사용자 설정 사전과 불용어 처리를 위한 stopwords를 지원한다.
- nori_part_of_speech : 토큰 필터
- nori_readingform : 토큰 필터
nori_tokenizer 토크나이저
토크나이저는 형태소를 토큰 형태로 분리하는 데 사용한다. 두가지 파라미터를 지원한다.
- decompressed_mode : 복합명사를 토크나이저가 처리하는 방식
- user_dictionary : 사용자 사전 정의
1) decompound_mode : 복합명사를 처리하는 방식으로, 복합명사를 어떻게 쪼갤지 결정한다. 단어를 쪼개는 방법은 세가지 중에서 설정할 수 있다.
파라미터명 | 파라미터값 | 설명 | 예제 |
decompound_mode | name | 복합명사로 분리하지 않는다 | 월미도 영종도 |
discard | 복합명사로 분리하고 원본 데이터는 삭제한다 | 잠실역 --> (잠실, 역) | |
mixed | 복합명사로 분리하고 원본 데이터도 유지한다 | 잠실역 --> (잠실, 역, 잠실역) |
2) user_dictionary
Nori 토크나이저 는 기본 사전으로 내부적으로 세종 말뭉치와 mecab-ko-dic 사전을 사용한다. user_dictionary를 이용해 사용자가 정의한 명사를 사전에 추가 등록할 수 있다.
위치 : config/userdic_ko.txt 형태
설정하게 되면 인덱스의 tokenizer옵션의 user_dictionary 옵션에 해당 사전 파일을 명시에 사용자 사전을 추가해준다.
nori_part_of_speech 토큰 필터
nori_part_of_speech 토큰 필터 : 품사 태그와 일치하는 토큰을 찾아 제거하는 토큰 필터로, 문서에 존재하는 모든 명사를 역색인하는 것이 아니라 명사를 선택적으로 고를 수 있고, 이를 통해 사용하지 않는 형태소를 제거 가능하다.
중간에 해당 설정을 바꿀 수 있으며, filter 옵션의 nori_postfilter에 명시함으로써 해당 기능 사용이 가능하다.
여러 개의 Stoptag를 사용하고 싶다면 컴마(,)로 연결해 사용한다.
nori_readingform 토큰 필터
문서에 존재하는 한자를 한글로 변경해 저장해주는 필터
트위터 형태소 분석기
트위터에서 한글을 처리하기 위해 개발한 형태소 분석기로, 정규화, 토큰화, 스테밍, 어구 추출이 가능하다는 특징이 있다.
- 정규화 : 입니닼ㅋㅋ --> 입니다, 사릉해 --> 사랑해
- 토큰화 : 한국어를 처리하는 예시입니다 ㅋㅋ --> 한국어Noun, 를Josa, 처리Noun, 하는Verb, 예시Noun, 입니다Adjective, ㅋㅋ KoreanParticle
- 스테밍 : 한국어를 처리하는 예시입니다 ㅋㅋ --> 한국어Noun, 를Josa, 처리Noun, 하는Verb, 예시Noun, 입니다Adjective, ㅋㅋ KoreanParticle
- 어구추출 : 한국어를 처리하는 예시입니다 ㅋㅋ --> 한국어 , 처리, 예시, 처리하는 예시
분석기에 사용되는 사전은 open-korean-test 프로젝트에서 별도로 제공되며, 사전 내부의 src/main/resources/org/openkoreantext/processor/util 디렉토리에서 사전 내부의 파일을 별도로 볼 수 있다.
설치방법은 아래와 같다
./bin/elasticsearch-plugin install https://github.com/javacafe-procect/elasticc-book-etc/raw/master/plugin/elasticsearch-analysis-openkoreantext-6.4.3.0-plugin.zip
사전 추가
기본 제공되는 사전 외의 단어를 사용자가 직접 추가 가능. 한줄 단위로 처리되며, plugins/elasticsearch-analysis-openkoreantext/dic 디렉토리 안에 넣으면 됨.
인덱스 설정
플러그인 컴포넌트는 Character Filter, Token Filter, Analyzer로 구성되어 있으며, 필요에 따라 구성해 사용한다.
- Character Filter : 구어체를 표준화한다. ex) 안됔ㅋㅋㅋ --> 안돼ㅋㅋㅋ
- Tokenizer : 문장을 토큰화한다. (한국어를 처리하는 예시입니다 --> 한국어를,처리,하는,예시,입니다,ㅋㅋㅋ)
- Token Filter
- openkoreantext-stemmer : 형용사, 동사를 스테밍한다(새로운 스테밍을 추가했었다 --> 새롭다, 스테밍, 을, 추가하다)
- openkoreantext-redundant-filter : 접속사, 공백 조사, 마침표 등을 제거 --> 그리고 이것은 예시, 또는 예로써, 한국어를 처리하기 --> 예시,예,한국어,처리,하다
- openkoreantext-phrase-editor : 어구 추출 (한국어를 처리하는 예시입니다 ㅋㅋ -> 한국어,처리,예시,처리하는예시)
사용시에는 똑같이 Analyzer에 openkoreantext-analyzer를 명시해 사용하면 된다.
검색결과 하이라이트하기
문서 검색 결과를 웹상에서 출력할때 입력한 검색어를 강조함으로써, 시각적으로 사용자가 어느 부근을 확인해야하는지 손쉽게 확인할 수 있도록 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
PUT test_highlighting/_doc/1
{
"title":"Harry Potter and the Deathly Hallows"
}
POST test_highlighting/_search
{
"query": {
"match": {
"title": {
"query":"harry"
}
}
},
"highlight": {
"fields": {
"title": {}
}
}
}
|
cs |
위와 같이 테스트 하게 되면, 검색어가 일치하는 Haary 라는 단어를 <em> 태그로 감싼 결과를 확인 가능하다.
em 태그가 아닌 별도 태그도 이용 가능하다. 태그 쪽의 pre_tags, post_tags 항목을 수정하여 반영하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
POST test_highlighting/_search
{
"query": {
"match": {
"title": {
"query":"harry"
}
}
},
"highlight": {
"fields": {
"title": {}
},
"post_tags": ["</strong>"],
"pre_tags": ["<strong>"]
}
}
|
cs |
스크립트를 이용해 동적으로 필드 추가하기
스크립팅 : 사용자가 스크립트를 이용해 특정 로직을 삽인하는 것으로, 두개 필드를 하나로 합하거나, 계산된 스코어를 특정 수식으로 재계산하는 작업이 가능.
위 스크립팅 기능을 이용해, 필드 추가나 제거 등 다양한 스크립팅이 가능하다.(필드 추가나 제거 등)
필드 추가는 ctx._source.인덱스이름.필드이름 = 값; 으로 작업 가능하며,
필드 제거는 ctx._source.인덱스이름.remove(필드이름) 을 통해 작업 가능하다.
별칭을 이용해 항상 최신 인덱스 유지하기
엘라스틱서치 클러스터를 운영하는 도중, 매핑 설저잉 변경되거나 인덱스가 깨진다면, 기존 생성된 인덱스를 삭제하고 다시 생성해야 한다.
운영중인 인덱스를 삭제하면 장애가 발생할 수 있으므로, 별칭 기능을 이용해 장애가 일어나지 않도록 작업이 가능하다. 또한 인덱스 별칭을 이용하면, 두 개 이상의 인덱스를 검색해야 할 때 한번의 요청만으로 모두 검색하도록 만들 수 있다.
실제 운영중 인덱스에 문제가 생기는 경우가 많아, 이 내용은 큰 도움이 될 것으로 보인다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 인덱스 복사
POST _reindex
{
"source": {
"index": "test_highlighting"
},
"dest": {
"index": "test_highlighting_2nd"
}
}
# 인덱스 별칭 등록
POST _aliases
{
"actions": [
{"add": {"index": "test_highlighting", "alias":"highlighting"}},
{"add": {"index": "test_highlighting_2nd", "alias":"highlighting"}}
]
}
# 검색 테스트
POST highlighting/_search
{}
|
cs |
매일 생성되는 인덱스를 지속적으로검색하기 위해 사용할때 활용하면 효과적이다.
스냅숏을 이용한 백업과 복구
클러스터를 물리적으로 백업할 수있다. 물리 위치 디렉토리를 생성하고 이에 _snapshot 명령을 이용해 진행할 수 있다.
1
2
3
4
5
6
7
8
9
|
PUT _snapshot/test_highlighting
{
"type":"fs",
"settings": {
"location": "/home/path/test",
"compress":true
}
}
|
cs |
위 명령을 통해 레포지터리를 생성한다.
리포지토리는 스냅샷을 저장하는 논리적인 공간으로, 물리적으로 설정된 디렉토리 내부만 설정할 수 있다. 그리고 다양한 설정값을 지정할 수 있는데, 이부분은 아래 표를 참조하면 된다.
location | 스냅숏의 저장 경로 설정 |
compress | 스냅숏 생성시 압축을 수행한다. 데이터는 압축되지 않으며, 메타데이터만 압축 대상이다. |
chunk_size | 생성되는 파일을 특정 크기로 나누어 생성할 수 있다. 기본값은 1개이다. |
max_restore_bytes_per_sec | 스냅숏 복원시 속도를 설정한다. 기본값은 초당 40MB |
max_snapshot_bytes_per_sec | 스냅숏 복원시 속도를 설정한다. 기본값은 초당 40MB |
readonly | 리포지토리를 읽기 전용으로 생성한다. |
리포지토리가 정상적으로 생성되고 나면 스냅숏을 생성한다.
1
2
3
4
5
6
7
8
|
PUT _snapshot/test_highlighting/test_highlighting_part1?wait_for_completion=true
{
"indices": "test_highlighting",
"ignore_unavailable": true,
"include_global_state": false
}
|
cs |
기본적으로 스냅숏 대상은 더이상 변경이 없어야한다(즉, 라이브환경(데이터 부어넣는 환경))에서 진행하면 문제가 발생할 가능성이 크다.
스냅숏 생성시, 스냅숏 이름은 유일한 값이여야 하며, 이미 존재하면 오류를 리턴한다.
복구는 아래 명령어를 통해 진행할 수 있다.
POST _snapshot/test_highlighting/test_highlighting_part1/_restore
위와 같이 수행하게 되면, test_highlighting_part1 이름으로 백업된 test_highlighting 인덱스가 복구된다.
복구할때, 복구하려는 인덱스와 동일한 이름의 인덱스가 존재해서는 안된다. 그렇게 된다면 에러가 발생하므로 복원 테스트를 수행할때는 기존 인덱스는 삭제하거나 reindex후 테스트를 진행하면 된다.
백업된 스냅숏은 아래의 명령을 통해 삭제 가능하다.
DELETE _snapshot/test_highlighting/test_highlighting_part1
출처 : 엘라스틱서치실무가이드
'IT etc.' 카테고리의 다른 글
ElasticSearch 아키텍처(2)- 토크나이저와 토큰 필터 (0) | 2020.04.14 |
---|---|
레디스(REDIS) 5.X 버전 설치 (우분투, Ubuntu) (0) | 2020.04.08 |
Elasticsearch 분석기 개요 (2) | 2020.04.07 |
redis-sentinel 소개 및 설정(설치 추가) (0) | 2017.12.13 |