검색에서 사용자 의도를 반영하는 법 ( 옛날 방법, ES )

안녕하세요.
제가 운영 중인 채용 서비스에 적용한 기법을 공유합니다. AI가 아닌 엘라스틱서치(Elasticsearch)의 고전적인 문서 유사도 방식에 기반한 방법이라 ‘옛날 방법’이라고 적었습니다.

본문은 길어 요약만 담고, 자세한 내용은 아래 원문(4페이지라 조금 길어요.)에 정리했습니다.
예시를 포함한 더 자세한 내용은 여기로 보시면 감사하겠습니다.

블로그 링크 : https://dev-wiki.dev/reading/tech/17
서비스 링크 : https://dev-wiki.dev/hirings

-------------------------------------------------------------------------

1. 의도반영 목표

사용자가 “카카오페이”를 검색하면 카카오페이 관련 리소스가 최상단에, 그 외 카카오 / 페이 관련 리소스는 하단에 오도록 정렬합니다.


2. 핵심 흐름

  1. 검색어 분석 → 키워드 매칭

    • 검색어에 특정 키워드가 포함됐는지 확인합니다.

    • 이때 분석용 인덱스에 저장된 Percolate 쿼리를 사용합니다.

  2. 쿼리 보강 → phrase 쿼리 임베드

    • (1)의 매칭 결과를 바탕으로, 해당 키워드의 phrase 쿼리기존 검색 쿼리에 임베드하여 가중치를 부여합니다.

    • 쿼리 흐름은 첨부한 이미지 도식화 참고.


3. Percolate 쿼리란?

인덱스에 미리 쿼리를 저장해두고, 새로운 토큰(=이번 케이스에서는 ‘검색어’) 가 들어왔을 때 어떤 쿼리에 매칭되는지 확인하는 Elasticsearch 기능입니다.

예: 검색어가 “카카오페이 검색 서비스” 라면, Percolate로 “카카오 페이” 구문과 그에 대응하는 가중치를 찾아냅니다. (자세한 예시는 원문 참고)

Percolate 데이터 예시

저장 (bulk)

POST hiring_keyword_boost/_bulk
{"index":{}}
{"canonical":"카카오","group":"COMPANY","boost":1.0,"priority":10,"q":{"match_phrase":{"text":{"query":"카카오","slop":0}}}}
{"index":{}}
{"canonical":"카카오 뱅크","group":"COMPANY","boost":8.0,"priority":10,"q":{"match_phrase":{"text":{"query":"카카오 뱅크","slop":0}}}}
{"index":{}}
{"canonical":"네이버 페이","group":"COMPANY","boost":8.0,"priority":10,"q":{"match_phrase":{"text":{"query":"네이버 페이","slop":0}}}}

검색 (percolate)

POST hiring_keyword_boost/_search
{
  "_source": ["canonical","boost","priority"],
  "size": 10,
  "query": {
    "percolate": {
      "field": "q",
      "document": { "text": "kakaoPay 이벤트 확인" }
    }
  }
}

응답 예 (발췌)

"hits": [
  {
    "_index": "hiring_keyword_boost",
    "_score": 0.26152915,
    "_source": {
      "canonical": "카카오 페이",
      "boost": 8,
      "priority": 10
    },
  }
  // ...
]


  1. 인덱싱 & 쿼리 공통 전략


검색어, 본문 둘 다 의미 단위 토큰 분해하고 표현을 통일합니다.
예시는 아래와 같습니다.


  • “카카오뱅크”, “카카오 뱅크”, “kakao bank”, “KAKAO BANK” → ["카카오", "뱅크"]

  • “네이버페이”, “네이버 페이”, “naver pay”, “NaverPay” → ["네이버", "페이"]

이렇게 토큰을 분해·통일하면, 예를 들어 “카카오뱅크” 검색 시에도 카카오 혹은 뱅크 관련 리소스를 포괄할 수 있습니다.

이후 검색어 분석 결과에 따라 정확히 “카카오뱅크”를 지칭하는 리소스상단으로 끌어올리는 것이 기본 전략입니다.

토큰 분해 과정은 그림이 설명하기 더 좋은 것 같아서, 이미지를 첨부 했습니다.

_____


5. 마치며


좋은 내용이라고 생각했는데, 써보니까 별게 없네요.
그래도 키워드 단위로 부스트를 하는 글은 인터넷에 없어서 한번 써보고 싶었습니다.

지금 작업에서는 키워드와 토큰화에 대해서 선행해야 하는 작업이 많습니다.
제꺼 링크엔 어떤 키워드를 선정해야 하는지도 디테일이 있습니다.
관심있으시면 봐주시면 감사하겠습니다.


질문 혹은 이상한거 있으면 댓글 주시면 답변 올리겠습니다.
혹은 `그렇게 하는거 아닌데, 다르게 하면 더 좋은데`이런 정보도 있다면 남겨주시면 감사하겠습니다.

사실 syn_graph 를 어떻게 더 잘쓰면 더 좋은 방법이 있을지도 모르지만 저의 파워에선 이 방법이 한계였습니다.

검색이 재미가 좋네요. 모두 재밌게 작업하시길 바랍니다.

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2025년 9월 20일 오전 10:39

댓글 0