엘라스틱서치에서 인덱스는 RDB의 테이블과 비슷한 역할을 한다. 또한 엘라스틱서치는 기본적으로 스키마리스이나, 실제 운용하는데 있어서는 mapping을 통해 스키마를 정의 하여 사용한다. 인덱스 추가 및 스키마 정의를 위해 인덱스 API 및 매핑API 를 사용 한다.
인덱스 추가
PUT /movie
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
},
"mappings": {
"properties": {
"movieCd": {"type": "integer"},
"movieNm": {"type": "text"},
"movieNmEn": {"type": "text"},
"prdtYear": {"type": "integer"},
"openDt": {"type": "date"},
"typeNm": {"type": "keyword"},
"prdtStatNm": {"type": "keyword"},
"nationAlt": {"type": "keyword"},
"genreAlt": {"type": "keyword"},
"repNationNm": {"type": "keyword"},
"repGenreNm": {"type": "keyword"}
}
}
}
Mapping 모듈
매핑은 도큐먼트가 어떻게 저장되고, 어떤 필드들이 인덱싱 되는 지 인덱스를 추가할 때 mappings (mapping module)를 이용해 매핑 유형에 대해 정의한다. 각 필드들은 콜렉션으로, 별도 세팅 없이 여러 개를 가질 수 있다.
인덱스 생성 시 매핑 적용
인덱스 생성 시에 매핑을 적용할 수 있다.
PUT /my-index
{
"mappings": {
"properties": {
"age": {"type": "integer"},
"email": {"type": "keyword"},
"name": {"type": "text"}
}
}
}
기존 인덱스에 매핑 추가
PUT my-index/_mapping
{
"properties": {
"phoneNumber": {
"type": "keyword",
"index": false
}
}
}
필드 매핑 수정
mapping parameter를 제외 하고 기존 필드에 대한 매핑을 수정할 수는 없다. 기존 필드를 수정 하려는 경우 reindex등 다른 방법을 고려해야 한다.
매핑 정보 조회
GET /my-index/_mapping
//email 필드만 조회
GET /my-index/_mapping/field/email
매핑 프로퍼티(파라미터)
매핑 프로퍼티는 mappings.properties에 들어갈 항목으로, 도큐먼트가 어떻게 저장되는지에 대해 다룬다. 데이터 타입을 정의할 수 있고, 텍스트인 경우 저장 시 어떤 분석기를 사용하는지 등을 정의할 수 있다.
PUT my-index
{
"settings": {...},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard",
"search_analyzer": "my_analyzer",
"search_quote_analyzer": "my_analyzer"
}
}
}
}
type: (string, 타입) 해당 필드의 타입을 정의한다.
analyzer: (string, 분석기명) 인덱싱 시 사용하는 분석기 이다.
search_analyzer: (string, 분석기명) 검색시 사용하는 분석기 이다. 설정하지 않으면 analyzer를 사용한다.
search_quote_analyzer: (string, 분석기명) 인용부호로 묶인 구문을 분석할 때 사용하는 분석기 이다.
coerce: (boolean) coerce가 적용되는 경우 필드의 타입에 맞는 데이터가 강제된다. 타입에 맞지 않는 경우 인덱싱에 실패한다.
copy_to: (string, 필드명) 인덱싱 될 때 해당 필드로 값이 복사되어 인덱싱 된다.
PUT my-index
{
"mappings": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}
위와 같이 인덱싱 하는 경우, full_name에 쿼리를 통해 first_name, last_name 두 필드 모두에게 쿼리하는 효과를 낼 수 있다.
doc_values: (boolean, default true) doc_values는 인덱싱 시 on-disk data structure로 저장 된다. _source에 저장되는 데이터와 동일한 데이터를 저장 하지만, aggregation이나 sorting에 더 효율적인 열 중심 데이터 구조로 저장 된다. 따라서 aggregation, sorting 시 더 효율적으로 사용될 수 있다.
PUT my-index-000001
{
"mappings": {
"properties": {
"user_name": {
"type": "long"
},
"user_name_doc_value": {
"type": "long",
"index": false
}
}
}
}
user_name필드는 long필드로 _source와 doc_values를 둘 다 갖는다. user_name_doc_value 필드는 index: false를 통해 doc_value 값만을 저장 한다.
dynamic: (boolean) 매핑에 지정되지 않은 필드에 동적으로 데이터를 인덱싱 할 수 있는지 여부 값이다. 기본적으로 dynamic 프로퍼티는 부모 속성을 상속 받는다. 여러 필드를 갖는 필드인 경우, 동적으로 필드를 받고 싶을 때 사용한다.
PUT my-index
{
"mappings": {
"dynamic": false,
"properties": {
"user": {
"properties": {
"name": {
"type": "text"
},
"social_networks": {
"dynamic": true,
"properties": {}
}
}
}
}
}
}
social_networks 필드는 동적으로 필드를 받을 수 있다.
eager_global_ordinals: (boolean) 인덱싱 되는 시점에 필드에 대한 global ordinal을 미리 설정 해두는지 여부 값이다.
global ordinal??
엘라스틱 서치는 성능 향상을 위해 인덱싱 시점에 각 텀마다 ordinal을 지정하고, bucket 어그리게이션 등에서 ordinal로만 그룹화 한 후, 이후에 실제 term을 가지고 온다. ordinal은 각 샤드마다 고유하고, 모든 샤드를 통틀어서 정해진 ordinal을 global ordinal 이라고 한다.
eager_global_ordinals 속성을 true로 하면, 검색 시점에는 ordinal 계산이 필요 없기 때문에 성능 향상이 되지만, 인덱싱 시점에e는 각 데이터 인덱싱 및 데이터 변경마다 ordinal계산이 필요하므로 성능이 저하된다.
enabled: (boolean) 인덱싱 처리 여부에 대한 설정이다. false처리 하는 경우 인덱싱 처리 되지 않아 검색에 사용할 순 없으나, 해당 데이터 조회시 _source 필드에 출력은 된다.
format: (string) 날짜에 대한 포맷 설정이다.
ignore_above: (integer) 해당 설정보다 길이가 긴 스트링은 저장이 되지 않는다. 스트링 array 인 경우, 각각 스트링마다 해당 validation이 적용 된다.
ignore_malformed: (boolean) 기본적으로 엘라스틱서치는 올바르지 않은 데이터가 인덱싱 될 경우 excpetion이 발생하고, 해당 도큐먼트는 인덱싱 되지 않는다. 해당 설정을 true로 할 경우, 해당 필드만 무시된 채로 도큐먼트는 정상적으로 인덱싱 된다.
index: (boolean) 인덱싱 처리 여부를 설정한다. false로 지정 되면 인덱싱 처리가 되지 않는다.
fields: 한개의 필드 데이터에 대해 여러 매핑 정보를 적용시키고 싶을 때 사용한다.
PUT my-index
{
"mappings": {
"properties": {
"name": {
"type": "text",
"fields": {
"english": {
"type": "text",
"analyzer": "english"
},
"raw": {
"type": "keyword"
}
}
}
}
}
}
- name 필드는 텍스트 타입으로, standard 분석기로 인덱싱 된다.
- name.english 필드는 텍스트 타입으로, english 분석기로 인덱싱 된다.
- name.raw는 keyword 타입으로 인덱싱 된다.
normalizer: (string) 노멀라이저를 설정한다. keyword필드에 설정할 수 있다. text필드의 분석기와 비슷하나, 토큰화처리를 하지 않는다.
norms: (boolean) 엘라스틱 서치 도큐먼트는 기본적으로 스코어링 처리를 위해 필드 하나당 1바이트 정도를 사용한다. 스코어링이 필요없는 경우 norms: false를 주어 불필요한 용량을 사용하지 않도록 할 수 있다.
null_value: (string) null값인 경우 인덱싱 될 값을 설정한다.
position_increment_gap: (integer) 다중값(배열) 로 데이터를 인덱싱 할때, 각 배열 엘리먼트 간 갭 차이를 설정한다. 예를들어 해당 속성 값이 100 일 경우 ["john abraham", "lincoln smith"] 를 인덱싱 하면
- john: positon 1
- abraham: position 2
- lincoln: position 103
- smith: position 104
식이다. 갭 차이가 충분히 크지 않다면, "abraham lincoln" 과 같이 다른 엘리먼트에 포함된 검색에도 결과가 도출될 수 있다.
properties: 하위 오브젝트 프로퍼티를 선언할 때 사용한다.
term_vector: 텀벡터는 분석기에 의해 텍스트가 분석되었을 때 가지는 정보이다. 텀 리스트, 각 텀들의 위치 정보, 텀의 시작과 위치 정보(offset) 등을 가진다.
- no: 텀벡터를 수집하지 않는다.
- yes: 텀정보 만을 저장한다.
- with_positions: 텀 정보와 포지션 정보를 수집한다.
- with_offsets: 텀 정보와 오프셋 정보를 수집한다.
- with_positions_offsets: 텀, 포지션, 오프셋을 수집한다.
- with_positions_payloads: 텀정보, 포지션, 페이로드를 수집한다.
- with_positions_offsets_payloads: 텀정보, 포지션, 오프셋, 페이로드를 수집한다.
'Elasticsearch' 카테고리의 다른 글
엘라스틱서치 인덱스 Settings (4) | 2023.11.11 |
---|---|
Elasticsearch Index Template (0) | 2023.11.07 |
엘라스틱 서치 노드의 종류 (0) | 2023.10.30 |