본문으로 바로가기

Elasticsearch에서 문서 인덱싱하기

category Back-end 2019.03.14 00:32

문서(Document)

Elasticsearch에서 색인과 검색을 하는 기본 데이터 단위

타입(Type)

문서에 대한 논리적인 컨테이너

서로 다른 스키마를 가지는 문서를 구분

색인(Index)

타입에 대한 컨테이너

디스크에 같은 파일 집합으로 저장

 

색인 + 타입 + 문서ID로 하나의 유일한 문서를 식별

REST API: Elasticsearch 노드가 설치된 서버의 9200 포트를 통해 제공

 

색인 생성

1 PUT /test

설정을 포함한 생성

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 PUT /test/_settings { "analysis": { "filter": { "test_filter": { "type": "edge_ngram", "min_gram": 1, "max_gram": 20 } }, "analyzer": { "test_analyzer":{ "type": "custom", "tokenizer": "standard", "filter": [ "test_filter" ] } } } }

색인을 먼저 생성 후 분석기 설정을 하기 위해서는 색인을 닫고 작업을 진행해야 됨

색인 닫기: POST /test/_close

색인 열기: POST /test/_open

기본 분석기에 ngram필터를 추가하는 것으로 간단한 자동완성 기능을 구현 가능

  • 공백 기준으로 나뉜 token에 ngram을 적용

edge_ngram과 ngram의 차이점

  • ngram 시작 오프셋 고정 여부의 차이

ngram 예

  • ”분석기 테스트” => ["분", "분석", "분석기", "석", "석기", "기", "테", "테스", "테스트", "스", "스트", "트"]

edge_ngram 예

  • ”분석기 테스트” => ["분", "분석", "분석기", "테", "테스", "테스트"]

맵핑 타입 설정

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 PUT /test/_mapping/test_type {   "properties": {     "id": {       "type": "keyword"     },     "name": {       "type": "text",       "analyzer": "test_analyzer"     },     "email": {       "type": "keyword"     },     "desc": {       "type": "text"     }   } }

문자열 종류

keyword

  • 구조화된 컨텐츠 인덱싱(이메일, 호스트명, 상태값 등)

  • 일반적으로 필터링, 정렬, 집계에 사용되며 일치하는 값만 검색 가능

text

  • full-text 인덱싱(이메일 본문, 상품 설명 등)

  • 문자열을 term으로 변환하기 위해 분석기 사용

  • 분석 과정을 통해서 문자열에서 개별 단어를 검색 가능

맵핑 타입은 Elasticsearch 7.0.0. 버전에서 완전이 제거될 예정

Removal of mapping types.

맵핑 타입의 대안에 대해서

  1. 문서 타입 별로 인덱스 생성

  2. 사용자 정의 타입 필드 추가

결국 하나의 인덱스에 하나의 문서 타입을 관리 함

기존에는 여러개의 작은 인덱스 대신 하나의 큰 인덱스를 사용하기를 권장했으나 최근 버전에 맞지않는 내용임

https://www.elastic.co/blog/index-vs-type

문서 색인

ID를 지정해서 색인

1 2 3 4 5 6 7 PUT /test/test_type/1 { "id": 1, "name" : "test user", "email" : "test@test.com", "desc" : "This user is the user for test." }

이미 문서가 존재하는 경우 업데이트가 됨

색인과 업데이트를 확실히 구분하기 위해서는 op_type을 지정

PUT /test/test_type/1?op_type=create

PUT /test/test_type/1/_create

ID 자동 생성

1 2 3 4 5 6 7 POST /test/test_type { "id": 2, "name" : "test user2", "email" : "test2@test.com", "desc" : "This user is the user for test." }

위 ID는 elasticsearch에서 문서에 부여하는 ID를 의미함

ID 자동 생성을 하는 경우는 다음과 같이 랜덤한 ID가 부여됨

{
"_index": "test",
"_type": "test_type",
"_id": "qjm78WMBw3XPSt0rr7Vn",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 6
}

색인 + 타입 + 문서ID로 문서에 직접 접근이 가능함

GET /test/test_type/qjm78WMBw3XPSt0rr7Vn

 


댓글을 달아 주세요

대마도사 블로그
블로그 이미지 대마도사 님의 블로그
MENU
VISITOR 오늘15 / 전체12,225