Intro::
์ธ๋ฑ์ค์ ๋จ์์์ ์ด๋ฃจ์ด์ง๋ ์ค์ ๋ค๊ณผ ๋ฐ์ดํฐ ๋ช ์ธ์ธ ์ธ๋ฑ์ค ๋งคํ์ ๋ํด ์์๋ด ์๋ค.
Settings
์ธ๋ฑ์ค๋ฅผ ์ฒ์ ์์ฑํ ๋ค GET <์ธ๋ฑ์ค๋ช
> ์ผ๋ก ์กฐํํ๋ฉด settings์ mappings ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
GET my_index/_settings
๋ GET my_index/_mappings
๋ฅผ ์ถ๊ฐํด์ ๋ณผ ์ ์์ต๋๋ค. ย
number_of_shards, number_of_replicas
ํ๋ผ์ด๋จธ๋ฆฌ ์ค๋ ์์ ๋ ํ๋ฆฌ์นด๋ number_of_shards, number_of_replicas์์ ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋๋ถ๋ถ์ ์ค์ ๋ค์ settins ์๋์ index ์๋ ์ค์ ์ ๋ช
์๋๋๋ฐ index ๋ ๋ฒจ์ ์๋ตํ๊ณ ์
๋ ฅํ์ฌ๋ ์ ์ ์
๋ ฅ์ด ๋ฉ๋๋ค.
// my_index ์ธ๋ฑ์ค ์์ฑ - ๊ดํธ { } ์์ ํ์ ๊ฐ ์ง์ PUT my_index { "settings": { "index": { "number_of_shards": 3, "number_of_replicas": 1 } } } // my_index ์ธ๋ฑ์ค ์์ฑ - ๋ง์นจํ . ์ผ๋ก ํ์ ๊ฐ ์ง์ PUT my_index { "settings": { "index.number_of_shards": 3, "index.number_of_replicas": 1 } } // my_index ์ธ๋ฑ์ค ์์ฑ - index ์๋ต PUT my_index { "settings": { "number_of_shards": 3, "number_of_replicas": 1 } }
- number_of_shard
- ์ฒ์ ์์ฑ ํ ๋ฐ๊ฟ ์ ์๋ค.
- shrink API ํน์ split API๋ฅผ ์ด์ฉํด์ ์ค๋ ์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง๋ง ์ธ๋ฑ์ค๋ฅผ closeํด์ผ ํ๊ณ , ํ์ผ ์ฌ๋ฐฐ์นํ๋ ์์ ์ ํ๋ ๋ณต์กํ ๊ณผ์ ์ด๊ธฐ์ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด ์ข๋ค.
- number_of_replicas
- ๋ค์ด๋๋ฏนํ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
// my_index ์ธ๋ฑ์ค์ number_of_replicas ๊ฐ ๋ณ๊ฒฝ PUT my_index/_settings { "number_of_replicas": 2 }
ย
refresh_interval
Elasticsearch ์์ ์ธ๊ทธ๋จผํธ๊ฐ ๋ง๋ค์ด์ง๋ ๋ฆฌํ๋ ์ ํ์์ ์ค์ ํ๋ ๊ฐ์ธ๋ฐ ๊ธฐ๋ณธ์ 1์ด(1s) ์
๋๋ค. number_of_replicas์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค์ด๋๋ฏน ์ค์ ์
๋๋ค.
PUT my_index { "settings": { "refresh_interval": "30s" } }
ย
analyzer, tokenizer, filter
PUT my_index { "settings": { "analysis": { "analyzer": { "my_analyzer": { "type": "custom", "char_flter": [ "...", "..." ... ] "tokenizer": "...", "filter": [ "...", "..." ... ] } }, "char_filter":{ "my_char_filter":{ "type": "โฆ" ... } } "tokenizer": { "my_tokenizer":{ "type": "โฆ" ... } }, "filter": { "my_token_filter": { "type": "โฆ" ... } } } } }
ย
๋งคํ - Mappings
๋์ (Dynamic) ๋งคํ
Elasticsearch๋ ๋์ ๋งคํ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ ์ ์ํ์ง ์์๋ ์ธ๋ฑ์ค์ ๋ํ๋จผํธ๋ฅผ ์๋ก ์ถ๊ฐํ๋ฉด ์๋์ผ๋ก ๋งคํ์ด ์์ฑ๋ฉ๋๋ค.
์์๋ก ์ธ๋ฑ์ค๊ฐ ์๋ ์ํ์์ ๋ํ๋จผํธ๋ฅผ ์ธ๋ฑ์ค์ ์ ๋ ฅํ๋ฉด ์๋์ผ๋ก ๋งคํ์ด ๋ฉ๋๋ค.
// books ์ธ๋ฑ์ค๊ฐ ์๋ ์ํ์์ ๋ํ๋จผํธ ์ ๋ ฅ PUT books/_doc/1 { "title": "Romeo and Juliet", "author": "William Shakespeare", "category": "Tragedies", "publish_date": "1562-12-01T00:00:00", "pages": 125 }
// books ์ธ๋ฑ์ค์ ๋งคํ ํ์ธ GET books/_mapping
// books ์ธ๋ฑ์ค์ ๋งคํ ํ์ธ ๊ฒฐ๊ณผ { "books" : { "mappings" : { "properties" : { "author" : {// ํ๋๊ฐ "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "category" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "pages" : { "type" : "long" }, "publish_date" : { "type" : "date" }, "title" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } } } } } }
๊ฐ ํ๋๊ฐ์์ ๊ฒฐ๊ตญ์ ํ
์ ๊ฒ์ํด ๋์๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค.
ย
๋งคํ ์ ์
// ์๋ก์ด ์ธ๋ฑ์ค ์ค์ PUT <์ธ๋ฑ์ค๋ช > { "mappings": { "properties": { "<ํ๋๋ช >":{ "type": "<ํ๋ ํ์ >" โฆ <ํ๋ ์ค์ > } โฆ } } } // ๊ธฐ์กด ๋งคํ์ ํ๋ ์ถ๊ฐ PUT <์ธ๋ฑ์ค๋ช >/_mapping { "properties": { "<์ถ๊ฐํ ํ๋๋ช >": {// ๊ธฐ์กด ํ๋๋ช ๊ณผ ์ค๋ณต๋๋ค๋ฉด ์ค๋ฅ ๋ฐ์ "type": "<ํ๋ ํ์ >" โฆ <ํ๋ ์ค์ > } } }
์ด๋ฏธ ๋ง๋ค์ด์ง ๋งคํ์ ํ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง ์ด๋ฏธ ๋ง๋ค์ด์ง ํ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ํ๋์ ํ์
๋ฐ ์ค์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ ํฉ๋๋ค. ํ๋์ ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ฅผ ์๋ก ์ ์ํ๊ณ ๊ธฐ์กด ์ธ๋ฑ์ค์ ๊ฐ์ ์ ์ธ๋ฑ์ค์ ๋ชจ๋ ์ฌ ์์ธ ํด์ผํฉ๋๋ค.
์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ๋ ๋ ๊ธฐ์กด ๋งคํ์ ์๋ ํ๋๊ฐ์ด๋ผ๋ฉด ์๋์ผ๋ก ์ถ๊ฐ๊ฐ ๋ฉ๋๋ค.
ย
๋ฌธ์์ด - text, keyword
Elasticsearch์์ ์ ์ธ ๊ฐ๋ฅํ ๋ฌธ์์ด ํ์
์๋ text, keyword ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
text
์
๋ ฅ๋ ๋ฌธ์์ด์ ํ
๋จ์๋ก ์ชผ๊ฐ์ด ์ญ ์์ธ๊ตฌ์กฐ๋ฅผ ๋ง๋ญ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํํ
์คํธ ๊ฒ์์ ์ฌ์ฉํ ๋ฌธ์์ด ํ๋๋ค์ textํ์
์ผ๋ก ์ง์ ํฉ๋๋ค.
"analyzer" : "<์ ๋๋ผ์ด์ ๋ช >"
- ์์ธ์ ์ฌ์ฉํ ์ ๋๋ผ์ด์ ๋ฅผ ์ ๋ ฅํ๋ฉฐ ๋ํดํธ๋ก๋ standard ์ ๋๋ผ์ด์ ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ ํฌ๋์ด์ , ํ ํฐํํฐ๋ค์ ๋ฐ๋ก ์ง์ ํ ์๊ฐ ์์ผ๋ฉฐ ํ์ํ๋ค๋ฉด ์ฌ์ฉ์ ์ ์ ์ ๋๋ผ์ด์ ๋ฅผ settings์ ์ ์ ํด ๋๊ณ ์ฌ์ฉํฉ๋๋ค.
"search_analyzer" : "<์ ๋๋ผ์ด์ ๋ช >"
- ๊ธฐ๋ณธ์ ์ผ๋ก text ํ๋๋ match ์ฟผ๋ฆฌ๋ก ๊ฒ์์ ํ ๋ ์์ธ์ ์ฌ์ฉํ ๋์ผํ ์ ๋๋ผ์ด์ ๋ก ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์ํฉ๋๋ค. search_analyzer ๋ฅผ ์ง์ ํ๋ฉด ๊ฒ์์์๋ ์์ธ์ ์ฌ์ฉํ ์ ๋๋ผ์ด์ ๊ฐ ์๋ ๋ค๋ฅธ ์ ๋๋ผ์ด์ ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ณดํต NGram ๋ฐฉ์์ผ๋ก ์์ธ์ ํ์ ๋๋ ์ง์ ํด ์ฃผ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
"index" : <true | false>
- ๋ํดํธ๋ true ์ ๋๋ค. false๋ก ์ค์ ํ๋ฉด ํด๋น ํ๋๋ ์ญ ์์ธ์ ๋ง๋ค์ง ์์ ๊ฒ์์ด ๋ถ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค.
"boost" : <์ซ์ ๊ฐ>
- ๋ํดํธ๋ 1 ์ ๋๋ค. ๊ฐ์ด 1 ๋ณด๋ค ๋์ผ๋ฉด ํํ ์คํธ ๊ฒ์ ์ ํด๋น ํ๋ ์ค์ฝ์ด ์ ์์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํฉ๋๋ค. 1๋ณด๋ค ๋ฎ์ ๊ฐ์ ์ ๋ ฅํ๋ฉด ๊ฐ์ค์น๊ฐ ๋ด๋ ค๊ฐ๋๋ค.
"fielddata" : <true | false>
- ๋ํดํธ๋ false ์ ๋๋ค. true๋ก ์ค์ ํ๋ฉด ํด๋น ํ๋์ ์์ธ๋ ํ ๋ค์ ๊ฐ์ง๊ณ ์ง๊ณ(aggregation) ๋๋ ์ ๋ ฌ(sorting)์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด ์ค์ ์ ๋ค์ด๋๋ฏน ์ค์ ์ผ๋ก ์ด๋ฏธ ์ ์๋ ๋งคํ์ true ๋๋ false๋ก ๋ค์ ์ ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
keyword
์
๋ ฅ๋ ๋ฌธ์์ด์ ํ๋์ ํ ํฐ์ผ๋ก ์ง์ ํฉ๋๋ค. textํ์
์ keyword ์ ๋๋ผ์ด์ ๋ฅผ ์ ์ฉํ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ง๊ณ(aggregation) ๋๋ ์ ๋ ฌ(sorting)์ ์ฌ์ฉํ ๋ฌธ์์ด ํ๋๋ฅผ keyword ํ์
์ผ๋ก ์ง์ ํฉ๋๋ค.
index
,boost
์ค์ ์ text ํ๋์ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค.
"doc_values" : <true | false>
- ๋ํดํธ๋ true ์ ๋๋ค. keyword ๊ฐ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง๊ณ๋ ์ ๋ ฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํ์ง ์๊ธฐ ์ํด ๊ฐ๋ค์ doc_values ๋ผ๊ณ ํ๋ ๋ณ๋์ ์ด ๊ธฐ๋ฐ ์ ์ฅ์(columnar store)๋ฅผ ๋ง๋ค์ด ์ ์ฅํฉ๋๋ค. ์ด ๊ฐ์ false๋ก ํ๋ฉด doc_values์ ๊ฐ์ ์ ์ฅํ์ง ์์ ์ง๊ณ๋ ์ ๋ ฌ์ด ๋ถ๊ฐ๋ฅํด์ง๋๋ค.
"ignore_above" : <์์ฐ์>
- ๋ํดํธ๋ 2,147,483,647 ์ด๋ฉฐ ๋ค์ด๋๋ฏน ๋งคํ์ผ๋ก ์์ฑ๋๋ฉด ignore_above: 256 ๋ก ์ค์ ์ด ๋ฉ๋๋ค. ์ค์ ๋ ๊ธธ์ด ์ด์์ ๋ฌธ์์ด์ ์์ธ์ ํ์ง ์์ ๊ฒ์์ด๋ ์ง๊ณ๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค. _source์๋ ๋จ์์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ๋ ๊ฐ์ ์ฟผ๋ฆฌํด์ ๋์จ ๊ฒฐ๊ณผ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ ๊ฐ๋ฅํฉ๋๋ค.
"normalizer" : "<๋ ธ๋ฉ๋ผ์ด์ ๋ช >"
- keyword ํ๋๋ ์ ๋๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋์ ๋ ธ๋ฉ๋ผ์ด์ (normalizer) ์ ์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ ธ๋ฉ๋ผ์ด์ ๋ ์ ๋๋ผ์ด์ ์ ์ ์ฌํ๊ฒ settings ์์ ์ ์ํ๋ฉฐ ํ ํฌ๋์ด์ ๋ ์ ์ฉํ ์ ์๊ณ ์บ๋ฆญํฐ ํํฐ์ ํ ํฐ ํํฐ๋ง ์ ์ฉํด์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
PUT blogs { "settings": { "analysis": { "analyzer": { "engram_a": { "tokenizer": "standard", "filter": [ "lowercase", "engram_f" ] } }, "filter": { "engram_f": { "type": "edge_ngram", "min_gram": 2, "max_gram": 5 } }, "normalizer": { "norm_low": { "type": "custom", "filter": [ "lowercase", "asciifolding" ] } } } }, "mappings": { "properties": { "title": { "type": "text", "boost": 2, "fields": { "keyword": { "type": "keyword", "normalizer": "norm_low" } } }, "author": { "type": "text", "analyzer": "engram_a", "search_analyzer": "standard", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "synopsis": { "type": "text", "fielddata": true }, "category": { "type": "keyword" }, "content": { "type": "text", "index": false } } } }
ย
๋ฐ๋ผ์,
keyword
ํ์
๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ doc_values
์ ์ ์ฅํ๋ ๊ฒ์ ์ฃผ๋ก ์ฑ๋ฅ ์ต์ ํ์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์ํ ์ ํ์
๋๋ค. ์ด๋ ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํํ์ฌ ์ ์ฅํ๋ฉด, ํ์ํ ์์
์ ์ํํ ๋ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋๋ค.ย
์ซ์ - long, double โฆ
long
: 64๋นํธ ์ ์ (-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
integer
: 32๋นํธ ์ ์ (-2147483648 ~ 2147483647)
short
: 16๋นํธ ์ ์ (-32768 ~ 32767)
byte
: 8๋นํธ ์ ์ (-128 ~ 127)
double
: 64๋นํธ ์ค์
float
: 32๋นํธ ์ค์
half_float
: 16๋นํธ ์ค์
scaled_float
: ์ค์ํ์ด์ง๋ง ๋ถ๋์์์ ์ด ์๋๋ผ long ํํ๋ก ์ ์ฅํ๊ณ ์ต์ ์ผ๋ก ์์์ ์์น๋ฅผ ์ง์ ํฉ๋๋ค. ํตํ (์: $19.99) ๊ฐ์ด ์์์ ์๋ฆฌ๊ฐ ๊ณ ์ ๋ ๊ฐ์ ํ์ํ ๋ ์ ์ฉํฉ๋๋ค.
๋ชจ๋ ์ซ์ ํ๋๋ค์ ๊ณตํต์ ์ผ๋ก ์ค์ ๊ฐ๋ฅํ ์ต์
๋ค์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์์ต๋๋ค.
"index"
,"doc_values"
,"boost"
์ต์ ๋ค์ text, keyword ํ๋์ ์ต์ ๋ค๊ณผ ๋์ผํฉ๋๋ค.
"coerce": <true | false>
- ๋ํดํธ๋ true ์ ๋๋ค. ์ซ์ ํ๋๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ซ์๋ก ์ดํด๋ ์ ์๋ ๊ฐ๋ค์ ์ซ์๋ก ๋ณ๊ฒฝํด์ ์ ์ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด integer ํ๋์4
,"4"
,4.5
๋ฑ์ ์ ๋ ฅํ๋ฉด ๋ชจ๋ ์์ฐ์ 4๋ก ์๋์ผ๋ก ๋ณํ๋์ด ์ ์ฅ๋ฉ๋๋ค. false ๋ก ์ค์ ํ๋ฉด ์ ํํ ํ์ ์ผ๋ก ์ ๋ ฅ๋์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
"null_value" : <์ซ์๊ฐ>
- ํ๋๊ฐ์ด ์ ๋ ฅ๋์ง ์๊ฑฐ๋ null ์ธ ๊ฒฝ์ฐ ํด๋น ํ๋์ ๋ํดํธ ๊ฐ์ ์ง์ ํฉ๋๋ค.
"ignore_malformed" : <true | false>
- ๋ํดํธ๋ false ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ซ์ ํ๋์ ์ซ์๊ฐ ์๋ ๋ฌธ์๋ ๋ถ๋ฆฐ ๊ฐ์ด ๋ค์ด์ค๋ฉด Elasticsearch๋ ์ค๋ฅ๋ฅผ ๋ฆฌํดํฉ๋๋ค. true๋ก ์ค์ ํ๊ฒ ๋๋ฉด ์ซ์๊ฐ ์๋ ๊ฐ์ด ๋ค์ด์๋ ๋ํ๋จผํธ๋ฅผ ์ ์์ ์ผ๋ก ์ ์ฅํฉ๋๋ค. ํ์ง๋ง ํด๋น ํ๋์ ๊ฐ์ _source ์๋ง ์ ์ฅ๋๊ณ ๊ฒ์์ด๋ ์ง๊ณ์๋ ๋ฌด์๋ฉ๋๋ค.
๋ค์์ scaled_float ํ์
์์๋ง ์ฌ์ฉ๋๋ ์ต์
์
๋๋ค.
"scaling_factor" : <10์ ๋ฐฐ์>
- scaled_float ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํ์๋ก ์ง์ ํด์ผ ํ๋ ์ต์ ์ ๋๋ค. ์์์ ๋ช ์๋ฆฌ๊น์ง ์ ์ฅํ ์ง๋ฅผ ์ง์ ํฉ๋๋ค. 12.3456 ์ด๋ผ๋ ๊ฐ์ ์ ์ฅํ๋ ๊ฒฝ์ฐ scaling_factor: 10 ์ผ๋ก ์ค์ ํ์ผ๋ฉด ์ค์ ๋ก๋ 12.3 ์ด ์ ์ฅ๋ฉ๋๋ค. scaling_factor : 100 ์ผ๋ก ์ค์ ํ์ผ๋ฉด 12.34 ๊ฐ ์ ์ฅ๋ฉ๋๋ค.
ย
๋ ์ง - date
Elasticsearch์์ ๋ ์ง ํ์
์ ISO8601ํ์์ ๋ฐ๋ผ ์
๋ ฅํฉ๋๋ค.
- "2019-06-12"
- "2019-06-12T17:13:40"
- "2019-06-12T17:13:40+09:00"
- "2019-06-12T17:13:40.428Z"
์ด ์ธ์๋ 1550282065513 ์ ๊ฐ์ด long ํ์
์ ์ ์์ธ epoch_millis ํํ์ ์
๋ ฅ๋ ๊ฐ๋ฅํฉ๋๋ค. epoch_millis ๋ 1970-01-01 00:00:00 ๋ถํฐ์ ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์นด์ดํธ ํ ๊ฐ์
๋๋ค.
๋ค๋ฅธ ํ์์ผ๋ก ๋ ์ง๋ฅผ ์ ์ฅํ๋ ค๋ฉด format์ต์ ์ ์ฌ์ฉํด์ ํํ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
// my_date ์ธ๋ฑ์ค ์ ์ธ PUT my_date { "mappings": { "properties": { "date_val": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy/MM/dd||epoch_millis" } } } }
ย
๋ถ๋ฆฌ์ธ - boolean
"doc_values"
,"index"
์ต์ ๋ค์ ๋ฌธ์์ด, ์ซ์ ํ๋์ ๊ธฐ๋ฅ์ด ๋์ผํฉ๋๋ค.
"null_value" : <true | false>
- ํ๋๊ฐ ์กด์ฌํ์ง ์๊ฑฐ๋ ๊ฐ์ด null ์ผ ๋ ๋ํดํธ ๊ฐ์ ์ง์ ํฉ๋๋ค. ์ง์ ํ์ง ์์ผ๋ฉด ๋ถ๋ฆฌ์ธ ํ๋๊ฐ ์๊ฑฐ๋ ๊ฐ์ด null์ธ ๊ฒฝ์ฐ ์กด์ฌํ์ง ์๋ ๊ฒ์ผ๋ก ์ฒ๋ฆฌ๋์ด true / false ๋ชจ๋ ์ฟผ๋ฆฌ๋ ์ง๊ณ์ ๋ํ๋์ง ์์ต๋๋ค.
ย
Object์ Nested
Object
JSON์์๋ ํ ํ๋ ์์ ํ์ ํ๋๋ฅผ ๋ฃ๋ object, ์ฆ ๊ฐ์ฒด ํ์
์ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ณดํต์ ํ ์์๊ฐ ์ฌ๋ฌ ํ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ objectํ์
ํํ๋ก ์ฌ์ฉํฉ๋๋ค.
// object ํ์ characters ํ๋๋ฅผ ๊ฐ์ง ๋ํ๋จผํธ PUT movie/_doc/1 { "characters": { "name": "Iron Man", "age": 46, "side": "superhero" } }
// ๋งคํ์ object ํ์ characters ํ๋ ์ ์ธ PUT movie { "mappings": { "properties": {// "characters": { "properties": {// "name": { "type": "text" }, "age": { "type": "byte" }, "side": { "type": "keyword" } } } } } }
object ํ๋๋ฅผ ์ฟผ๋ฆฌ๋ก ๊ฒ์ํ๊ฑฐ๋ ์ง๊ณ๋ฅผ ํ ๋๋
.
์ ์ด์ฉํด์ ํ์ ํ๋์ ์ ๊ทผํฉ๋๋ค.// characters ํ์์ name ํ๋ ์ฟผ๋ฆฌ GET movie/_search { "query": { "match": { "characters.name": "Iron Man" } } }
Elasticsearch์๋ ๋ฐ๋ก ๋ฐฐ์ด(array)ํ์ ์ ํ๋๋ฅผ ์ ์ธํ์ง ์์ต๋๋ค. ํ๋ ํ์ ์ ๊ฐ๋ง ์ผ์นํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ๋ฐฐ์ด๋ก๋ ๋ฃ์ ์ ์์ต๋๋ค.
- { "title": "Romeo and Juliet" }
- { "title": [ "Romeo and Juliet", "Hamlet" ] }
ย
ํ๋์ object ๊ฐ์ด 2๊ฐ์ฉ
// characters ํ๋์ 2๊ฐ์ ojbect ๊ฐ๋ค์ ๋ฐฐ์ด๋ก ๊ฐ์ง ๋ํ๋จผํธ 2๊ฐ ์ ๋ ฅ PUT movie/_doc/2 { "title": "The Avengers", "characters": [ { "name": "Iron Man", "side": "superhero" }, { "name": "Loki", "side": "villain" } ] } PUT movie/_doc/3 { "title": "Avengers: Infinity War", "characters": [ { "name": "Loki", "side": "superhero" }, { "name": "Thanos", "side": "villain" } ] }
// characters ํ์ ํ๋์ name: Loki, side: villain ๊ฒ์ GET movie/_search { "query": { "bool": { "must": [ { "match": { "characters.name": "Loki" } }, { "match": { "characters.side": "villain" } } ] } } } // ๊ฒฐ๊ณผ { "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0611372, "hits" : [ { "_index" : "movie", "_type" : "_doc", "_id" : "3", "_score" : 1.0611372, "_source" : { "title" : "Avengers: Infinity War", "characters" : [ { "name" : "Loki", "side" : "superhero" }, { "name" : "Thanos", "side" : "villain" } ] } }, { "_index" : "movie", "_type" : "_doc", "_id" : "2", "_score" : 0.9827781, "_source" : { "title" : "The Avengers", "characters" : [ { "name" : "Iron Man", "side" : "superhero" }, { "name" : "Loki", "side" : "villain" } ] } } ] } }
์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์๋ ์ด์ ๋ ์ญ ์์ธ์ด ๋ค์๊ณผ ๊ฐ์ ๋ชจ์์ผ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ์ญ ์์ธ์ ํ๋ ๋ณ๋ก ์์ฑ๋๋ ๊ฒ์ ๋ช
์ฌํด์ผ ํฉ๋๋ค.
ย
Nested
๋ง์ฝ object ํ์
ํ๋์ ์๋ ์ฌ๋ฌ๊ฐ์ object ๊ฐ๋ค์ด ์๋ก ๋ค๋ฅธ ์ญ ์์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ก ํ๋ ค๋ฉด nested ํ์
์ผ๋ก ์ง์ ํด์ผ ํฉ๋๋ค. ์ด๋ ์ธ๋ฑ์ค๋ฅผ ๋งคํํ ๋
"type": "nested"
๋ฅผ ๋ช
์ํฉ๋๋ค.// ๋งคํ์ nested ํ์ characters ํ๋ ์ ์ธ PUT movie { "mappings": { "properties": { "characters": { "type": "nested",// ํด๋น ๋ถ "properties": { "name": { "type": "text" }, "side": { "type": "keyword" } } } } } }
nested ํ๋๋ฅผ ๊ฒ์ ํ ๋๋ ๋ฐ๋์ nested ์ฟผ๋ฆฌ๋ฅผ ์จ์ผํฉ๋๋ค. nested ์ฟผ๋ฆฌ ์์๋ path๋ผ๋ ์ต์
์ผ๋ก nested๋ก ์ ์๋ ํ๋๋ฅผ ๋จผ์ ๋ช
์ํ๊ณ ๊ทธ ์์ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ๋ฃ์ด์ ์
๋ ฅํฉ๋๋ค.
// nested ์ฟผ๋ฆฌ๋ก characters ํ์ ํ๋์ name: Loki, side: villain ๊ฒ์ GET movie/_search { "query": {// ํด๋น "nested": {// ๋ถ๋ถ "path": "characters",// ํ์ "query": { "bool": { "must": [ { "match": { "characters.name": "Loki" } }, { "match": { "characters.side": "villain" } } ] } } } } }
nested ์ฟผ๋ฆฌ๋ก ๊ฒ์ํ๋ฉด nested ํ๋์ ๋ด๋ถ์ ์๋ ๊ฐ ๋ค์ ๋ชจ๋ ๋ณ๊ฐ์ ๋ํ๋จผํธ๋ก ์ทจ๊ธํฉ๋๋ค.
ย
์์น ์ ๋ณด - Geo
Geo Point
Geo Point๋ ์๋(latitude)์ ๊ฒฝ๋(longitude) ๋ ๊ฐ์ ์ค์ ๊ฐ์ ๊ฐ์ง๊ณ ์ง๋ ์์ ํ์ ์ ๋ํ๋ด๋ ๊ฐ์ ๋๋ค. ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ ๋ ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.
// object ํ์์ผ๋ก geo_point ์ ๋ ฅ PUT my_locations/_doc/1 { "location": { "lat": 41.12, "lon": -71.34 } } // text ํ์์ผ๋ก geo_point ์ ๋ ฅ PUT my_index/_doc/2 { "location": "41.12,-71.34" } // geohash ํ์์ผ๋ก geo_point ์ ๋ ฅ PUT my_index/_doc/3 { "location": "drm3btev3e86" } // ์ค์์ ๋ฐฐ์ด ํ์์ผ๋ก geo_point ์ ๋ ฅ PUT my_index/_doc/4 { "location": [ -71.34, 41.12 ] }
์ผ๋ฐ์ ์ผ๋ก object ํ์์ผ๋ก ์
๋ ฅํฉ๋๋ค.
ย
๊ธฐํ ํ๋ ํ์ - IP, Range, Binary
IP
IP ์ฃผ์ ํ์์ ์ ์ฅํฉ๋๋ค. ๋งคํ์
"type": "ip"
์ผ๋ก ์ ์ธํฉ๋๋ค. ๊ฐ์ "192.168.1.1"
๊ฐ์ IPv4 ํ์๊ณผ "0:0:0:0:0:ffff:c0a8:105"
๊ฐ์ IPv6 ํ์์ ๋ฌธ์์ด ์ฒ๋ผ ์
๋ ฅํฉ๋๋ค.ย
๋ฒ์(Range)
์ซ์๋ ๋ ์ง, IP ๋ฑ์ ์์๊ณผ ๋์ด ์๋ 2์ฐจ์์ ๋ฒ์ ํํ๋ก ์ ์ฅํฉ๋๋ค. ๋งคํฝ์ "type" ์ ์ ์ธ ๊ฐ๋ฅํ ๊ฐ์ integer_range, float_range, long_range, double_range, date_range, ip_range ๋ค์ด ์์ต๋๋ค. ๋ฐ์ดํฐ์ ๋ฒ์๋ ๋ค์๊ณผ ๊ฐ์ด gt, gte, lt, lte ๋ฅผ ์ฌ์ฉํด์ ์ง์ ํฉ๋๋ค.
// integer_range ์ date_range ํ์ ์ ํ๋ ์ ์ธ PUT my_range { "mappings": { "properties": { "amount": { "type": "integer_range" }, "days": { "type": "date_range" } } } }
// integer_range, date_range ํ์ ์ ๊ฐ์ ๊ฐ์ง ๋ํ๋จผํธ ์ ๋ ฅ PUT my_range/_doc/1 { "amount": { "gte": 19, "lt": 28 }, "days": { "gt": "2019-06-01T09:00:00", "lt": "2019-06-20" } }
Range ํ๋์ ์ฟผ๋ฆฌ๋ ์ผ๋ฐ์ ์ธ ์ซ์๋ ๋ ์ง ์ฒ๋ผ range ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค๋ง ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ range ์ฟผ๋ฆฌ๋ก ๊ฒ์ ํ ๋๋ ์ถ๊ฐ๋ก relation ์ต์
์ ๊ฐ์ ์
๋ ฅํด์ผ ํ๋ฉฐ ์
๋ ฅํ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฉ๋๋ค. relation ์ต์
์ ์ง์ ๊ฐ๋ฅํ ๊ฐ์ within, contains, intersects 3๊ฐ์ง๊ฐ ์์ต๋๋ค.
within
: ๋ํ๋จผํธ ๋ฒ์ ๊ฐ์ด ์ฟผ๋ฆฌํ ๋ฒ์ ์์ ์์ ํ ํฌํจ๋๋ ๋ํ๋จผํธ๋ค์ ๊ฐ์ ธ์ต๋๋ค.
contains
: within๊ณผ ๋ฐ๋๋ก ์ฟผ๋ฆฌ ๋ฒ์๊ฐ ๋ํ๋จผํธ ๋ฒ์ ๊ฐ ์์ ์์ ํ ํฌํจ๋๋ ๋ํ๋จผํธ๋ค์ ๊ฐ์ ธ์ต๋๋ค.
Intersects
: ๋ํ๋จผํธ ๋ฒ์ ๊ฐ๊ณผ ์ฟผ๋ฆฌ ๋ฒ์์ ๊ณตํต์ ์ธ ๋ถ๋ถ์ด ์๋ ๋ํ๋จผํธ๋ค์ ๊ฐ์ ธ์ต๋๋ค.
// "relation": "intersects" ์ผ๋ก range ์ฟผ๋ฆฌ GET my_range/_search { "query": { "range": { "amount": { "gte": "16", "lte": "25", "relation": "intersects" } } } }
ย
Binary
"type": "binary"
๋ก ์ง์ ํด์ ์์คํ
ํ์ผ์ด๋ ์ด๋ฏธ์ง ์ ๋ณด ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ๊ฐ์ ์ ์ฅํ ์ ์์ต๋๋ค. binary ํ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ธ์ด ๋์ง ์์ ๊ฒ์์ด๋ ์ง๊ณ๊ฐ ๋ถ๊ฐ๋ฅํ๊ณ _source์๋ง ๋จ์ ์์ต๋๋ค.ย
๋ฉํฐ (๋ค์ค) ํ๋ - Multi Field
Elasticsearch ์ ๋ํ๋จผํธ์๋ ํ๋์ ํ๋๊ฐ๋ง ์์ง๋ง ์ด ํ๋์ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ ์ญ ์์ธ ๋ฐ doc_values ๋ค๋ก ์ ์ฅํ ์ ์๋ ๋ค์ค ํ๋, ์ฆ ๋ฉํฐ ํ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
๋ณดํต์ text ํ์
์๋์ keyword ํ์
์ ๊ฐ์ด ์ ์ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค.
// ๋ฉํฐ ํ๋ ์ค์ PUT my_index { "mappings": { "properties": { "<ํ๋๋ช 1>": { "type": "text", "fields": { "<ํ๋๋ช 2>": { "type": "<ํ์ >" } } } } } }
// english, nori_analyzer ๋ฅผ ์ฌ์ฉํ๋ message ์ ๋ฉํฐํ๋ ์ ์ PUT my_index { "settings": { "analysis": { "analyzer": { "nori_analyzer": { "tokenizer": "nori_tokenizer" } } } }, "mappings": { "properties": { "message": { "type": "text", "fields": { "english": { "type": "text", "analyzer": "english" }, "nori": { "type": "text", "analyzer": "nori_analyzer" } } } } } }
์์ ๊ฐ์ด ๋งคํ์ ์ ์ํ๋ฉด ๋ํ๋จผํธ์๋ message ํ๋๊ฐ๋ง ์์ด๋ message, message.english, messgae.nori ์ด 3๊ฐ์ ์ญ ์์ธ์ด ์์ฑ๋ฉ๋๋ค.
๋ฉํฐ ํ๋๋ ํ ํ๋์ ์ฌ๋ฌ ์ ๋๋ผ์ด์ ๋ฅผ ์ ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ, ํนํ ๋ค๊ตญ์ด๋ก ์์ฌ์ง ๋ํ๋จผํธ๋ฅผ ๋ถ์ํด์ผํ ๋ ์ ์ฉํฉ๋๋ค.
ย
Loading Comments...