인덱스와 도큐먼트 생성(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) character | 2) tokenizer | 3) token filters 로 이루어져 있다. |
1) character (옵션) 2) tokenizer (필수) 3) token filter (옵션)