Elastic Search

[Elasticsearch] Fuzzy 쿼리

꾸준함. 2024. 6. 19. 08:54

오타

  • 사전적 의미: 타자를 칠 때에 잘못 찍는 일 또는 그 글자
  • 영어: typo, typographical error
  • 오타는 '검색 결과 없음'의 주요 원인
  • 발생하는 이유는 다음과 같이 다양함
    • 키보드 타이핑 시 왼손과 오른손의 반응 속도 차이
    • 모바일에서 터치 실수 (Fat Finger)
    • 정타를 오타로 잘 못 인지하는 경우
    • 정타 자체를 인지하지 못하는 경우
    • etc.

 

Fuzzy Matching

  • 오타 입력 시 의도한 정타로 검색어를 전환하는 기법
  • 이를 지원하면 검색어의 결과가 나오지 않는 문제를 일부 해결 가능
    • UX를 향상 시키는 일
    • 검색 서비스에 신뢰하는 요소

 

Elasticsearch가 오타를 지원하는 방법

 

1. Levenshtein distance 기반의 알고리즘 Damerau-Lavenshtein

  • 두 개의 문자열 A, B가 주어졌을 때 두 문자열이 얼마나 유사한 지를 알아낼 수 있는 알고리즘
  • 자연어 영역뿐 아니라 의료 공학에서 유전자 유사도 판별에도 쓰임
  •  Levenshtein distance는 Edit Distance 알고리즘이라고도 불림

 

https://yuminlee2.medium.com/levenshtein-distance-1080038a4d9

 

* Elasticsearch는 Edit Distance 알고리즘을 그대로 사용하지는 않고 순서의 변경을 유효한 작업으로 간주하는 Damerau-Lavenshtein 알고리즘을 사용함

 

 

https://www.geeksforgeeks.org/damerau-levenshtein-distance/

 

Fuzzy 쿼리

  • 검색어와 유사한 단어를 찾기 위해 사용되는 강력한 기능
  • 오타, 철자 오류, 단어 변형 등을 처리할 때 매우 유용
  • Edit Distance 알고리즘 기반인 Damerau-Lavenshtein 알고리즘을 사용하여 두 단어 간의 유사성을 측정하고 지정한 fuzziness(편집 거리)를 통해 검색어인 오타와 일치하는 단어를 찾음

 

 

부연 설명

  • value: 검색할 단어
  • fuzziness: 편집 거리(edit distance)
    • AUTO로 지정할 경우 Elasticsearch가 단어 길이에 따라 적절한 값을 자동으로 설정
    • term의 길이가 [0, 2] 일 경우 완전 매칭만 허용
    • term의 길이가 [3, 5] 일 경우 편집 거리 1까지 허용
    • term의 길이가 6 이상일 경우 편집 거리 2까지 허용

 

1. Fuzzy Query와 다른 검색 조합

 

1.1 match query + fuzzy query

  • term 쿼리와 유사하게 동작하기 때문에 분석기를 거친 text 필드를 사용하지 않음

 

 

1.2 suggester query + fuzzy query

  • 'did you mean' 스타일의 자동완성에 적합한 용도로 사용

 

 

2. Fuzzy Query 성능

  • 비교적 빠른 편이지만 일반적인 match query에 비해 느림
  • 쿼리의 실행 시간은 인덱스 내 고유 term 수에 비례하여 증가
    • Lucene 내부의 term 인덱스 구조를 통해서 빠르게 포함된 문서를 확인이 가능하지만 Fuzzy 쿼리는 그러지 못하기 때문에 느림
    • prefix_length를 길게 할 수록 큰 속도 향상 효과를 이룰 수 있지만 앞부분의 철자 오류를 잡지는 못함

 

3. Fuzzy Query 주의 사항

  • Elasticsearch는 텍스트 검색 가능하게 되기 전에 분석기를 통과 (keyword의 경우 분석기 거치지 않음)
  • Fuzzy Query를 수행할 때 쿼리 텍스트가 분석 결과로서 예상치 못한 어휘 값과 비교될 수 있으므로 때로는 혼동스러운 결과가 발생할 수 있음
  • 필드에서 동의어가 활성화 되어 있을 경우 동의어가 일치할 수 있으며, 실제 원본 테그스트에 해당 단어가 전혀 난타나지 않더라도 일치할 수 있음을 의미
  • ex) ngram 분석된 필드에 Fuzzy Query를 사용할 경우 결과는 매우 이상할 수 있음
  • ex) snowball 분석기 사용할 경우 'running'에 대한 Fuzzy 검색은 'run'으로 어간이 축소될 것이지만 철자가 틀린 'runninga'와는 일치하지 않게 됨
  • 따라서 Fuzzy Query에 사용할 텍스트의 경우 간단한 분석기만 사용하는 것이 합리적일 가능성이 높으며 가능하다면 synonym도 비활성화하는 것을 권장

 

오타 정보를 수집하는 방법

  • 공개 데이터 활용: Commonly misspelled words
  • 사용자의 쿼리 세션 정보를 기반으로 로그 수집
    • 오타 -> '결과 없음' -> 정타 -> 결과 반환
    • 위와 같은 프로세스를 거쳤다면 같은 세션 내 Edit Distance가 짧을 경우 오타로 간주

 

  • 자연어 처리 기술을 활용한 오타 분석
    • 노이즈 채널 모델(Bayesian noisy channel)
    • 언어 모델과 오류 모델을 통해 주어진 '오타' 무낮열이 각각의 '정타' 후보들로부터 어떻게 유도될 수 있는지, 그리고 각 '정타' 후보들이 얼마나 '자연스러운' 문장인지를 종합적으로 판단하는 모델

 

참고

  • 패스트 캠퍼스 -  고성능 검색 엔진 구축으로 한 번에 끝내는 Elasticsearch

 

반응형

'Elastic Search' 카테고리의 다른 글

[ELK] Logstash 정리  (0) 2024.06.25
[Elasticsearch] 검색 정확도와 랭킹  (0) 2024.06.19
[Elasticsearch] 스크립트 쿼리  (0) 2024.06.13
[Elasticsearch] 자동완성  (0) 2024.06.12
[Elasticsearch] 집계  (3) 2024.06.09