검색엔진/Opensearch

OpenSearch를 활용한 형태소 분석과 중복 단어 제거

Tech쏜 2025. 3. 28. 10:30

 

검색 품질을 높이기 위해서는 텍스트의 정확한 분석이 필수입니다.

특히 한국어는 띄어쓰기만으로 의미를 구분하기 어렵기 때문에 형태소 분석이 중요합니다.

이번 글에서는 OpenSearch의 내장 분석기인 nori_analyzer를 사용하여 형태소 분석과 중복 단어 제거를 효율적으로 처리하는 방법을 소개합니다.


형태소 분석기: Nori Analyzer

Nori Analyzer는 Elasticsearch와 OpenSearch에서 기본 제공하는 한국어 형태소 분석기로, 텍스트를 의미 단위(형태소)로 쪼개줍니다.


1. 중복 단어 제거 필요성

형태소 분석 과정에서 특정 위치에서 중복된 토큰이 생성될 수 있습니다. 예를 들어, 동의어 필터와 함께 사용하면 동일한 의미를 갖는 단어들이 같은 위치에서 중복 생성될 수 있습니다. 이러한 중복 토큰은 검색 정확도를 떨어뜨릴 수 있어 중복 제거 과정이 필요합니다.

2. 설정 방법

다음은 OpenSearch에서 형태소 분석과 중복 단어 제거를 위한 인덱스 설정 예시입니다.

PUT /my-index
{
  "settings": {
    "analysis": {
      "filter": {
        "nori_unique": {
          "type": "unique",
          "only_on_same_position": false
        }
      },
      "analyzer": {
        "nori_custom": {
          "type": "custom",
          "tokenizer": "nori_tokenizer",
          "filter": [
            "lowercase",
            "nori_unique"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "goods": {
        "type": "text",
        "analyzer": "nori_custom"
      }
    }
  }
}
  • nori_tokenizer: 한국어 형태소 분석을 수행합니다.
  • lowercase: 분석된 형태소를 소문자로 변환하여 통일합니다.
  • nori_unique 필터: 동일 위치에서 생성된 중복 토큰을 제거합니다.

 

3. only_on_same_position 옵션의 차이

  • only_on_same_position: true
    • 동일한 위치(offset)에서 발생한 중복 토큰만 제거합니다.
    • 예시 입력: 동의어 확장 후 동일 위치에서 생성된 토큰 "아이폰 애플폰 아이폰"
    • 결과: "아이폰 애플폰"
  • only_on_same_position: false
    • 위치에 관계없이 필드 내 모든 중복된 토큰을 제거합니다.
    • 예시 입력: "아이폰 아이폰 출시 아이폰"
    • 결과: "아이폰 출시"


특히 쇼핑몰과 같이 검색 점수에 민감한 환경에서는 판매자의 키워드 반복 입력으로 인한 비정상적인 점수 왜곡을 방지하여 공정한 검색 환경을 유지하는 데 큰 도움이 됩니다.

 

 

[실습]


위에서 설명한대로 인덱스를 하나 만들었습니다.

아래쪽에 있는 similarity_no_idf 와 norms는 IDF와 문자길이에 대한 점수 영향을  제거하기위한 스크립트입니다.
오늘 실습할 것에는 영향을 미치지 않습니다.

단, 문자의 길이와 IDF로 인한 점수 차이가 발생할 수 있어, 정말 중복 단어가 잘 적용되었는지 점수를 깔끔하게 보여드리기 위해 추가하였습니다.

 

만든 스크립트를 content 필드에 적용시켜 mappings를 만들었습니다.

 

이제 문서를 삽입하겠습니다.

 

 

첫번째 문서부터 "아이폰" 단어 1개로 시작하여,

세번째 문서는 총 3개의 "아이폰" 단어가 들어간 문장이 삽입되었다는 것을 알 수 있습니다.

 

 

3개의 문서가 잘 삽입되었습니다.

 

이제 조회해보겠습니다.

 

 

 

모든 문서가 1점으로 동일하게 계산된 것을 알 수 있습니다.

 

정말 잘 된게 맞는지 nori_unique 를 제거하고 다시 문서를 삽입해보겠습니다.

 

 

 

결과입니다. 중복 단어로 인해 점수 차등이 생긴 것을 알 수 있습니다.