메타 필드
엘라스틱서치에서 생성한 문서에서 제공하는 특별한 필드다. 이것은 메타데이터를 저장하는 특수 목적의 필드로서 이를 이용하면 검색 시 문서를 다양한 형태로 제어하는 것이 가능해진다.
GET drama_search/_doc/1
------------ 결과 ------------
{
"_index": "drama_search",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"dramaCd": "20240125",
"dramaNm": "제목 없음",
"dramaNmEn": "not title",
"prdtYear": "2024",
"openDt": "",
"companies": [],
"directors": [
{
"peopleNm": "홍길동"
}
]
}
}
색인된 문서를 조회한 결과로 _source 항목에 실제 문서의 정보를 담고 있고, 그 밖에 항목들은 엘라스틱서치가 직접 생성한 메타 필드다.
POST drama_search/_search
{
"size":0,
"aggs": {
"indices": {
"terms": {
"field": "_index",
"size": 10
}
}
}
}
field 부분을 변경해주면서 조회하면 된다.
메타 필드 | 비고 |
_index | 인덱스명과 해당 인덱스에 몇 개의 문서가 있는지 확인할 수 있음. |
_type | 매핑의 타입 정보와 해당 인덱스 내부에서 타입별로 몇 개의 문서가 있는지 확인할 수 있음. |
_id | 문서를 식별하는 유일한 키 값. |
_uid | 특수한 목적의 식별키로 '#' 태그를 사용해 _type과 _id값을 조합해 사용함. (내부적으로만 사용되기 때문에 검색 시 조회되는 값을 아님) |
_source | 문서의 원본 데이터를 제공한다. 일반적으로 원본 JSON 문서를 검색 결과로 표시할 때 사용함. |
_all | 색인에 사용된 모든 필드 정보를 가짐. |
_routing | 특정 문서를 특정 샤드에 저장하기 위해 사용자가 지정하는 메타 필드. |
필드 데이터 타입
1) Keyword
별도의 분석기를 거치지 않고 원문 그대로 색인하기 때문에 검색 시 필터링되는 항목, 정렬이 필요한 항목, 집계해야 하는 항목에 주로 사용된다.
'elastic search'로 입력했을 경우 elastic, search로는 절대 검색되지 않는다.
주요 파라미터로는 boost, doc_values, index, null_value, store이 있다.
boost: 필드의 가중치로, 검색 결과 정렬에 영향을 줌.
doc_values: 필드를 메모리에 로드해 캐시로 사용함. (default: true)
index: 해당 필드를 검색에 사용할지 설정 (default: ture)
null_value: 기본적으로 데이터의 값이 없으면 필드를 생성하지 않지만 null 로 필드의 값을 대체할지 설정
store: 필드 값을 필드와 별도로 _source에 저장하고 검색 가능하게 할지 설정 (default: false)
2) Text
지정된 분석기가 칼럼의 데이터를 문자열 데이터로 인식하고 분석함. 전문 검색이 가능하다는 점이 가장 큰 특징으로 전체 텍스트가 토큰화되어 생성되기 때문에 특정 단어 검색이 가능함.
PUT drama_text/_mapping
{
"properties": {
"dramaComment": {
"type": "text",
"fields": {
"dramaComment_keyword" : {
"type" : "keyword"
}
}
}
}
}
검색뿐 아니라 정렬이나 집계 연산을 사용해야할 경우, 위처럼 Text 타입과 Keyword 타입을 동시에 갖도록 멀티 필드로 설정할 수 있다.
주요 파라미터로는 analyzer, boost, fielddata, index, norms, store, search_analyzer, similarity, term_vector이 있다.
analyzer: 인덱스와 검색에 사용할 형태소 분석기를 선택 (default: Standard Analyzer)
boost: 필드의 가중치로, 검색 결과 정렬에 영향을 줌.
fielddata: 정렬, 집계, 스크립트 등에서 메모리에 저장된 필드 데이터를 사용할지 설정 (default: false)
index: 해당 필드를 검색에 사용할지 설정 (default: true)
norms: 유사도 점수를 산정할 때 필드 길이를 고려할지 결정 (default: false)
store: 필드 값을 필드와 별도로 _soruce에 저장하고 검색 가능하게 할지 설정 (default: false)
search_analyzer: 검색에 사용할 형태소 분석기를 선택
similarity: 유사도 점수를 구하는 알고리즘을 선택 (default: BM25)
term_vector: Analyzed 필드에 텀벡터를 저장할지 결정 (default: no)
3) Array
대부분 1차원으로 표현되지만 2차원으로 존재하는 경우도 있다. 모든 필드가 기본적으로 다수의 값을 가질 수 있기 때문에 매핑 설정 시 Array 타입을 명시적으로 정의하지 않는다.
4) Numeric
엘라스틱서치에서 숫자 데이터 타입은 여러 가지 종류가 제공된다. 데이터의 크기에 알맞은 타입을 제공함으로써 색인과 검색을 효율적으로 처리하기 위함.
데이터 타입 | 설명 |
long | 최솟값과 최댓값을 가지는 부호 있는 64비트 정수 |
integer | 최솟값과 최댓값을 가지는 부호 있는 32비트 정수 |
short | 최솟값과 최댓값을 가지는 부호 있는 16비트 정수 |
byte | 최솟값과 최댓값을 가지는 부호 있는 8비트 정수 |
double | 64비트 부동 소수점을 갖는 수 |
float | 32비트 부동 소수점을 갖는 수 |
half_float | 16비트 부동 소수점을 갖는 수 |
5) Date
날짜는 다양하게 표현될 수 있기 때문에 올바르게 구문 분석될 수 있게 날짜 문자열 형식을 명시적으로 설정해야 한다. 별도의 형식을 지정하지 않을 경우, 기본 형식인 'yyyy-MM-ddTHH:mm:ssZ' 로 지정된다.
6) Range
범위가 있는 데이터를 저장할 때 사용하는 타입이다. 시작과 종료 데이터만 입력해주면 된다.
PUT drama_search/_mapping
{
"showRange": {
"gte": "2024-01-01",
"lte": "2024-02-01"
}
}
7) Boolean
참과 거짓이라는 두 논리값을 가지는 데이터 타입이다.
8) Geo-Point
위도와 경도 등 위치 정보를 담은 데이터를 저장할 때 사용하는 타입이다.
PUT drama_search/_mapping
{
"title": "Happy New Year",
"Location": {
"lat" : 50.4215435,
"lon" : -1.4324234
}
}
9) IP
IP주소와 같은 데이터를 저장하는 타입으로 IPv4, IPv6 모두 지정할 수 있다.
10) Object
JSON 포맷의 문서는 내부 객체를 계층적으로 포함할 수 있다. 문서의 필드는 단순히 값을 가질 수도 있지만 복잡한 형태의 또 다른 문서를 포함하는 것도 가능하다.
PUT drama_saerch/_doc/5
{
"title": "Happy New Year",
"companies": {
"companyName": "war"
}
}
11) Nested
Object 객체 배열을 독립적으로 색인하고 질의하는 형태의 데이터 타입이다.
companyCd: 1
companyNm: "제목1"
companyCd: 2
companyNm: "제목2"
데이터가 배열 형태로 저장되면 한 필드 내의 검색은 기본적으로 OR 조건으로 검색된다. 예를 들어, 위와 같은 데이터가 있을 때 companyCd 가 1이고, compayNm 이 "제목2" 로 검색했다면 검색이 안되길 바라지만 두 개가 모두 나온다.
위 문제를 해결하기 위해서 생긴 게 바로 Nested 데이터 타입이다.
'개발 & 데이터베이스 > Elasticsearch' 카테고리의 다른 글
Elasticsearch 기초 개념과 구조 정리 (1) | 2024.01.08 |
---|---|
Docker 에 Elasticsearch, Kibana 설치 및 실행 방법 (1) | 2024.01.04 |
[Elastic search] received plaintext http traffic on an https channel, closing connection Netty4HttpChannel (0) | 2024.01.04 |