검색 품질을 높이기 위해서는 텍스트의 정확한 분석이 필수입니다.
특히 한국어는 띄어쓰기만으로 의미를 구분하기 어렵기 때문에 형태소 분석이 중요합니다.
이번 글에서는 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 를 제거하고 다시 문서를 삽입해보겠습니다.
결과입니다. 중복 단어로 인해 점수 차등이 생긴 것을 알 수 있습니다.
'검색엔진 > Opensearch' 카테고리의 다른 글
[opensearch] 인덱스 snapshop 뜨는 방법 (0) | 2025.01.20 |
---|---|
오픈서치 기본 설치 (0) | 2024.09.24 |