728x90

안녕하세요, 오늘은 엘라스틱서치에서 클러스터간의 검색을 알아보려고합니다. 

 

전제 조건 

  • 클러스터간 검색에는 원격 클러스터가 필요합니다. 
  • 로컬 조정 노드에서 cluster_remote_client 노드 역할이 필요합니다. 
  • cluster_remote_{remote이름}.seeds:["192.168.0.201:9200"]

서버 43번 Elasticsearch.yml 에 추가할 내용

node.roles:[master,remote_cluster_client]

search.remote.connect:true

Cluster_remote_named.seeds:["192.168.0.201:9200"]

 

서버 46번 Elasticsearch.yml 에 추가할 내용

search.remote.connect:true

Cluster_remote_named.seeds:["192.168.0.201:9200"]

 

서버 201번 변경 사항 없음

 

키바나에서 확인 

GET /_remote/info 

클러스터간 검색

검색의 조건 : remote 의 클러스터를 검색할때는 클러스터 이름을 붙이고 인덱스 명을 붙여줘야합니다. 

ex) cluster_remote_1:index명

43,46서버와 201서버를 동시 검색했을때

자바에서 검색을 할때는 저는 멀티서치 api를 사용했는데 혹시 다른 방법이 있으면 알려주세요

당연히 아시겠지만 201서버가 끊길경우 43번 201서버를 검색하면 검색 자체가 안되는 에러가 발생합니다. 

 

728x90
728x90

안녕하세요~! 오늘은 Elasticsearch 백업/복원에 대해서 설명하도록 하겠습니다. 

엘라스틱서치 버전 : 7.12.0 

확인 : Multi-search Head

요건: 

현 서버에서 백업서버로 백업파일 옮길때의 방법과 궁금증

2개의 서버에 각각 마스터가 할당이 되어있기때문에 한개의 서버에서 백업을 실행하고 복원서버에 넣는경우

어떠한 일이 벌어지는지에 대한 궁금증

먼저 기존에서 쓰고 있던 IP 43,46에 파일을 백업을 시켜 201서버로 옮기려고합니다.

 

다른 서버인 201 서버에 마스터 그리고 M/D 형태로 만들었습니다.



 

각각의 백업 리포지토리를 생산해 주었습니다. 동일한 이름으로 되어있어서 좀더 이해하기 편할거같습니다. 

 

일단 43/46 서버를 백업해보려고합니다.

백업 방법  순서 : 1) 리포지토리 생성 --> 2) 스냅샷 생성 --> 3) 생성한 스냅샷 복원

위에 순서에서 201 서버로 보내려면 추가 작업이 필요합니다. 

추가된 백업 방법 순서 : 1) 리포지토리 생성 --> 2) 스냅샷 생성 --> 3) 리포지토리 생성된 경로에서 파일 tar 로 압축

--> 4) scp 이용 서버간 파일 보내기 5) 201서버에서 압축풀고 리포지토리 생성 6) 43/46서버에서 생성된 스냅샷 이름으로 복원

 

위에 6가지 step으로 진행하겠습니다. 

 

1. 먼저 43/46서버에서 리포지토리 생성을 합니다. 

curl -X PUT "본인경로:본인포트번호/_snapshot/생성할리포지토리이름" -H 'Content-Type: application/json' -d'
{
  "type": "fs",
  "settings": {
    "compress": true,
    "location": "/home/nurier/es7-1/backup/BackupFile"
  }
}
'

location에는 실제로 백업파일이 들어갈 경로를 적어주셔야합니다. 
또한 엘라스틱서치에서는 type으로 파일시스템 (fs) 외에 아마존,마소,하둡 파일시스템 저장장소를 택할수도있습니다.

스냅샷이 생성 되어있는지 확인 할수 있는 코드
curl -XGET '본인경로:본인포트/_snapshot/_all?pretty

2. 스냅샷을 생성합니다.

curl -X PUT "본인경로:본인포트/_snapshot/생성된리포지토리이름/스냅샷이름?wait_for_completion=true&pretty" -H 'Content-Type: application/json' -d'
{
  "indices": "nacf_2023.02.24",
  "ignore_unavailable": true,
  "include_global_state": false
}
'

