이번 시리즈는 회사에서 검색 기능을 만들기 위해 엘라스틱서치를 알아보며 작성하고 있다.
AWS의 엘라스틱서치에는 기본적으로 은전한닢이 설치되어 있다고 한다.
https://aws.amazon.com/ko/blogs/korea/amazon-elasticsearch-service-now-supports-korean-language-plugin/
하지만 위의 링크는 정말 최소한의 예시만 들어줬을 뿐, 실제로 사용하려면 좀 더 많은 설정값이 들어가야 한다.
일단 설치가 되어있을 뿐이지 사용하려면 인덱스에 어느 필드가 한국어인지 설정해줘야 사용할 수 있다.
PUT /brands_v1.0.0
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"korean": {
"type": "custom",
"tokenizer": "seunjeon"
}
},
"tokenizer": {
"seunjeon": {
"user_words": ["캐구", "골구", "맥퀸"],
"index_eojeol": "true",
"index_poses": [
"UNK",
"EP",
"I",
"J",
"M",
"N",
"SL",
"SH",
"SN",
"VCP",
"XP",
"XS",
"XR"
],
"decompound": "true",
"type": "seunjeon_tokenizer"
}
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "korean"
},
"id": {
"type": "integer"
}
}
}
}
'캐구' 라는 단어를 인덱스를 만들 때 settings 안에 'user_words' 라는 필드 안에 넣어둬서 명사로 인식한다.
user_words 필드가 사용자 사전과 매칭되는 필드인데, 기존에 존재하지 않는 단어이거나 왠지 없을 것 같으면 저기에 추가해두면 된다.
만약 사용자 사전을 추가해야 되면 어떻게 해야될까?
_settings를 변경하기 위해 PUT 요청을 보내면 실패하는데?
_mappings를 변경하려면 인덱스를 close 하고 나서 open 해야 하는데?
검색해보면 인덱스를 삭제하고 다시 만들어야 한다고 하는데 그 방법 뿐인걸까?
https://www.elastic.co/kr/blog/changing-mapping-with-zero-downtime
찾다보니 위 링크에서 답을 얻었다.
방법은
번거롭긴 하지만 다운타임이 없이 _settings 와 _mappings 를 수정할 수 있었다.
삭제하고 다시 만들어서 그 시간동안 다운타임이 생기는 것 보다는 훨씬 낫다.
만약 새로운 인덱스에 _reindex 를 통해 밀어넣다가 위 에러를 만나면 아래 옵션을 사용해서 해결할 수 있다.
아래 설정이 적용되려면 시간이 조금 걸리기 때문에 해두고 5분정도 쉬다 와서 다음 작업을 하는걸 추천한다.