엘리스의 통합검색 기능을 개선하여 유저가 원하는 결과를 내도록 개선한 경험이다.
https://academy.elice.io 여기서 써볼수있다
유저가 겪는 문제

대부분의 유저는 이름이 "LangChain~"으로 시작하는 상품을 검색하기 위해 보통 "Lang"까지만 검색해본다.
하지만 우리의 통합검색 기능은 "Lang"을 입력했을때 "LangChain~" 상품을 보여주지 않았다.
왜 이런 현상이 일어나는 것일까? elasticsearch의 analyzer 동작 원리를 잠깐 살펴보고 가자.
elasticsearch analyzer 동작 원리
elasticsearch는 문자열이 들어오면 analyzer를 통해 character filter -> tokenizer -> token filter 순서로 전처리를 한다
예를 들어 "<strong>LangChain</strong>으로 나만의 업무" 라는 문장이 있다고 가정해보자
먼저 character filter는 토큰화 이전에 문자열을 가공하는 역할을 한다.
character filter는 문자열을 어떻게 정리할 것인지에 따라 HTML 태그 제거, 패턴 기반 치환등 여러 종류가 있다.
만약 HTML 태그 제거 character filter를 사용한다면 "LangChain으로 나만의 업무" 와 같은 문자열로 변환된다.
다음으로 tokenizer는 문자열을 토큰화(분리)하는 역할을 한다.
tokenizer는 문장을 어떻게 나눌 것인지에 따라 공백 기반 분할, 패턴 기반 분할 등 여러 종류가 있다
공백 기반 Tokenizer를 사용한다면 ["LangChain으로", "나만의", "업무"] 와 같이 문자열을 분리한다.
마지막으로 token filter는 토큰화된 문자들을 다시 가공하는 역할을 한다.
token filter 또한 문자열을 어떻게 정리할 것인지에 따라 대소문자 변환, 중복 제거 등 여러 종류가 있다
대소문자 변환 token filter를 사용한다면 ["langchain으로", "나만의", "업무"] 와 같이 가공한다.
이처럼 analyzer는 원본 텍스트를 검색엔진(elasticsearch)이 이해할 수 있는 형태로 변환하는 역할을 한다.
문제 원인
다시 유저가 겪던 문제로 돌아가서 원인을 파악해보았는데, 아래와 같았다
- 현재 공백 기준으로 토큰화하는 tokenizer를 사용하고 있다 (standard tokenizer)
- fuzziness 허용 편집거리는 1이다 (오타 1개까지 허용)
- 즉 "Lang_" 까지 편집거리를 허용해주는데,
실제 저장된 token인 "LangChain으로"는 편집거리가 훨씬 커서 매칭되지 않는다
- 즉 "Lang_" 까지 편집거리를 허용해주는데,
해결방법
요구사항에 맞는 적절한 analyzer를 생성하여 해결하였다
{
"analyzer": {
"camel_analyzer": {
"filter": ["lowercase"],
"char_filter": ["camel_filter"],
"tokenizer": "nori_mixed"
}
},
"char_filter": {
"camel_filter": { // 1
"pattern": "(?<=\\p{Lower})(?=\\p{Upper})",
"type": "pattern_replace",
"replacement": " "
}
},
"tokenizer": {
"nori_mixed": { // 2
"type": "nori_tokenizer",
"decompound_mode": "mixed"
}
}
}
- CamelCase character filter 를 적용해 입력을 전처리 한다
- ["LangChain으로 나만의 업무"] → ["lang chain으로 나만의 업무"]
- 전처리 결과에 nori_tokenizer를 적용해 조사를 분리한다
- ["lang chain으로 나만의 업무"] → ["lang", "chain", "으로", "나", "만", "의", "업무"]
위 analyzer를 index에 적용하고, reindex한 후에 "lang"으로 검색하면,
["lang", "chain", "으로", "나", "만", "의", "업무"]에 lang이 포함되어 있으므로 가중치가 높게 계산될 것이다.
결과

의도한대로 "Lang"으로 검색하면 "LangChain~"이름을 가진 상품이 잘 나온다. 👍
Ref.
'DB' 카테고리의 다른 글
[PostgreSQL] 운영중인 DB 조용히 갈아끼우기 (0) | 2025.07.27 |
---|---|
[DB] MongoDB 장점 (0) | 2022.06.01 |
[DB] MongoDB 자료구조 (0) | 2022.06.01 |
[DB] Lock 이해하기 (0) | 2022.05.20 |
[DB] 상황에 맞는 인덱스 사용법 (0) | 2022.05.20 |