indices 에는 백업할 인덱스의 이름을 적습니다. * 표시로 모든 인덱스를 넣어주실수도 있습니다. 
include_global_state 는  Elasticsearch가 스냅샷 또는 복원과 함께 글로벌 클러스터 상태를 포함해야 하느지
여부를 결정합니다.

ignore_unavailable이 ture 되어있고 인덱스가 없으면 스냅샷 요청이 실패합니다. 
큐레이터는 존재하는 인덱스만 찾아야 하므로 이는 자주 문제가 되지 않습니다.

3-4. 생성된 리포지토리 tar로 압축하고 다른 서버로 보내기

기존에 백업파일이 없다는 가정하에 원하는 파일만 백업했고 보내는 형태입니다. 혹여나 다른 백업파일들이 존재하고 그 안에 원하는 값만 압축해서 scp 를 사용해서 다른 서버로 보내고 싶으시면 백업리포지토리 경로를 추가하여서 다른곳에 백업을 하시는 방법을 권해드립니다.

백업리포지토리 추가는 config/elasticsearch.yml에서 path.repo : 경로에 ,기준으로 추가하시면 추가가 됩니다. 

 

tar로 압축하기 명령어 
최종 경로 BackupFile을 backup.tar이름으로 압축하려고할때 
tar -cvf backup.tar BackupFile

tar로 압축 풀기 
201서버에서 파일을받았을때 압축풀기 
tar -xvf backup.tar 

scp로 다른 서버로 보내는 방법 user이름은 파일을 받을 원격서버 id@원격서버주소:/~받은파일경로/
scp -r /경로~/파일이름 user이름@127.0.0.1:/파일받을 경로/

