반응형
인덱스 생성
1. 인덱스 생성: 샤드, 레플리카 설정
1.1 인덱스 생성: shards=3, replicas=2
PUT /$index
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
}
- shards 개수는 생성 이후 변경 불가능하고 replicas 개수는 변경 가능합니다.
1.2 인덱스 생성: default shards, replicas
// default shards: 1, replicas: 0
PUT /$index
2. 인덱스 생성: 스키마(mapping) 생성 + 샤드, 레플리카
2.1 스키마리스(schemaless)
Elastic Search는 RDB 처럼 데이터를 insert하였을 때 테이블이 없다면데이터가 안들어가는 것이 아니라 데이터 추가와 동시에 인덱스가 생성이 되는 기능을 제공합니다. 이를 스키마리스(schemaless)라고 합니다.
또한 Json형식의 Key Value값을 분석하여 자동으로 필드명과 속성 정보를 생성해 줍니다.
따라서 필드명과 타입을 생성하는 것보다 오히려 Json 형식을 읽어들여 생성하는 편이 오류를 줄여줍니다.
하지만 일부 특별한 타입의 경우 직접 지정해주지 않으면 원하는 타입으로 들어가지 않을 수 있으니, 해당 타입의 경우 인덱스를 생성하며 필드 타입을 지정해주어야 합니다.
- 일부 특별한 타입: data, geo_point, epochtime(epochmiltime) 등
- 보다 자세한 타입 지정은 [DB] Elasticsearch 데이터 타입 을 참고해주시기 바랍니다.
2.2 인덱스 생성: 스키마(mapping) 생성 + 샤드, 레플리카
PUT /$index
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
}
},
"mappings": {
"properties": {
"manager": {
"properties": {
"age": { "type": "integer" },
"name": { "type": "text" }
}
},
"employees": {
"type": "nested",
"properties": {
"age": { "type": "integer" },
"name": { "type": "text" }
}
}
}
}
}
여기서 mapping 내 properties 가 들어가는 위치는?
- Properties in the top-level mappings definition.
- Properties under the manager object field (object 형식).
- Properties under the employees nested field (list 형식).
PUT $index/_doc/$field
{
"region": "US",
"manager": {
"name": "Alice White",
"age": 30
},
"employees": [
{
"name": "John Smith",
"age": 34
},
{
"name": "Peter Brown",
"age": 26
}
]
}
3. 인덱스 생성 확인
3.1 인덱스 확인: 샤드, 레플리카 설정
GET _cat/shards/$index?pretty&v
index shard prirep state docs store ip node
mbr 0 p STARTED 324629 4.2gb 172.31.0.3 c791d52e1b4d
mbr 0 r UNASSIGNED
3.2 인덱스 확인: mapping(스키마) 정보 확인
GET mbr/_mapping
4. 인덱스 내 스키마 정보 수정
기존에 있는 field 의 mapping type을 변경하려고 할 경우, 다음과 같은 exception 이 발생합니다.
exception: resource_already_exists_exception
이를 해결하기 위해 _reindex API를 사용합니다. _reindex는새로운 index를 생성한 후 적용하면 기존의 index 내 데이터를 복제하면 해당 index에 맞추어 매핑되어 들어갑니다.
4.1 다른이름의 index를 생성
PUT twitte2
{
"mappings": {
"tweet": {
"properties": {
"createDate": {
"type": "date"
}
}
}
}
}
4.2 reindex API: 기존의 index 내 데이터를 복제
POST _reindex
{
"source": {
"index": "twitter"
},
"dest": {
"index": "twitte2"
}
}
인덱스 삭제
주의: 인덱스를 덤프해놓지 않는 이상 데이터나 인덱스 삭제시 복구가 어려우니 꼭 삭제 명령을 테스트 후 진행하시기 바랍니다.
1. 데이터 삭제
1.1 인덱스 내 특정 데이터 삭제
- DELETE <index>/_doc/<id> 형태
DELETE $index/_doc/$id
1.2 인덱스 내 데이터 전체 삭제
- 특정 쿼리에 해당하는 데이터 삭제하기 위해서는 "query" 내에 퀴리문을 작성해야 합니다.
- 쿼리로 삭제된 데이터의 갯수를 리턴합니다.
POST $index/_doc/_delete_by_query
{
"query": {
"match_all": {}
}
}
DELETE /$index/_doc/_query
{
"query": {
"match_all": {}
}
}
2. 인덱스 삭제
2.1 인덱스 내 특정 필드 삭제
POST /$index/_doc/_update_by_query
{
"script" : "ctx._source.remove('필드명')",
"query" : {
"exists": { "field": "필드명" }
}
}
2.2 인덱스 전체 삭제
DELETE /$index
인덱스 삭제 후 재생성 (맵핑 재생성)
💡 다음의 과정을 통해 재생성해야 생성한 맵핑에 맞게 검색할 수 있습니다.
- Index Management 에서 특정 인덱스 삭제하고,
- Index Management 에서 index 생성하고,
- Index Patterns→ create index patten으로 생성한 인덱스를 선택해야함.
참고
- [Elasticsearch Official] mapping properties: https://www.elastic.co/guide/en/elasticsearch/reference/current/properties.html
- [Elasticsearch] 이미 존재하는 Field의 Mapping type 변경하기: https://kyungseop.tistory.com/9
- ElasticSearch Index생성 및 주의할내용: https://velog.io/@yundleyundle/ElasticSearch-Index%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%A3%BC%EC%9D%98%ED%95%A0%EB%82%B4%EC%9A%A9
반응형
'Study: DeveloperTools(DevTool) > DevTool: NoSQL(Elastic, Mongo)' 카테고리의 다른 글
[Elastic] ELK Stack이란? 기본 개념 적립 (0) | 2022.08.30 |
---|---|
[Elastic] Elasticsearch 데이터 타입: 정확한 데이터 타입으로 입력해야 분류, 연산, 검색 가능! (0) | 2022.08.26 |
[Elastic] Elasticsearch 구문 검색: 기본 Query 정리(Elastic Query DSL) (0) | 2022.08.18 |
[Elastic] Elasticsearch 구문 검색: 원하는 데이터를 삭제하자 (0) | 2022.08.03 |
[Elastic] Elasticsearch 구문 검색(_search API): 대용량 데이터를 검색하자 (feat. scroll) (0) | 2022.08.02 |