시뻘건 개발 도전기

데이터 모델링: 메타 필드 본문

Reading/엘라스틱서치 실무 가이드

데이터 모델링: 메타 필드

시뻘건볼때기 2023. 12. 8. 23:05
반응형

메타 필드(Meta Fields)는 메타 데이터를 저장하는 특수 목적의 필드로서 검색시 문서를 다양한 형태로 제어하기 위해 사용되는 필드다. 아래 예제에서 보았을 때, 실제 문서 정보를 담고있는 항목은 _source항목이다. 그 밖에 _index, _type, _id, _score 항목은 엘라스틱 서치가 직접 생성한 메타 필드다. (언더바('_')로 시작하는 항목은 전부 다 메타필드라고 봐도 무방할 듯..?)

{
	"_index": "movie_search",
	"_type": "_doc",
	"_id": "8",
	"_score": 1,
	"_source": {
		"movieCd": "20178401",
		"movieNm":"검객",
		"movieNmEn": "",
		"prdtYear": "2017",
		"openDt": "",
		"typeNm":"장편",
		"prdtStatNm":"후반작업",
		"nationAlt":"한국",
		"genreAlt":"사극,액션",
	}
}

 

_index

문서가 속한 인덱스의 이름을 담고있다. 이를 이용해 검색된 문서의 인덱스명을 알 수 있으며, 해당 인덱스에 몇 개의 문서가 있는지 확인할 수 있다. 집계 api를 통해 인덱스별 카운트 정보를 확인할 수 있다.

{
	(... 생략 ...)
	"aggregations": {
		"indices": {
			"doc_count_error_upper_bound": 0,
			"sum_other_doc_count": 0,
			"buckets": [
				{
					"key": "movie_search",
					"doc_count": 29507
				}
			]
		}
	}
}

 

_type

문서가 속한 맵핑의 타입 정보를 담고있다. 인덱스 내부에서 타입별로 몇 개의 문서가 있는지 확인할 수 있다. 집계 api를 통해 타입별 카운트 정보를 확인할 수 있다.

{
	(... 생략 ...)
	"aggregations": {
		"indices": {
			"doc_count_error_upper_bound": 0,
			"sum_other_doc_count": 0,
			"buckets": [
            	{
					"key": "_doc",
					"doc_count": 29507
                }
			]
		}
	}
}

 

_id

문서를 식별하는 문서 식별자다. 한 인덱스에서 색인된 문서마다 서로 다른 키값을 가진다. 집계 api를 통해 검색 질의를 하면 키 값에 대응하는 모든 문서가 출력된다.

POST movie_search/_search
{
	"size":0,
	"aggs": {
		"indices": {
			"terms": {
				"field": "_id",
				"size": 10
			}
		}
	}
}

# result
{
	(... 생략 ...)
	"aggregations": {
		"indices": {
			"doc_count_error_upper_bound": 5,
			"sum_other_doc_count": 29497,
			"buckets": [
				{
					"key": "20173732",
					"doc_count": 1
				}, {
					"key": "20173733",
                    "doc_count": 1
                }, {
                (... 생략 ...)
                }
			]
		}
	}
}

 

_uid

"#"태그를 사용해 _type과 _id 값을 조합해 사용한다. 하지만 내부적으로만 사용되기 때문에 검색시 조회되는 값은 아니다.

POST movie_search/_search
{
	"size":0,
	"aggs": {
		"indices": {
			"terms": {
				"field": "_uid",
				"size": 10
			}
		}
	}
}

# result
{
	(... 생략 ...)
	"aggregations": {
		"indices": {
			"doc_count_error_upper_bound": 5,
			"sum_other_doc_count": 29497,
			"buckets": [
				{
					"key": "_doc#20173732",
					"doc_count": 1
				}, {
					"key": "doc#20173733",
                    "doc_count": 1
                }, {
                (... 생략 ...)
                }
			]
		}
	}
}

 

