728x90
Term Suggester Api를 이용한 오타 교정
Term Suggester API를 이용하면, 인덱스 내에 단어를 이용해 비슷한 단어가 추천된다.
플러그인 설치하기(한글 지원)
자바 카펫 플러그인 설치
wget https://github. com/javacafe-project/elastic-book-etc/raw/master/plugin/javacafe-analyzer-6.4.3. zip
- zip 파일 다운로드
엘라스틱서치에 설치
./bin/elasticsearch-plugin install file:///절대경로/javacafe-analyzer-6.4.3.zip
플러그인 정상 설치 여부 확인
./bin/elasticsearch-plugin list
실습하기
1. 인덱스 생성
PUT /company_spellchecker
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"korean_spell_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"trim",
"lowercase",
"javacafe_spell"
]
}
}
}
}
}
}
2. 매핑 설정
PUT /company_spellchecker/_mapping
{
"properties": {
"name": {
"type": "keyword",
"copy_to": ["suggest"]
},
"suggest": {
"type": "completion",
"analyzer": "korean_spell_analyzer"
}
}
}
- 매핑에 사용될 suggest 필드를 정의
- analyzer 속성에 외부 분석기 사용
- name 필드의 데이터를 복사해서 suggest 필드에 저장하는 구조이다.(copy_to)
3. 오타 교정 데이터 색인
PUT /company_spellchecker/_doc/1
{
"name": "삼성전자"
}
4. 오타 교정 API 요청
Request
POST /company_spellchecker/_search
{
"suggest": {
"my-suggestion": {
"text": "샴성전자",
"term": {
"field": "suggest"
}
}
}
}
Response
{
"suggest": {
"my-suggestion": [
{
"text": "ㅅㅑㅁㅅㅓㅇㅈㅓㄴㅈㅏ",
"offset": 0,
"length": 4,
"options": [
{
"text": "ㅅㅑㅁㅅㅓㅇㅈㅓㄴㅈㅏ",
"score": 0.9090909,
"freq": 1
}
]
}
]
}
}
- 사용자가 입력한 단어와 비슷한 단어를 찾기 위해 javacafe_spell 필터가 내부적으로 색인된 모든 데이터를 자소 단위로 분해해서 생성한다.
- 요청된 검색어도 자소로 분해해서 비슷한 데이터를 찾는다.
- 자소 단위로 분해됐기 떄문에 편집거리 계산이 가능해진다.
- 보통 사용자가 검색 시 검색 결과가 없거나, 1~2% 미만으로 조회되는 경우 오타 교정 API를 호출해서 교정된 검색어를 추가로 제시하거나, 교정된 검색어로 검색한 결과를 출력해야한다.
참고
자소 단위로 분해된 단어 합치기
오타 교정으로 추천된 단어는 자소가 분해된 상태로 제공하기 떄문에 프로그램에서 하나로 합쳐 실제 단어로 조합해야 한다.
자바에서는 이런 경우 사용할 수 있는 java.text.Normalizer 클래스를 제공한다.
String keyword = "ㅅㅏㅁㅅㅓㅇㅈㅓㄴㅈㅏ";
// NFC 정규화 (조합형으로 변환)
String result = Normalizer.normalize(keyword, Normalizer.Form.NFC);
한영/영한 오타 교정
한글 검색(삼성전자)를 검색하고 싶었지만, 영문자판(tkatjdwjswk)으로 검색할 경우, 유니코드 관점에서 완전히 다른 코드가 입력된 것이기 때문에 편집거리로 비슷한 단어를 찾는 방식 활용이 불가능하다.
이럴 경우 2가지 방안을 제공할 수 있는데, 해당 단어를 추천/해당 단어를 추천하고 추천한 단어로 검색 결과를 노출 방안이 있다.
검색 서비스마다 서로 다른 방안을 사용할 수 있으며, 이는 검색 품질의 문제가 아닌 정책 문제로 검색 서비스를 어떻게 구현하느냐가 기준이 되는 것이다.
실습하기
1. 인덱스 생성
Company: 실제 검색될 문서 색인
PUT /company
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"trim",
"lowercase"
]
}
}
}
}
}
Search_Keyword
PUT /search_keyword
{
"settings": {
"analysis": {
"analyzer": {
"kor2eng_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"trim",
"lowercase",
"javacafe_kor2eng"
]
},
"eng2kor_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"trim",
"lowercase",
"javacafe_eng2kor"
]
}
}
}
}
}
- 한/영 오차 교정과 영/한 오차 교정을 위한 각각 분석기를 설정
- 한/영 오차 교정용 분석기인 kor2eng_analyzer를 필터에 추가했고, 영/한 오차 교정용 분석기인 eng2kor_analyzer를 필터에 추가했다.
2. 매핑 설정
company 매핑 설정
PUT /company/_mapping
{
"properties": {
"name": {
"type": "keyword"
}
}
}
- name 필드 생성
search_keyword 매핑 설정
PUT /search_keyword/_mapping
{
"properties": {
"name": {
"type": "keyword",
"copy_to": ["kor2eng_suggest", "eng2kor_suggest"]
},
"kor2eng_suggest": {
"type": "text",
"analyzer": "standard",
"search_analyzer": "kor2eng_analyzer"
},
"eng2kor_suggest": {
"type": "text",
"analyzer": "standard",
"search_analyzer": "eng2kor_analyzer"
}
}
}
- kor2eng_suggest 필드와 eng2kor_suggest 필드를 생성하고 분석 가능하도록 text 타입으로 설정한다.
- 문서를 색인할 떄 원래 방식대로 동작하고 검색할 때만 오타 교정 필터가 적용되도록 별도로 search_analyzer를 설정해야 한다
3. 오타 교정 데이터 색인
PUT /company/_doc/1
{
"name": "삼성전자"
}
PUT /company/_doc/2
{
"name": "iphone"
}
PUT /search_keyword/_doc/1
{
"name": "삼성전자"
}
PUT /search_keyword/_doc/2
{
"name": "iphone"
}
4. 오타 교정 API 요청
- search_keyword 인덱스에 사용자 검색어를 가지고 질의 검색을 한다.
- 검색 결과가 없다면 검색어 그대로 company 인덱스에 검색 질의
- 검색 결과가 있다면 변경된 검색어로 company 인덱스에 검색 질의
한영 오타에 대한 테스트
Request
POST /search_keyword/_search
{
"query": {
"match": {
"eng2kor_suggest": {
"query": "tkatjdwiswk"
}
}
}
}
Response
{
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "search_keyword",
"_type": "_doc",
"_id": "1",
"_score": 0.2876821,
"_source": {
"name": "삼성전자"
}
}
]
}
}
영한 오타에 대한 테스트
Request
PUT /search_keyword/_search
{
"query": {
"match": {
"kor2eng_suggest": {
"query": "ㅑㅔㅗㅐㅜㄷ"
}
}
}
}
Response
{
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "search_keyword",
"_type": "_doc",
"_id": "2",
"_score": 0.2876821,
"_source": {
"name": "iphone"
}
}
]
}
}
- 영한 오타나 한영 오타가 발생하더라도 실제 데이터를 질의 할 때 변경된 검색어로 질의하기 때문에 정상적인 문서가 검색된다.
- search_keyword 인덱스에 키워드 자체가 존재하지 않는다면 오타 교정이 불가능하므로 검색어에 대한 모니터링을 수시로 해야한다.
- 검색 질의 시 로그 등을 활용해 로그스태시에 저장하고 검색 결과가 0건인 경우 모니터링하여 검색 품질을 높여야한다.
728x90
'Elastic Search' 카테고리의 다른 글
| Ch07. 한글 검색 확장 기능 - 자바카페 플러그인 (0) | 2025.09.28 |
|---|---|
| Ch07. 한글 검색 확장 기능 - 한글 키워드 자동완성 (0) | 2025.09.28 |
| Ch07. 한글 검색 확장 기능 - Suggest API 소개 (0) | 2025.09.28 |
| Ch06. 고급 검색 - 스냅숏을 이용한 백업과 복구 (0) | 2025.09.24 |
| Ch06. 고급 검색 - 별칭을 이용해 항상 최신 인덱스 유지하기 (0) | 2025.09.24 |