Elasticsearch
[Elasticsearch] 엘라스틱 서치 인덱스 생성
다콩잉
2023. 4. 6. 15:38
인덱스를 생성하는 기본 쿼리
PUT /<인덱스명>
{
"settings": {
"number_of_shards": <샤드 개수>,
"number_of_replicas": <복제본 개수>,
...
},
"mappings": {
<매핑 설정>
}
}
Settings와 Mappings
- 모든 인덱스는 두 개의 정보 단위를 가지고 있는데 바로 settings와 mappings이다.
Mappings
데이터 타입
- 필드의 데이터 타입을 정의합니다. 데이터 타입에는 숫자, 문자열, 날짜 등이 있으며, 데이터의 형식과 크기에 따라 적절한 데이터 타입을 지정해야 합니다.
"properties": {
"title": {
"type": "text"
},
"price": {
"type": "integer"
},
"created_at": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"price": {
"type": "double"
}
}
검색 가능 여부, 정렬 가능 여부 등 설정
- 필드의 검색 가능 여부, 정렬 가능 여부, 필드의 유일성 여부 등을 설정할 수 있습니다.
- 데이터의 검색 및 정렬 요구사항에 따라 필드의 설정을 적절하게 지정해야 합니다.
- 필드의 설정이 검색 결과와 정확성에 직접적인 영향을 미치므로, 데이터의 특성을 고려하여 필드의 속성을 설정해야 합니다.
중첩된 객체 및 배열 설정
- 문서 내에 중첩된 객체나 배열이 있는 경우, 해당 객체나 배열의 매핑을 정의해야 합니다.
- 중첩된 객체나 배열의 구조와 데이터 타입을 정확하게 지정하여 데이터의 검색과 분석이 원활하게 이루어질 수 있도록 해야 합니다.
"mappings": {
"properties": {
"author": {
"properties": {
"first_name": {
"type": "text"
},
"last_name": {
"type": "text"
}
}
},
"tags": {
"type": "nested",
"properties": {
"name": {
"type": "keyword"
},
"score": {
"type": "integer"
}
}
}
}
}
동적 매핑 설정
- 엘라스틱 서치는 동적으로 매핑을 생성할 수 있는 기능을 제공합니다.
- 인덱스에 문서가 추가될 때, 자동으로 필드의 매핑을 생성하는 기능을 사용할 수 있습니다.
- 동적 매핑 설정을 통해 데이터의 다양성과 확장성을 고려할 수 있습니다.
"mappings": {
"dynamic": "true",
"properties": {
"title": {
"type": "text"
},
"author": {
"type": "keyword"
}
}
}
필드 별칭 설정
- 필드 별칭은 검색 요청 시 필드의 별칭을 사용하여 더 간편하고 유연한 검색을 할 수 있게 해줍니다.
- 필드 별칭을 설정하여 필드의 이름을 추상화하고, 검색 요구사항의 변경에 대응할 수 있도록 해야 합니다.
"mappings": {
"properties": {
"title": {
"type": "text"
},
"author": {
"type": "keyword"
},
"pub_date": {
"type": "alias",
"path": "published_date"
}
}
}
Settings
인덱스의 기본 설정
- 인덱스의 샤드 수와 복사본 수를 설정할 수 있습니다.
- 샤드는 인덱스의 데이터를 분산 저장하는 단위이며, 복사본은 데이터의 안정성을 보장하기 위해 사용됩니다.
- 사용자의 데이터 크기와 검색 요구사항에 맞게 적절한 값을 선택해야 합니다.
- shard는 분산해서 저장하기 때문에 replica 수보다 많게 설정하는 것이 좋으며, shard와 replica를 합한 수가 index 수가 될 수 있도록 설정하는 것을 권장합니다. (shard수+replica수=index수)
- replica는 많을수록 성능 이슈가 많이 발생하기 때문에 0 or 1 개를 사용할 것을 권장합니다.
PUT /index_name
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
성능 및 저장 옵션 설정
- 인덱스의 성능과 저장 옵션을 설정할 수 있습니다.
- 인덱스의 메모리 할당량, 검색 요청 시간 제한, 데이터 복구 설정 등을 고려하여 적절한 값을 지정해야 합니다.
- 각 설정 옵션의 의미와 영향을 이해하고 설정하는 것이 중요합니다.
PUT /index_name/_settings
{
"index": {
"refresh_interval": "30s",
"max_result_window": 10000,
"translog.flush_threshold_size": "512mb"
}
}
데이터 백업 및 복구 설정
- 인덱스의 데이터 백업과 복구 설정을 정의할 수 있습니다.
- 데이터의 안정성과 보존을 위해 정기적인 백업 설정과 데이터 손실 발생 시의 복구 방법을 고려해야 합니다.
- 백업과 복구에 사용될 스냅샷 및 리포지토리를 설정하는 것도 중요합니다.
PUT /_snapshot/my_repository
{
"type": "fs",
"settings": {
"location": "/mnt/backups/my_repository",
"compress": true}
}
Filter, Tokenizer, Analyzer
Elasticsearch에서 검색을 수행하려면, 검색어를 인덱싱할 때 사용된 텍스트를 정규화(normalization)해야합니다. 이를 위해 Elasticsearch는 filter, tokenizer, analyzer 등의 기능을 제공합니다.
Filter
Filter는 토큰 스트림에서 토큰을 처리하는 방법을 정의합니다. 주요한 filter 종류로는 소문자 변환(Lowercase), 불용어 제거(Stopwords) 및 동의어 처리(Synonyms)가 있습니다.
"filter": {
"my_stopwords": {
"type": "stop",
"stopwords": [
"the",
"a",
"an"
]
},
"my_synonyms": {
"type": "synonym",
"synonyms": [
"u.s, united states, usa",
"search, query"
]
}
}
Tokenizer
Tokenizer는 텍스트를 토큰으로 분리하는 방법을 정의합니다. 일반적인 tokenizer 종류로는 Standard, Whitespace, Keyword 등이 있습니다.
"tokenizer": {
"my_tokenizer": {
"type": "standard",
"max_token_length": 5
}
}
Analyzer
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"my_stopwords",
"my_synonyms"
]
}
}
// settings 예시
PUT /index_name
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1,
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"my_stopwords",
"my_synonyms"
]
}
},
"filter": {
"my_stopwords": {
"type": "stop",
"stopwords": [
"the",
"a",
"an"
]
},
"my_synonyms": {
"type": "synonym",
"synonyms": [
"u.s, united states, usa",
"search, query"
]
}
}
}
}
}
엘라스틱 서치 가이드북
Elastic 가이드 북 - Elastic 가이드북
7. 인덱스 설정과 매핑 - Settings & Mappings
esbook.kimjmin.net
728x90