본문 바로가기

컴퓨터/DB

ElasticSearch 인덱스에 동의어 사전 적용하기

동의어 적용은 검색에 있어 사용자에게 wow 및 ai를 활용하는 듯한 느낌을 줄 수 있다.

동의어 적용 자체는 mysql로도 어찌어찌 적용해본 경험은 있으나, DB에 쓸데없는 부하가 있어 ES에 직접 사전을 넣어 동의어 적용을 하는 것이 가장 좋다고 느껴진다.

예를 들어 생로랑과 입생로랑의 경우, 생로랑이 공식단어라 그것만 있을 경우 입생로랑을 검색했을때 생로랑이 뜨지 않을 것이다.(만약 반대조건이라면 생로랑이 입생로랑에 포함되어 상황에 따라 좀더 검색확률이 올라갔을 것이다)

 

현재 나는 AWS의 ElasticSearch Service를 통해 ES를 쓰고 있으므로 이를 기준으로 작성할 것이다. (ver 6.8)

 

예시 사전은 다음과 같다.

dict.txt

생로랑, 입생로랑
구찌, 구지, 구띠

사전이라고 해서 별 거는 아니고, 동의어로 쓰고자 하는 단어들을 한줄에 일렬로 나열하면 된다.

파일 형식은 .txt 파일로 진행한다. 이 때 파일 인코딩은 UTF-8로 진행했다. 

 

AWS ES 에는 동의어나 불용어 사전을 넣을 수 있는 패키지라는 기능이 있다.

여기서 패키지는 사전을 저장하고 인덱스와 연결하는 공간이라고 생각하면 될 것 같다. 

 

사전 파일은 S3에 올려준 후에, 그 파일의 URL을 가지고 ES Service의 패키지에 탑재해 원하는 index에 연결시켜주면 된다. 

헌데 S3에 파일을 올린 후에 S3에서 열어볼 경우 깨져 보일 수 있으나, ES에서 작동은 정상적으로 된다.

 

사전을 index에 연결시켰다고 끝나는 건 아니고, ElasticSearch의 인덱스의 매핑을 바꿔줘야 한다(연결한 사전을 실제로 indx에서 사용하도록). 쉽게 테이블 설정을 바꿀 수 있는 MySQL등과는 달리 ES는 한번 설정한 인덱스 설정을 쉽게 바꿀 수 없고, 인덱스를 새로 만들어 거기에 reindex를 해야 한다.

 

인덱스의 reindex는 데이터는 복사하더라도 매핑을 설정하지 않으면 default 매핑이 적용되기 때문에, 꼭 세팅 및 매핑을 적용해줘야 한다. 세팅에 사전을 포함한 애널라이저를 적용하고, 매핑에서 동의어를 적용하기 원하는 필드에 세팅에서 만든 애널라이저를 적용해줘야 한다.

PUT test_index
{
  "settings": {
    "index": {
      "analysis": {
   "analyzer": {
          "synonym_analyzer": { //동의어 애널라이저 적용
            "type": "custom",
            "tokenizer": "standard", //standard는 띄어쓰기를 기준으로 토큰을 나눈다.
            "filter": ["synonym_filter"] //애널라이저에서 아래의 토큰 필터를 사용한다
          }
        }
        ,
        "filter": { //토큰 필터
          "synonym_filter": {
            "type": "synonym", //동의어 사전임을 알림
            "synonyms_path": "analyzers/F141697201" //패키지에서 연결한 사전명을 가져온다.
          }
        }
      }
    }
  },
      "mappings" : {
      "goods" : {
        "properties" : {
          "search_fields" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            },
            "analyzer": "synonym_analyzer" //동의어를 적용하고자 하는 필드에 애널라이저를 적용한다.
          },
          "season" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }
        }
      }
    }
}

 

그리고 나서 원래 있던 인덱스에서 새 인덱스에 reindex 명령어로 데이터를 옮겨주면 된다. 

그러면 이제 대체 인덱스에서 동의어 적용이 되는 모습을 볼 수 있다. 

 

그러나 이는 대체인덱스에만 적용된 것이므로, 원래 쓰고자 했던 인덱스에 적용하려면 앨리아스를 써서 적용하는 게 편하다.

앨리아스 관련 포스팅은 아래 글에 적혀 있으니 참고.

soo-sin.tistory.com/21

 

참고글

https://docs.aws.amazon.com/ko_kr/elasticsearch-service/latest/developerguide/custom-packages.html

https://wedul.site/618

https://itzone.tistory.com/708

https://jsongsong.tistory.com/34

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

https://findstar.pe.kr/2018/07/07/elasticsearch-reindex/

https://wedul.site/595

https://velog.io/@labyu/Elasticsearch-6

'컴퓨터 > DB' 카테고리의 다른 글

ElasticSearch - index Alias를 활용한 유연한 인덱스 운영  (0) 2020.11.20
MySQL  (0) 2020.09.29
ElasticSearch document update 방법  (0) 2020.09.25