Home ElasticSearch
Post
Cancel

ElasticSearch

인덱스와 도큐먼트 생성(C)


Elastic-Search는 모든 기능이 RestAPI 형식이다. Elastic-Search의 현재 상태를 빠르게 확인하는 방법으로는 cat(compact and aligned text) API를 사용하면 된다. 다음 명령어로 cat API가 지원하는 목록을 확인한다.

1
GET _cat 

파일 구조는 index(table) > document(record) > feild(column) > value 순이다. 또한 document 를 (반드시) 하나의 index 에 포함되게 하는 작업을 인덱싱(indexing) 이라고 한다. 여기서 index2는 인덱스 이름, _doc는 엔드포인트 구분 예약어, 1은 인덱싱할 도큐먼트 고유ID이다.

1
2
3
4
5
6
PUT index2/_doc/1
{
	k1:v1,
	k2:v2,
	...
}


다이내믹 매핑 (Dynamic mapping)


Elastic Search는 데이터 타입을 지정하지 않아도, 도큐먼트의 필드와 값을 보고 자동으로 지정한다. 또한 혹시 모를 사용자 입력 실수가 있을 수 있으므로, 자동으로 데이터 형변환을 진행한다.

  • 숫자필드에 문자열 입력 시 숫자로 변환
  • 정수필드에 소수가 입력되면 자리 무시

인덱스와 도큐먼트 생성,수정,삭제(RUD)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

(R)
// 도큐먼트 아이디를 이용해 조회하는 방법
GET index2/_doc/1 

// 엘라스틱의 쿼리DSL(Domain Specific Language)을 이용해 검색하는 방법
GET index2/_search 

(U) -> 수정은 워낙 비용이 많이 들기 때문에 권장하지 않음
// _doc id 를 이용해서 덮어쓰기
PUT index2/_doc/1
{
  "name": "mike2",
  "age": 2,
  "gender": "male2"
}

// update API를 사용해서 업데이트
POST index2/_update/1
{
  "doc": {
    "name" : "LEE"
  }
}

(D)
DELETE index2/_doc/2


응답 메세지 코드


코드상태해경방법
200,201정상적으로 수행함 
4xx클라이언트 오류클라이언트에서 문제점 수정
404요청한 리소스가 없음인덱스나 도큐먼트가 존재하는지 확인
405요청 메소드(GET,POST 등)을 지원하지 않음API 사용법 확인
429요청 과부화(busy)재전송, 노드 추가 등
5xx서버 오류es 로그 확인


벌크데이터


  • 데이터 CRUD 를 할 때는 REST API 를 호출해 하나하나 도큐먼트를 요청하는 것 보다 벌크(bulk) 로 한번에 요청하는 것이 효과적이다.
  • bulk api는 읽기는 지원하지 않고, CUD 만 지원한다.
  • 복수의 JSON 구조를 줄바꿈 문자열로 구분하는 NDJSON 형태이다.
1
2
3
4
5
POST _bulk
{"index" : {"_index":"index2", "_id":"4"}}
{"name": "park", "age": 30, "gender": "female"}
{"index" : {"_index":"index2", "_id":"5"}}
{"name": "park2", "age": 32, "gender": "emale"}


벌크데이터 파일 전송


1
2
3
4
5
// bulk_test
{"index" : {"_index":"index2", "_id":"4"}}
{"name": "park", "age": 30, "gender": "female"}
{"index" : {"_index":"index2", "_id":"5"}}
{"name": "park2", "age": 32, "gender": "emale"}
  • curl 을 날려서 파일로 bulk
    1
    
    curl -XPOST http://host.docker.internal:9200/_bulk --data-binary @bulk_test -H 'Content-Type: application/x-ndjson'
    


mapping


