은전한닢을 인덱스에 세팅해보자

3
post-thumbnail

서문

이번 시리즈는 회사에서 검색 기능을 만들기 위해 엘라스틱서치를 알아보며 작성하고 있다.


은전한닢

AWS 엘라스틱서치

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"
            }
        }
    }
}

검색어가 어떻게 인식되는지 확인해보기

쿼리

응답

사용자 사전 user_words

'캐구' 라는 단어를 인덱스를 만들 때 settings 안에 'user_words' 라는 필드 안에 넣어둬서 명사로 인식한다.

user_words 필드가 사용자 사전과 매칭되는 필드인데, 기존에 존재하지 않는 단어이거나 왠지 없을 것 같으면 저기에 추가해두면 된다.

만약 사용자 사전을 추가해야 되면 어떻게 해야될까?
_settings를 변경하기 위해 PUT 요청을 보내면 실패하는데?
_mappings를 변경하려면 인덱스를 close 하고 나서 open 해야 하는데?
검색해보면 인덱스를 삭제하고 다시 만들어야 한다고 하는데 그 방법 뿐인걸까?

_settings, _mappings 수정하기

https://www.elastic.co/kr/blog/changing-mapping-with-zero-downtime

찾다보니 위 링크에서 답을 얻었다.

방법은

  • 새로운 인덱스를 만든 뒤에
  • 거기에 데이터를 밀어넣는다

  • _aliases 를 세팅한다

  • 그 후 기존 인덱스를 삭제한다.

번거롭긴 하지만 다운타임이 없이 _settings 와 _mappings 를 수정할 수 있었다.
삭제하고 다시 만들어서 그 시간동안 다운타임이 생기는 것 보다는 훨씬 낫다.

cluster_block_exception

만약 새로운 인덱스에 _reindex 를 통해 밀어넣다가 위 에러를 만나면 아래 옵션을 사용해서 해결할 수 있다.
아래 설정이 적용되려면 시간이 조금 걸리기 때문에 해두고 5분정도 쉬다 와서 다음 작업을 하는걸 추천한다.

profile
지상 최강의 개발자 쥬니니

0개의 댓글