_source

문서의 원본 데이터로써 원본 json 문서를 검색결과로 표시할 때 사용한다. _reindex api나 스크립트를 사용해 해당 값을 계산할 때 해당 메타필드를 활용할 수 있다. movie_search 인덱스의 movieCd값이 "20173732"인 값만 조회해서 재색인한다고 가정했을 때 재색인되는 인덱스에서 prdtYear 값을 변경해보자. 변경 후 집계 api를 통해 조회해본다면 prdtYear 값의 차이를 볼 수 있을 것이다.

# 인덱스 생성
PUT /reindex_movie

# 재색인
POST /_reindex
{
	"source": {
		"index": "movie_search",
		"query": {
			"match": {
            	"movieCd": "20173732"
			}
		}
	},
	"dest": {
    	"index": "reindex_movie"
	},
	"script": {
		"source": "ctx._source.prdtYear++"	# +1
    }
}

 

_all

색인에 사용된 모든 필드의 정보를 가진 메타필드다. 모든 필드의 내용이 하나의 텍스트로 합쳐져서 제공된다. 문서 전체 필드에서 특정 키워드를 검색할 때 사용할 수 있다. 아래와 같은 문서가 색인되었다고 했을 때, _all 메타 필드에는 4개 필드의 값이 모두 합쳐져서 하나의 문자열 "20173732 살아남은 아이 Last Child 2017"이 생성되어 저장된다. 그렇기 때문에 통합검색을 구현할 때 유리할 수 있다. _all 메타필드는 데이터 크기를 너무 많이 차지하는 문제가 있어서 엘라스틱서치 6.0 부터 deprecated되었다. 대신 copy_to 파라미터를 사용하면 _all과 동일한 효과를 얻을 수 있다.

PUT movie_index_meta_fields_all/_doc/20173732
{
	"movieCd": "20173732",
	"movieNm":"살아남은 아이",
	"movieNmEn": "Last Child",
	"prdtYear": "2017"
}

 

_routing

특정 문서를 특정 샤드에 저장하기 위해 사용자가 지정하는 메타필드다. 기본적으로 색인하면 해당 문서는 다음 수식에 따라 문서 id를 이용해 문서가 색인될 샤드를 결정한다. 별도의 설정없이 문서를 색인하면 문서는 샤드에 골고루 분산되어 저장된된다.

Hash (document_id) % num_of_shards

 

특별하게 특정 샤드에 특정 문서를 저장하고싶다면 아래와같이 _routing을 사용할 수 있다. 색인할 때 해당 문서들은 동일한 라우팅 id를 지정한다. 문서 id를 사용하는 대신 파라미터로 입력한 _routing 값이 샤드를 결정하는데 사용된다.

Hash (_routing) % num_of_shards

 

예를 들어 _routing값을 ko로 지정해 문서를 색인하고 _routing 값을 지정해주어 확인해보자.

PUT movie_routing/_doc/1?routing-ko
{
	"repGenreNm":"한국어",
	"movieNm":"살아남은 아이"
}

POST movie_routing/_doc/_search?routing-ko
"hits" : {
	"total": 3,
	"max_score": 1.0,
	"hits" : [
		{
			"_index": "movie_routing",
			"_type" : "_doc",
			"_id" : "1",
			"_score": 1.0,
			"_routing": "ko",
			"_source": {
				"repGenreNm":"한국어",
				"movieNm" : "살아남은 아이"
			}
		}
	]
}

 

반응형

'Reading > 엘라스틱서치 실무 가이드' 카테고리의 다른 글

데이터 모델링: 분석기  (1) 2023.12.10
데이터 모델링: 데이터 타입  (0) 2023.12.09
데이터 모델링: 맵핑 api  (2) 2023.12.05
엘라스틱서치 api  (1) 2023.12.04
엘라스틱서치 용어  (1) 2023.12.01
Comments