ElasticSearch 역 인덱스(Inverted Index)

2025. 1. 10. 23:35·ElasticSearch

Token, Tokenizing

  • Tokenizing: 문서(document)에 포함된 텍스트를 특정 기준(예시에선 공백)으로 나누는 것을 말한다.
  • Token(또는 Term): 토크나이징에 의해 나눠진 문자열 덩어리 하나를 토큰(또는 Term)이라고 부른다.

Inverted Index

위의 설명에서 1번 문서(Document 1)에 포함된 "Hello I am yelly"를 토크나이징한 결과가 "Hello", "I", "am", "yelly"라는 토큰으로 분리되었다. 마찬가지로 2번 문서(Document 2)에 포함된 "Hello You are jelly" "Hello", "You", "are", "jelly"라는 토큰으로 분리되었다.

 

색인

이때 토큰과 문서 정보(Document ID)를 매핑해서 저장한 자료구조를 `Inverted Index(역 인덱스)`라 한다.

ElasticSearch에서 사용하는 자료구조는 Trie(트라이)를 변형한 FST, Burst Trie를 사용하는데, 자세한 내용은 다음 포스팅에서 다룬다.

 

검색

"Hello"라는 단어(term)를 Inverted Index에 검색하면 토큰이 정확하게 일치하는 문서의 번호인 1, 2를 얻는다.

"hello"라는 단어로 검색 시 소문자와 대문자는 다르므로 "hello"라는 단어가 포함된 문서는 없다는 결과를 얻는다.

Analyzer

ElasticSearch에서 Inverted Index를 만드는 주체는 Analyzer 이다.

 

인덱스 색인 시 어떤 Analyzer를 선택했냐에 따라 Inverted Index의 구조는 달라진다.

Standard Analyzer

Standard Analyzer는 `character filter`를 사용하지 않고, `stop token filter`는 기본적으로 비활성화되어 있어 점선으로 표시했다.

 

처리 순서

  1. standard analyzer에서 `character filter`는 정의되지 않았다.
    이 필터는 `<`, `>`, `!`같은 무의미한 특수문자를 제거하는 역할을 한다.
  2. 인덱스에 인입된 문자열을 순서대로 `standard tokenizer`에 의해 가공한다.
    특정한 기준(공백 또는 쉼표 등)에 의해 문자열을 나눠 n개의 토큰을 생성한다.
  3. 토큰들은 `standard token filter`에 의해 `unicode standard annex`라는 규칙에 따라 문자열을 분리한다.
    (이 규칙은 영어가 아닌 한글같은 문자열을 어떻게 표현할 것인지를 정의한 규칙이다.)
  4. 토큰들은 `lower case token filter`에 의해 모두 소문자로 변환된다.
  5. `stop token filter`는 stop word로 지정한 단어가 토큰에 포함되었을 때 해당 토큰을 제거한다. 기본적으로 비활성화 되어있다.
  6. 최종적으로 필터를 모두 거친 토큰들은 Inverted Index를 구성하게 된다.

Keyword Analyzer

Keyword Analyzer는 인입된 문자열을 변형시키지 않는다.

필드의 값을 그대로 Inverted Index로 저장한다.

따라서 "Hello" 라는 단어로 검색하면 정확히 일치하는 토큰이 없기 때문에 아무 결과를 얻지 못한다.

 

다음 포스팅에서 ElasticSearch가 사용하는 루씬(Lucene) 검색 엔진의 구조를 다루고, 대용량 텍스트를 어떻게 빨리 검색할 수 있는지 설명한다.

2025.01.12 - [ElasticSearch] - 루씬(Lucene) 검색 엔진의 구조 (FST, Burst Trie, 역 인덱스)

 

루씬(Lucene) 검색 엔진의 구조 (FST, Burst Trie, 역 인덱스)

ElasticSearch는 아파치 루씬(Apache Lucene)이라는 검색 엔진 라이브러리를 활용해 분산 환경에서의 고성능 검색 기능을 제공한다.고성능 검색 기능은 루씬(Lucene)의 저수준 API를 조립해 REST API로 제공

dev-gallery.tistory.com

 

참고

  • 기초부터 다지는 ElasticSearch 운영 노하우
  • https://opster.com/guides/elasticsearch/data-architecture/elasticsearch-text-analyzers/

'ElasticSearch' 카테고리의 다른 글

루씬(Lucene) 검색 엔진의 구조 (FST, Burst Trie, 역 인덱스)  (0) 2025.01.12
ElasticSearch Cluester API & Index API - 클러스터 설정과 인덱스 설정 변경하기  (0) 2025.01.10
ElasticSearch 샤드 배치 방식 변경하기  (2) 2025.01.03
ElasticSearch 클러스터 설정 톺아보기  (0) 2024.12.30
ElasticSearch 기본 개념  (0) 2024.12.29
'ElasticSearch' 카테고리의 다른 글
  • 루씬(Lucene) 검색 엔진의 구조 (FST, Burst Trie, 역 인덱스)
  • ElasticSearch Cluester API & Index API - 클러스터 설정과 인덱스 설정 변경하기
  • ElasticSearch 샤드 배치 방식 변경하기
  • ElasticSearch 클러스터 설정 톺아보기
옐리yelly
옐리yelly
  • 옐리yelly
    개발 갤러리
    옐리yelly
  • 전체
    오늘
    어제
    • 모든 글 보기 (85)
      • Project (22)
      • Java (4)
      • Spring (8)
      • Kubernetes (6)
      • Docker (2)
      • JPA (3)
      • Querydsl (2)
      • MySQL (9)
      • ElasticSearch (7)
      • DevOps (4)
      • Message Broker (3)
      • Git & GitHub (2)
      • Svelte (1)
      • Python (8)
        • Python Distilled (4)
        • Anaconda (1)
        • Django (0)
        • pandas (3)
      • Algorithm (1)
      • Computer Science (0)
      • 내 생각 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로젝트
    devops
    RabbitMQ
    ncloud
    OOP
    MySQL
    커넥션 풀
    Message Broker
    svelte
    k8s
    성능 테스트
    리팩토링
    Spring
    데드락
    elasticsearch
    mybatis
    argocd
    nks
    JPA
    Project
    비사이드
    docker
    예약 시스템
    Python
    querydsl
    pymysql
    blue-green 배포
    pandas
    gitops
    포텐데이
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
옐리yelly
ElasticSearch 역 인덱스(Inverted Index)
상단으로

티스토리툴바