Document CRUD
ElasticSearch์์ ๋ ์ฝ๋์ ์ญํ ์ ํ๋ Document์ CRUD์ ๋ํด ์ดํด๋ณธ๋ค. ํ ์ด๋ธ ์ญํ ์ ํ๋ Index์ ๋ํ CRUD๋ ์ด์ ํฌ์คํธ์์ ๋ค๋ค๋ค.
Create
POST <index-name>/_doc
{
"id": 11,
"name": "foo"
}
{
"_index" : "my-index",
"_type" : "_doc",
"_id" : "nuJMKogBDapnWhkqYzBD",
"_version" : 1,
}
์์ฑํ Document์ ID๋ฅผ ์ง์ ํ ์๋ ์๋ค.
POST <index-name>/_doc/<id>
{
"id": 11,
"name": "foo"
}
{
"_index" : "my-index",
"_type" : "_doc",
"_id" : "123",
"_version" : 1,
}
Read
Index์ ์ ์ฅ๋ ์ ์ฒด Document๋ฅผ ์กฐํํ๋ API๋ ์๋์ ๊ฐ๋ค.
GET <index-name>/_search
{
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{ ... },
{ ... },
{ ... },
{ ... },
]
}
}
๋ง์ฝ Document ํ๋๋ง ๋จ๋ ์ผ๋ก ์ป๊ณ ์ถ๋ค๋ฉด, ์๋์ API๋ฅผ ์ฌ์ฉํ๋ผ.
GET <index-name>/_doc/<document-id>
Query DSL
ES๋ ์ด๋ฆ ๊ทธ๋๋ ๊ฒ์์ ํนํ๋ ํ๋ซํผ์ด๋ค. Domain Specific Language, DSL๋ฅผ ํตํด Document๋ฅผ ๊ฒ์ํ ์ ์๋ค.
DSL์ ๋ฌธ๋ฒ์ ํฌ๊ฒ Filter Context์ Query Context๋ก ๋๋๋ค. ๋์ ์ฐจ์ด๋ ์๋์ ๊ฐ๋ค.
- Filter Context
- ์ ํํ ๊ฒ์์ ์ ๊ณตํ๋ค.
- ๋จ, ๊ฒ์ ํค์๋์ ๋ํ ์ ์ฌ๋(score)๋ ์ ๊ณตํ์ง ์๋๋ค.
- Query Context
- ๊ฒ์ ํค์๋๋ฅผ ๋ฐํ์ผ๋ก ์ ์ฌ๋ ๋ฐฉ์์ ๊ฒ์์ ์ ๊ณตํ๋ค.
- ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋ถ์ ํ ํ ์ ์๋ค.
Filter Context, Query Context ๋์ ํจ๊ป ์ฌ์ฉํด DSL์ ๋ ๋ฆด ์๋ ์๋ค!
Query DSL์ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
{
// ๋ฐํ ๊ฒฐ๊ณผ ๊ฐฏ์
"size": xx
// ๋ฌธ์์ ์์ ์์ . ๊ธฐ๋ณธ๊ฐ์ 0
"from": xx
// ๊ธฐ๋ณธ๊ฐ์ ๋ฌดํ๋
"timeout": xx
// ๊ฒ์์ ์กฐ๊ฑด๋ฌธ: Filter Context, Query Context
"query": { ... }
// ๊ฒฐ๊ณผ ์ ๋ ฌ ๋ฐฉ์
"sort": { ... }
"_source": { ... } // ๊ฒ์ ๊ฒฐ๊ณผ์ ๋
ธ์ถํ ํ๋
"aggs": { ... } // ํต๊ณ/์ง๊ณ ๋ฐ์ดํฐ
}
์ด๋ฒ์๋ Query DSL์ ๊ธฐ๋ณธ์ธ Filter Context, Query Context๋ง ํ์ด๋ณด์.
POST <index-name>/_search
{
"query": {
"bool": { ... } // Filter Context
"match": { ... } // Query Context
}
}
Filter Context
POST <index-name>/_search
{
"query": {
"bool": {
"filter": {
"match": { "name": "foo" }
}
}
}
}
Query Context
POST <index-name>/_search
{
"query": {
"match": {
"name": "foo"
}
}
}
Update
POST <index-name>/_doc/<id>
{
"id": 11,
"name": "foo"
}
id
๋ฅผ ์ง์ ํด์ Document๋ฅผ ์์ฑํ๋ ๊ฑธ ํ๋ฒ ๋ ํ๋ฉด, ๊ธฐ์กด Document์ ๊ฐ์ด ๊ฐฑ์ ๋๋ค.
๋จ, ์ด๊ฒ์ ๊ธฐ์กด์ ์๋ Document๊ฐ ์ญ์ ๋๋ ๊ฒ์ ์๋๋ค. ์๋ก์ด Document
๋ฅผ ์ถ๊ฐํ๊ณ , ๊ทธ๊ฒ์ ํด๋น id
์ Document์ ์๋ก์ด ๋ฒ์ (version
)์ผ๋ก ์ฌ๋ฆฌ๋ ๊ฒ์ด๋ค. ์ฆ, Overwrite๊ฐ ์๋๋ผ Replace์ธ ์
์ด๋ค.
๊ทธ๋ฌ๋ ์ด ๋ฐฉ์์ Document ์์ฒด๋ฅผ ์๋ก ๋ง๋๋ ๊ฒ์ด๋ค. ํ๋ ํ๋์ ๊ฐ๋ง ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด, ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
POST <index-name>/_doc/<id>/_update
{
"doc": {
"id": 11,
"name": "foo"
}
}
์ด๋ ๊ฒ ํ๋ฉด, ๊ธฐ์กด Document์ ํด๋น ํ๋๊ฐ ์๋ค๋ฉด, ํ๋ ๊ฐ์ ๊ฐฑ์ ํ๊ณ , ์๋ ํ๋๋ ์ถ๊ฐ๋๋ค. ๋ฌผ๋ก ์ด ๊ฒฝ์ฐ์๋ ๋ฌธ์์ version
์ ์ฌ๋ผ๊ฐ๋ค.
Delete
์ญ์ ๋ ๊ฐ๋จํ๋ค.
DELETE <index-name>/_doc/<id>
Bulk API
์ฌ๋ฌ ๋ช ๋ น์ ๋ฐฐ์น(batch)๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๊ฐ ๋ช ๋ น์ ๋ฐ๋ก ์ํํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ณ , ์ค๋ฒํค๋๊ฐ ์ ๋ค. ๋์ฉ๋์ indexing, update, delete ์์ ์ด ํ์ํ ๋๋ Bulk API๋ฅผ ์ฌ์ฉํ์.
POST _bulk
{"index": {"_index": "bluehorn-test", "_id": "1"}}
{"title": "bulk test", "name": "haha"}
{"update": {"_index": "bluehorn-test", "_id": "2"}}
{"doc": {"title": "bulk test", "name": "haha"}}
{"delete": {"_index": "bluehorn-test", "_id": "3"}}
๋ง์ฝ Bulk ์์ ํ๋ Index๊ฐ ๊ณ ์ ์ด๋ผ๋ฉด ์๋์ ๊ฐ์ด ์ธ ์ ์๋ค.
POST <index-name>/_doc/_bulk
{"index": {}}
{...}
{"index": {}}
{...}