데이터베이스의 스키마 역할을 하며, JSON 데이터를 루씬이 이해할 수 있도록 빠르게 변환하는 역할을 한다.

  • 다이내믹 매핑 : elastic 이 자동으로 매핑
    1
    
      GET index2/_mapping
    
  • 명시적 매핑 : 사용자가 직접 설정. 저장할 데이터를 확실히 알고 있다면 인덱스를 생성할 떄 직접 매핑하는 것이 좋다.
    • 하지만 이미 정의된 필드를 수정하거나 삭제할 수는 없다.
    • mapping 을 잘 사용한다면 elasticsearch 의 인덱스 성능을 끌어올릴 수 있다.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
        PUT index3
        {
        "mappings": {
            "properties": {
                "age": {"type": "short"},
                "name": {"type": "text"},
                "gender": {"type": "keyword"}
            }
        }
        }
      

text and keyword

  • text : 전문 검색이 필요한 데이터로, 텍스트 분석기가 텍스트를 작은 단위로 분리한다. > 매핑 파라미터로 집계나 정렬을 사용하는 경우 메모리를 많이 사용한다.

    [“beautiful” , “day”]

  • keyword : 정렬이나 집계에 사용되는 데이터로, 분석을 하지 않고 원문 통째로 인덱싱한다.

    [“beautiful day”]

multi-field

  • 멀티필드는 단일 필드 입력에 대해 여러 하위필드(keyword, text 동시사용 등)를 정의하는 기능이다.
  • fields 라는 매핑파라미터가 사용된다. (ex: 전문검색이 필요하면서 정렬도 필요한 경우)
  • multi-field 사용방법 ```http PUT multifield_index { “mappings”: { “properties”: { “message”:{“type”: “text”}, “contents” : { “type”: “binary”, “fields”: { “keyword”: {“type”: “keyword”} } } } } }

GET multifield_index2/_search { “query”: { “term”: { “contents.keyword”: “day” } } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<br>

### index template

인덱스 템플릿은 주로 설정이 동일한 복수의 인덱스를 만들 때 사용한다. 관리 편의성 및 성능을 위해 인덱스를 파티셔닝하는 경우, 해당
인덱스들은 설정이 같아야 한다. 주로 `mapping`, `setting` 을 많이 사용한다. beats 와 같은 수집툴에서 엘라스틱으로 데이터를 보낼 때
해당 템플릿을 많이 사용한다.

```http
PUT _index_template/test_template
{
  "index_patterns": ["test_*"],  // 해당 패턴에 매칭되는 인덱스에 이 템플릿이 적용된다.(단, 템플릿 이전에 존재하던 인덱스는 적용이 안된다)
  "priority": 1,                 // 인덱스에 매칭되는 템플릿이 둘 이상일때 템플릿 적용되는 우선순위 
  "template": {                  // settings, mappings 를 설정한다.
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 1
    }, 
    "mappings": {
      "properties": {
        "name": {"type": "text"},
        "age": {"type": "short"},
        "gender": {"type": "keyword"}
      }
    }
  }
}


dynamic template

dynamic template 은 매핑을 정확하게 정할 수 없거나 대략적인 데이터 구조만 알고 있을 때 사용할 수 있는 방법이다.

1
2
3
4
5
6
7
8
9
10
11
12
PUT dynamic_index1
{
  "mappings": {
    "dynamic_templates": [{
      "my_string_fields" : {
        "match_mapping_type" : "string",
        "mapping" : {"type": "keyword"}
      }
    }
    ]
  }
}


Analyzer

elasticsearch 에서는 전문 검색을 지원하기 위해 역인덱싱 (장문의 문자영을 쪼개 나온 토큰을 인덱싱 하는것) 기술을 사용한다. 이를 위해 사용하는 것이 분석기이다.

https://www.elastic.co/guide/en/elasticsearch/reference/current/analyzer-anatomy.html

크게 1) character2) tokenizer3) token filters 로 이루어져 있다.

1) character (옵션) 2) tokenizer (필수) 3) token filter (옵션)

This post is licensed under CC BY 4.0 by the author.