home

데이터모델링

  • 문서의 유형에 따라 필드에 적절한 데이터 타입을 지정해야 한다.
  • 매핑 = 색인될 문서의 데이터 모델(스키마)
  • 설정 하지 않으면 엘라스틱 서치에서 자동으로 할당, 그러나 이건 나중에 문제를 일으킴

매핑 API의 이해

  • 한번 생성된 매핑의 타입은 변경할 수 없다.
  • 고려사항들
- 문자열을 분석할 건가?
- _source에는 어떤 필드를 정의?
- 날짜 필드를 가지는 필드는 무엇?
- 매핑에 정의되지 않고 유입되는 필드는 어떻게 처리할 것인가?
  • 분석 가능 = text
  • 계층 구조는 보통 object -> keyword
  • 나머지 그냥 조회하는 것들은 integer, keyword 등으로 정의

매핑 파라미터

  • 색인 할 필드를 어떻게 저장할 것인가?
  • analyzer: 데이터의 형태소를 분석할 것이다. -> text 타입의 필드는 이 매핑 파라미터를 기본으로 사용
  • normalizer: term query에 분석기를 사용하기 위해 사용 (cafe, Cafe, CaFe)
  • boost: 필드에 가중치 부여 -> 최근 제거됨
  • coerce: 자동 변환을 허용할지?
  • copy to: 추가한 필드의 값을 지정한 필드로 복사 -> 두 데이터를 합쳐서 전체 검색 용도로 사용하기도 함
  • fielddata: 힙 공간에 생성하는 메모리 캐시 -> GC 문제로 거의 사용되지 않음
  • doc_values: 기본 캐시, text 필드 제외 모두 이 캐시 사용, 힙 사용 부담 없앰
  • dynamic: 동적 생성 or 생성 X 할 것인지
  • enable: 검색 결고에는 포함하고 싶지만 색인은 하고 싶지 않은 경우 (날짜와 같은 경우)
  • format: 날짜 포맷 변경
  • ignore_above: 지정한 크기 넘으면 빈 값으로 색인
  • ignore_malformed: 잘못된 데이터 타입 색인 -> 예외 발생
  • index: 필드 값을 색인할지를 결정
  • fields: 다중 필드를 설정할 수 있는 옵션 -> 하위로 멀티 필드를 둔다. (타입 다중화 가능, keyword + text)
  • norms: _score 값 계산에 필요한 정규화 인수를 사용할지? -> 이해 X
  • null_value: null 이더라도 필드를 생성
  • position_increment_gap: 리스트 데이터 색인할 때, 단어와 단어 사이의 간격을 허용할 것인지?
  • properties: 중첩 타입, 오브젝트 타입의 스키마를 정의할 때 사용
  • search_analyzer: 다른 분석기를 사용하고 싶은 경우 분석기를 별도로 지정 가능
  • similarity: 유사도 측정 알고리즘 지정
  • store: 필드의 값을 저장해 검색 결과에 값을 포함하기 위한 매핑 파라미터

메타 필드

  • _index: 인덱스의 이름, 호출시 인덱스에 몇 개의 문서가 있는지 확인 가능
  • _type: 매핑 타입 정보를 담고 있음
  • _id: 고유 값
  • _uid: 식별 값, _type과 _id를 # 로 조합해 사용
  • _source: 문서의 원본 데이터 제공, _reindex API나 스크립트를 통해서 해당 값을 재색인 가능
  • _all: 색인에 사용된 모든 필드의 정보를 가진 메타 정보 -> 크기가 너무 커져서 폐기, copy_to 를 사용하라
  • _routing: 특정 문서를 특정 샤드에 저장하기 위해 사용자가 지정하는 메타 필드