혹시 전송시간이 길어지거나 파일 전송이 끝나기전에 자리를 비울경우 nohup 명령을 같이 써주면 전송중에 로그아웃을 해도 
전송이 끊기지 않습니다. 
nohup scp -rpc ./* 서버IP@원격주소:/파일 받을 경로

5. 201서버에서 백업 리포지토리를 생성해줍니다. 

curl -X PUT "본인경로:본인포트번호/_snapshot/생성할리포지토리이름" -H 'Content-Type: application/json' -d'
{
  "type": "fs",
  "settings": {
    "compress": true,
    "location": "/home/nurier/es7-1/backup/BackupFile"
  }
}
'
리포지토리 생성되었는지 확인
curl -XGET '본인경로:본인포트/_snapshot/_all?pretty

6.

1) 201서버에서 43/46서버에서 받은 tar 파일을 풀어줍니다.

2) 그 후 리포지토리를 생성해줍니다.

3) 43번서버에서 만든 스냅샷 이름을  똑같이 사용하여 복원을 해줍니다.

curl -XPOST "http://192.168.0.201:9210/_snapshot/bp/43번과동일한스냅샷이름/_restore" -H 'Content-Type: application/json' -d'
{
  "indices": "*",
  "ignore_unavailable": true,
  "include_global_state": false
}'

 

복구를 할때의 문제점이 있습니다. 201서버에서 현재 존재하는 인덱스의 명의 이름과 43서버에서 복구할때 가지고 있던 인덱스의 이름이 같다면 충돌로 복구가 되지 않습니다 이러한 상황일때는 재인덱싱을 통해서 인덱스의 이름을 변경후에 다시 진행해줘야합니다. 

또한 43번과 46번 서버의 그림을 보시면 샤드의 분배가 2개 1개씩 되어있는것을 보실수있습니다. 

그래서 43번과 46번의 압축된 파일을 201서버에 풀고 난후 샤드의 개수가 더 많은 서버의 스냅샷 이름으로

저는 복구를 하였습니다.

그렇게 했더니 데이터수가 다 복구 되었습니다. 만약 46번의 서버에 샤드수가 2개 인 상황에서 46번 서버만 복구할경우 총 데이터 수의 2/3만 복구 되는것을 보실수 있을겁니다. 

 

그래서 저는 처음부터 복구를 할때 2개의 파일을 푼 후 리포지토리를 생성 후 샤드 수를 더 많이 배분 받은 46번서버의 스냅샷이름으로 복구합니다. 43번서버로 복구를 하게되면 

이러한 오류 구문을 받게됩니다.

(해당 오류 메시지는 스냅샷을 복구하는 동안 인덱스의 일부 데이터가 누락되었거나 손상되었다는 것을 나타냅니다. 이 경우, 스냅샷을 복구할 수 없습니다.

 

2개 서버의 파일을 한곳에 넣어 복구를 하게되면 

잘 복구가 되는것을 보실수 있습니다. 아마도 43서버에서는 불안정한 파일이 백업되어서 저런 오류가 나오는거같습니다. 

728x90

'Elasticsearch' 카테고리의 다른 글

Elasticsearch - node repurpose tool to clean up  (1) 2023.02.27
elasticsearch 클러스터간 검색  (0) 2023.02.25
엘라스틱서치 - BULK  (0) 2022.10.06
엘라스틱서치의 기본요소  (0) 2022.10.05
엘라스틱서치 - 분석기  (0) 2022.09.26
728x90

엘라스틱서치에서는 crud 형태로 데이터 값을 하나하나 도큐먼트의 넣는 방식보다 bulk로 한번에 요청하는 것이 효율적입니다. 

bulk API는 도큐먼트 읽기는 지원하지 않고 도큐먼트 생성/수정/삭제만 지원합니다. 

bulk 데이터 삭제는 한줄로 작성하고 나머지 작업들은 두줄로 작성이 됩니다. 각 줄 사이에는 쉼표 등 별도의 구분자가 없고 라인 사이 공백을 허용하지 않는다 또한 JSON 문법 처럼 보이지만 복수의 JSON 구조를 줄바꿈 문자열로 구분하는 NDJSON형태입니다. json과 비슷하지만 문법이 조금 다르니 라인이나 쉼표 사용에 주의해야합니다. 

 

 

벌크 데이터를 파일 형태로 만들어서 적용하는 방법도 있다 실제 현업에서는 파일로 만들어서 사용하는 방식이 더 실용적입니다. (키바나 콘솔에서는 파일 불러오기를 할 수 없습니다)

 

 

 

728x90
728x90

엘라스틱서치의 모든 기능은 REST API 형태입니다.

REST 란 웹상의 모든 리소스에 URI를 부여하고 활용하는 아키텍쳐입니다,또한 이것을 도입하면 모든 리소스를 일관된 규칙으로 접근할 수 있어 Application을 모듈이나 기능별로 분리하기 쉬워집니다.

더보기

REST API 는 REpresentational State Transfer 의 약자로 웹(HTTP)의 장점을 이용해 리소스를 주고받는 형태이며, REST API는 REST 기반으로 API를 서비스하는 것을 의미합니다. 메소드와 경로가 합쳐진 형태이고 4가지 메소드를 표현할수 있습니다. 

POST GET PUT DELETE (CRUD)라고도 흔히 알고 있습니다. 다시 말하면 네 가지 메소드 타입을 가지고 리소소의 CRUD(생성/읽기/수정/삭제) 작업을 진행하고 URI 는 리소스를 명시하는 방법입니다. 즉 URI로 리소스를 정의하고 메소드와 함꼐 서버에 요청하고 응답을 받는 구조입니다. 


인덱스와 도큐먼트

엘라스틱서치에서는 인덱스와 도큐먼트가 매우 중요합니다. 그 이유인즉슨, 인덱스는 도큐먼트를 저장하는 논리적 구분자이고, 도큐먼트는 실제 데이터를 저장하는 단위를 뜻합니다.  대부분 ELK를 이용해 시스템을 개발하면 하나의 클러스터를 사용하며, 클러스터 내부는 데이터의 성격에 따라 여러 개의 인덱스를 생성합니다. 

도큐먼트 

데이터가 저장되는 기본 단위로 JSON 형태입니다. 

하나의 도큐먼트는 여러 필드(field)와 값(value)를 갖습니다. 

관계형 데이터베이스와 엘라스틱서치의 데이터 저장 방식을 비교 하여 좀 더 이해하기 쉽게 설명해 드리겠습니다. 

 

일단 기본적으로 MySQL 에서 데이터를 생성하고 저장하는 방식은 이러합니다. 

테이블을 생성하고 쿼리문을 이용해 데이터를 저장합니다. 

하지만 JSON 형식의 도큐먼트 파일은 

{

"name":"mateo",

"age":25,

"gender":"female"

}

즉 위 name,age,gender를 필드라고 하고 : 뒤에 것을 값이라고 합니다.  엘라스틱서치에서는 매핑을 통해서 데이터의 타입을 지정할 수 있습니다.  7버전 이후로는 MySQL과 달라졌습니다 하지만 처음 접하는 분들을 위해 조금 쉽게 설명하고자 인용을 했습니다.

MySQL ELK
테이블 인덱스
레코드 도큐먼트
컬럼 필드
스키마 매핑

 

인덱스

인덱스는 도큐먼트를 저장하는 논리적 단위로, 관계형 데이터베이스의 테이블과 유사한 개념입니다. 

하나의 인덱스에 여러개의 도큐먼트들을 가지는 구조 형태 입니다. 

동일한 인덱스 안에 도큐먼트는 동일한 스키마를 가집니다. 

 

인덱스 이름에는 영어 소문자,/,\,*,?,",<,>,|,#, 공백 쉼표 등을 제외한 특수문자를 사용할수 있고 255바이트를 넘을 순 없습니다.

스키마에 따라 그룹핑을 달리합니다. 일반적으로 스키마에 따라 인덱스를 구분을 합니다.

예를 들어)

회원 정보 도큐먼트와 장바구니 도큐먼트는 성격이 다르기 때문에 데이터 스키마도 다릅니다. 

회원 정보에는 나이 이름 번호 등이 들어가지만 장바구니에는 상품명 상품세일 날짜 등이 들어가기 때문입니다. 

 

인덱스는 용량이나 숫자 제한없이 도큐먼트를 가질수 있지만 검색시 처리 속도가 현저히 느려져서 성능이 나빠집니다. 

그래서 하나의 약속 처럼 엘라스틱에서는 용량을 제한을 둡니다. 기본적으로 특정 도큐먼트 개수에 도달하거나 특정 용량을 넘어서면 인덱스를 분리합니다.( 혹은 날짜 년도, 특정 주기를 통해 분리 삭제 합니다. ) 

 

 

도큐먼트 CRUD

ELK 에 도큐먼트를 저장하고 읽어오고 수정하고 삭제 하기에 대해 알아보도록하자. 

되게 간단합니다. PUT index1 GET index1  DELETE index1 의 입력를 해주면 생성하고 가져오고 삭제시켜줍니다. 

 

도큐먼트의 생성  : 도큐먼트는 하나의 인덱스를 무조건 포함 시켜야합니다. 

도큐먼트를 인덱스에 포함 시키는것을 인덱싱이라고 합니다. 

 

도큐먼트 인덱싱할때 타입을 지정하지 않아도 자동으로 엘라스틱서치에서 자동으로 타입을 지정해줍니다.

또한 인덱스에 새로운 도큐먼트를 인덱싱할 수 있다.

PUT index1/_doc/2

{

"name":"jane",

"country":"korea"

}

여기서는 나라 라는 이름의 필드를 추가하였습니다.

기존에 있던 다른 필드는 사용하지 않았습니다(age,gender) 그래도 큰 문제는 없습니다. 

엘라스틱서치의 장점으로 타입을 잘못 적더라도 스키마에서 유연하게 대응하여 타입을 변환해 줍니다. 

float으로 저장한것을 text로 저장해도 float로 다시 타입변환을 하여 저장해줍니다. 

예) 숫자 필드에 문자열이 입력되면 숫자로 변환을 시도합니다 .

정수 필드에 소수가 입력되면 소수점 아래 자리를 무시합니다.

 

도큐먼트 읽기/수정/삭제

도큐먼트를 읽는 방법은 크게 도큐먼트 아이디를 이용해 조회 하는 방법과 쿼리DSL이라는 엘라스틱서치가 제공하는 쿼리문을 이용하여 검색할수 있습니다.

아이디를 이용하는 방법 : GET index2/_doc/1 

쿼리문을 이용한 방법 : GET index2/_search

 

수정 방법:PUT index2/_doc/1 안에 필드  값(value)를 변경해주면 값이 변경 됩니다. 

그저 도큐먼트를 인덱싱 하는 과정에서 같은 도큐먼트 아이디가 있으면 덮어쓰기 형식입니다. 

update API를 사용하여 도큐먼트를 업데이트 할 수 있습니다.

PUT index2/_update/1

{

  "doc":{

     "name":"eom"

    }

}

 

_update 라는 에드포인트를 추가해 특정 필드의 값만 업데이트 할 수 있습니다.

ELK에서 수정 작업은 비용이 많이 드는 작업이라서 추천하지 않습니다. 

 

도큐먼트 삭제 :  DELETE index2/_doc/2 하시면 index2 인덱스에서 아이디 2인 도큐먼트가 삭제됩니다. 서치를 통해 인덱스의 전체 도큐먼트를 파악한 후 삭제 하셔도 괜찮습니다. 별개로 수정과 마찬가지로 삭제 또한 비용이 많이 들어가는 작업입니다. 사용 시에 주의해야 한다. 

728x90
728x90

엘라스틱서치

전문 검색을 지원하기 위해 역인덱싱() 기술을 사용한다. 

전문 검색은 긴 문장의 String에서 부분 검색해서(SQL에 Like처럼) 수행하고, 역인덱싱은 긴 문장의 문자열을 분석해 

작은 단위로 쪼개어 인덱싱 하는 기술이다(대표적으로 구글에서 역인덱싱을 사용) . 

역인덱싱을 이용한 전문 검색에서 양질의 결과를 얻기 위해서는 문자열을 나누는 기준이 중요하며, 이를 지원하기 위해 

엘라스틱은 3가지) 캐릭터 필터 , 토크나이저, 토큰 필터로 구성되어 있는 분석기 모듈을 갖고있습니다. 


토큰과 용어

더보기

토큰(Token)과 용어(term)라는 단어는 엘라스틱에서 많이 사용 될 단어이자 헷갈릴수 있는 단어 이다보니, 여기서 짧게나마 용어를 정의하고 넘어가자. 

 

예를 들어서 'noodle hot' 라는 문자열이 분석기를 거쳐서 인덱스에 저장된다고 가정할때, 분석기는 먼저 캐릭터 필터를 통해 원문에 불필요한 문자들을 제거한다(The, a, you)등등.... 이 과정에선 문자열 자체가 분리가 되지는 않는다. 

토크나이저를 통해서 문자열이 필터링 되고 이때, 짤린 단어들은 토큰이라고 지칭한다('noodle','hot'). 이러한 토큰들은 복수의 토큰 필터를 거치며 정제되는데, 정제 후 최종으로 역인덱스에 저장되는 상태의 토큰들을 용어(term)이라고한다. (인덱스안에 2개의 다른 단어로 존재하게된다.)

토큰은 분석기 내부에서 일시적으로 존재하는 상태이고, 인덱싱되어 있는 단위, 또 검색에 사용되는 단위는 모두 용어라고 할 수 있다. 

분석기 구성

구성요소 설명
캐릭터 필터 입력받은 문자열을 변경하거나 불필요한 문자들을 제거한다.
토크나이저 문자열을 토큰으로 분리한다. 분리할 때 토큰의 순서나 시작, 끝 위치도 기록한다. 
토큰 필터 분리된 토큰들의 필터 작업을 한다. 대소문자 구분, 형태소 분석 등의 작업이 가능하다.
  • 캐릭터 필터 : 문자열의 전처리 작업
  • 토크나이저 : 문자열을 토큰으로 분리
  • 토큰 필터 : 분리된 문자열의 단어들이 필터를 거쳐 최종적으로 용어가 된다. 

예) [가위 바위 보] 를 통해서 필터링하고 토크나이저를 하면 [가위][바위][보] 로 필터가 되어 인덱싱 되어 검색에 활용하게된다. 가위를 입력해도 [가위 바위 보] 를 출력 할 수 있다. 


역인덱싱이란? 

역 인덱싱이란 무엇일까?  -  문자열을 토큰화하고 이를 인덱싱하는데 이 것을 역 인덱싱이라고 부릅니다. 

많이 쓰이는 단어들을 선별해 그 단어가 몇 페이지에 나와 있는지 알려주는 것을 색인이라고 한다.

주로 책에 맨 뒷 페이지에 나와있는 경우가 많다. 

 

문서가 분석기를 거치면서 역인뎅싱 되고 있다. 분석기는 여러 필터와 토크나이저르 이뤄져 있는데 여기서는 스탠다느 토크나이저와 스톱필터, 소문자 변경필터, 스테이머 필터가 조홥된 분석기를 사용했다. 

예를 들면 digital 이라고 치면 2,4,8의 문서에서 값을 찾아올수 있다. 

 


분석기 API 

엘라스틱 서치는 필터와 토크나이저를 테스트해볼 수 있는 analyze라는 이름의 REST API를 제공하고있다.

자세한 내용은 (https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html)에서 참고하시면 될거같습니다. 

 

analyze API 사용법으 간단하다. analyzer에 원하는 분석기를 선택하고, text에 분석할 문자열을 입력하면 된다. 참고로, 스톱분석기는 소문자 변경 토크나이저와 스톱토큰 필터로 구성되어 있다. 

 

예를 들어 the 10 most loving dog breed문장을 토큰화 하면 결과는 밑에 처럼 나온다.

{
	"token":[
    	{"token":"most",......},
    	{"token":"loving",......},
    	{"token":"dog",......},
    	{"token":"breed",......},
       ]

}

자 이제 분석기는 어떤식으로 토큰으로 분리하는지 알아봅시다. 

 

분석기 종류

엘라스틱서치는 다양한 분석기를 제공합니다. 자주 사용되는 분석기는 standard,simple,whitespace,stop 이 있습니다. 

분석기 설명
standard 특별한 설정이 없으면 엘라스틱서치가 기본적으로 사용하는 분석기이다. 영문법을 기준으로 한 스탠다드 토크나이저와 소문자 변경필터, 스톱필터가 포함되어 있다.
[the,10, most,loving,dog,breeds]
simple 문자만 토근화한다. 공백 숫자,하이픈(-)이나 작은따옴표(')같은 문자는 토큰화하지 않는다. 
[the,most,loving,dog,breeds]
whitespace 공백을 기준으로 구분하여 토큰화한다.
[The,10,most,loving,dog,breeds]
stop simple 분석기와 비슷하지만 스톱 필터가 포함되어 있다. 스톱 필터의 의해 'the'가 제거 된다.
[most,loving,dog,breeds]

 

 

토크나이저 

앞서 분석기는 반드시 하나의 토크나이저를 포함해야 한다고 설명했스빈다. 토크나이저는 문자열을 분히해 토큰화하는 역할을 합니다, 반드시 포함돼야 하기 때문에 형태에 맞는 토크나이저 선택이 가장 중요합니다. 

 

대표적인 토크나이저를 알아보자.

토크나이저 설명
standard 스댄다드 분석기가 사용하는 토크나이저로, 특별한 설정이 없으면 기본 토크나이저로 사용된다. 쉼표나 점 같은 기호를 제거하며 텍스트 기반으로 토큰화한다.
lowercase 텍스트기반으로 토큰화하며 모든 문자를 소문자로 변경해 토큰화한다
ngram 원문으로부터 b개의 연속된 글자 단위를 모두 토큰화한다. 예를들어 '엘라스틱서치' 를 [엘라,라스.스틱,틱서,서치]와 같이 연속된 두 글자를 모두 추출합니다. 사실상 원문으로부터 검색할 수있는 거의 모든 조합을 얻어낼수 있기 때문에 정밀한 부분 검색에 감정이 있지만, 토크나이징을 수행한 n개 이하의 글자 수로는 검색이 불가능하며 모든 조합을 추출하기 때문에 저정공간을 많이 차지 한다는 단점이 있다.
uax_url_email 스탠다느 분석기와 비슷하지만 URL이나 이메일을 토큰화하는데 강점이 있다. 
   

 

 

다양한 토크나이저를 확인하는 곳: (https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html)

 

 

필터 

분석기는 하나의 토크나이저와 다수의 필터로 조합된다. 

필터는 옵션으로 하나 이상을 포함할 수 있지만, 없어도 분석기를 돌리는 데 큰 문제는 없다. 

대부분 엘라스틱에서 제공하는 분석기들은 하나 이상의 필터를 포함하고 있다 

그 이유는 필터를 통해 더 세부적인 작업이 가능하기 때문입니다. 

 

필터는 단독으로 사용할 수 없고 반드시 토크나이저가 있어야 한다.

 

캐릭터 필터

 

토크나이저 전에 위치하며 문자들을 전처리하는 역할을 하는데 HTML 문법을 제거/변경하거나 특정 문자가 왔을 때 다른 문자로 대체하는 일들을 한다. 예를들어 html 에서 공백이 오면 바꾸는 작업 등을 캐릭터 필터에서 진행하면 엄청 편하다. 

캐릭터 필터를 사용하기 위해서는 커스텀 분석기를 만들어 사용하는것이 좋다. 

 

토큰 필터 

토크나이저에 의해 토큰화되어 잇는 문자들에 필터를 적용한다. 변경하거나 삭제하고 추가하는 작업이 가능하다.

토큰 필터는 종류가 많고 자주 변경되어서 버전마다 상이 하니 엘라스틱서치 웹페이지에서 확인하는것을 추천드립니다.

 

토큰필터에서 스탑필터는 주로 제거하는데 사용합니다. 크게 의미없는 'a','the','you' 와 같은 단어를 생각하시면 편할거같습니다. 

 

아쉽게도 stop필터는 영어를 기반으로 하여서 한글에서는 작동이 잘 되지 않습니다. 다른 한글 분석기를 사용하시기 바랍니다.

 

stemmer 필터는 형태소를 분석해 어간을 분석하는 필터다 즉 언어마다 문법이 다르기 때문에 자기가 사용하는 언어에 맞는 필터를 사용해야하고 (영어기반입니다) 예시) live,living,lived 와 같은 단어를 어간이라고 하고 인식을 합니다.

 

커스텀 분석기 와 설정 방법

내장 분석기들 중 원하는 기능을 만족하는 분석기가 없을때 사용자가 직접 토크나이저 필터 등을 조합해서 사용할수 있는 분석기 입니다. 

예를 들어 새로운 인덱스르 ㄹ하나 만들고 설정에 analysis파라미터를 추가하고 그 밑에 필터와 분석기를 만든다. 

분석기 이름을 지정하고 타입은 custom 으로 지정하면 커스텀분석기를 의마한다. 

분석기에는 반드시 토크나이저가 하나 들어가야 하는데 기본 스탠다드 토크나이저를 사용했고 캐릭터 필터는 사용하지 않았다. 

아까 알게되었던 stop 필터에 값을 하나 넣고  text에 글을 넣으면 stop 필터값 을 제외하고 값들을 알게해줍니다. 

 

 

필터 적용 순서 

분석기에서 필터를 여러 개 사용한다면 필터의 순서에도 주의해야 한다. 필터 배열의 첫번째 순서부터 필터가 적용된다. 가끔 이 순서가 잘못되면 원하지 않는 결과가 나오기도 합니다. 

예를 들면

 filter : ["lowercase","my_stopwords"],
 text : "Cats Lions Dogs"

먼저 필터 첫번째 순서인 lowercase로 하면 Lions 가 lions으로 바뀌면서 내가 지정해놓은 stop필터 lions를 삭제시켜주지만

 

 

filter : ["my_stopwords","lowercase"],
 text : "Cats Lions Dogs"

이렇게 필터에 값을 바꿔버리면 어떻게 될까?

먼저 필터 첫번째 stop필터를 진행하는데 여기서 지정해놓은 lions는 text에 없어서 삭제를 하지 못하고 진행을 하게 됩니다. 값은 cats lions dogs 즉 lions가 문장에 포함되어 값이 나오게 됩니다. 

 

 

 

 

이렇게 분석기에 대해서 알아보았습니다. 너무나 많은 api기능이 있기에 다 적지 못했습니다. 

관련해서 더 많은 정보글을 보고싶으시다면 엘라스틱서치 홈페이지에서 보시면 될거같습니다. 

 

https://www.elastic.co/guide/en/elasticsearch/reference/current/elasticsearch-intro.html

728x90

+ Recent posts