필드 데이터 타입

  • Keyword: 세 가지의 경우 반드시 Keyword 타입 사용
    • 검색시 필터링 되는 항목
    • 정렬이 필요한 항목
    • 집계 해야 하는 항목
  • Text: 기본적으로 문자열 데이터로 인식하고 이를 분석
    • 전체 텍스트가 토큰화 되어서 부분 검색 가능
    • 그런데 정렬이나 집계연산이 필요할 경우 keyword과 멀티 필드로 설정 -> fields 사용
  • Array: Array 타입 안에는 모두 같은 타입이어야 한다.
  • Numeric: 숫자타입, long, integer, short, byte, douvle, float, half_float
  • Date
  • Range: gte, lte로 시작과 종료 값의 범위를 지정해 줄 수 있다.
  • boolean
  • Geo Point: lat, lon으로 지정
  • IP
  • Object: 내부 객체를 계층적으로 포함 가능, 타입 정의를 하지 않고 단지 필드 값으로 구조를 입력
  • Nested: 리스트 저장시 or 의 특징 때문에 전부 검색되는 일을 방지 가능

엘라스틱 서치 분석기

  • 텍스트를 분석할 때 그냥 두면 standard analyzer 사용, 그렇게 되면 형태소 분석을 하지 않음
  • 역색인 구조 ```plain
  • 모든 문서가 가지는 단어의 고유 단어 목록
  • 해당 단어가 어떤 문서에 속해 있는지에 대한 정보
  • 전체 문서에 각 단어가 몇 개 들어있는지에 대한 정보
  • 하나의 문서에 단어가 몇 번씩 출현했는지에 대한 빈도 ```
  • 색인한다 = 역색인 파일을 만든다, 변형을 하더라도 원문을 바꾸는 것이 아닌 토큰 만 변경 하는 것. (예를 들어 모두 소문자로 바꿔서 저장)

전체 분석 프로세스

alt text

  • Character filter: 특정 단어를 변경, HTML 태그 제거 등
  • Tokenizer filter: 텍스트를 어떻게 나눌 것인지?
  • Token filter: 토큰화된 단어를 하니씩 필터링, 사용자가 원하는 토큰으로 만든다.
  • _analyzer: analyzer에 따라서 형태소가 어떻게 되는지 볼 수 있다.

대표적 분석기

  • Standard Analyzer: 공백, 특수 기호를 기준으로 토큰 분리, 모든 문자를 소문자로 변경
  • Whitespace Tokenizer: 공백 문자열을 기준으로 토큰 분리
  • keyword tokenizer: 전체 입력 문자열을 하나의 키워드처럼 처리

전처리 필터

  • 토크나지어 내부에서도 잘 해주기 때문에 잘 쓰이지 않음
  • html strip char 필터: html을 제거하는 전처리 필터

토크나이저 필터

  • 토크나이저 필터에 따라서 적절히 분해된다.
  • standard 토크나이저: 기호를 만나면 토큰으로 나눈다.
  • whitespace tokenizer
  • ngram 토크나이저
  • edge ngram 토크나이저
    • hello harry -> he, hel, hell, hello, ha, har, harr, harry
  • keyword 토크나이저: 텍스트 하나를 토큰으로 만든다

토큰 필터

  • 분리된 토큰을 변형하거나 추가, 삭제할 때 사용됨
  • Ascii folding 토큰 필터: 127개의 알파벳, 숫자, 기호에 해당하지 않으면 아스키 요소로 변경
  • lovercase 토큰 필터: 전체 문자열 소문자로
  • upper case 토큰 필터
  • stop 토큰 필터: 불용어로 등록할 사전을 구축해서 사용하는 필터를 의미
  • stemmer 토큰 필터: stemmer 알고리즘 활용, 영단어 원형으로 변환되는지 확인
  • synonym 토큰 필터: 동의어 처리 필터
  • Trim 토큰 필터: 앞뒤 공백 없애는 필터

동의어 사전

  • elastic search를 검색했을 때 엘라스틱 서치로도 검색 가능되도록
  • 대부분 config 파일로 사전을 만든다.
  • 동의어 추가
    • , 로 한다. “elastic search,엘라스틱서치”
    • 토큰 필터의 종류가 중요하다. lowercase 필터를 적용했다면 모두 소문자로 동의어를 적어라
    • 근데 요즘은 자동으로 됨
  • 동의어 치환
    • Harry=>해리
  • 동의어 사전은 실시간 X 수정된 동의어 적용하고 싶으면 인덱스 reload
  • 빈번하게 수정되는 인덱스의 경우 색인 시점에는 적용 X, 검색 시점에만 적용한다.