ELK ์คํ์ Elasticsearch, Logstash, Kibana์ ์ฝ์์ ๋๋ค. ์ด๊ฒ์ ๋ฐ์ดํฐ ์์ง, ์ ์ฅ, ๋ถ์, ์๊ฐํ๋ฅผ ์ํ ์ธ ๊ฐ์ง ๋๊ตฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ํ๋ซํผ์ ์๋ฏธํฉ๋๋ค.
Elasticsearch๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ ์ ์๋ ์ํํธ์จ์ด์ ๋๋ค. ์ฃผ๋ก ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ฉฐ, ์ด๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์ํ๊ณ ๋ถ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์ฌ์ดํธ์ ๋ก๊ทธ ๋ฐ์ดํฐ, ์ํ ์ ๋ณด, ๋๋ ์ฌ์ฉ์ ์ ๋ณด์ ๊ฐ์ ๋ค์ํ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ๋ฐ ์ด์ฉ๋ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ํด Elasticsearch๋ JSON ํ์์ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ด ๋ฌธ์๋ค์ ๋น ๋ฅด๊ฒ ๊ฒ์ํ๊ณ ๋ถ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ํ Elasticsearch๋ ๋ฐ์ดํฐ๋ฅผ ์์ธํํ์ฌ ๊ฒ์์ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด์ฃผ๋ Apache Lucene ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์ด ์์ต๋๋ค.
์์ฝํ์๋ฉด, Elasticsearch๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ์ํํธ์จ์ด๋ก, ๋ค์ํ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ฌ ์ํ๋ ์ ๋ณด๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์๊ฒ ๋์์ค๋๋ค.
Logstash๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์์ง, ๋ณํ ๋ฐ ์ ์กํ๋ ์คํ ์์ค ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ง์ ๋๋ค. ์ฃผ๋ก ๋ค์ํ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ , ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ์์ ๋ง๊ฒ ๊ฐ๊ณตํ๊ณ , ๋ค์ํ ๋์์ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
Logstash๋ ๋ค์ํ ์ ๋ ฅ ์์ค๋ฅผ ์ง์ํฉ๋๋ค. ์ด๋ ๋ก๊ทธ ํ์ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฉ์์ง ํ ๋ฑ ๋ค์ํ ํํ์ ๋ฐ์ดํฐ ์์ค๋ฅผ ํฌํจํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ Logstash๋ ์ด๋ฌํ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํํฐ๋งํ๊ณ ๋ณํํ์ฌ ์ํ๋ ํ์์ผ๋ก ๊ฐ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ณํ ์์ ์ ์ฌ์ฉ์๊ฐ ์ ์ํ ํํฐ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ํ๋๋ฅผ ์ถ์ถํ๊ฑฐ๋, ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ฑฐ๋, IP ์ฃผ์๋ฅผ ์ง๋ฆฌ์ ์์น๋ก ๋ณํํ๋ ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, Logstash๋ ๊ฐ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ํ ๋์์ ์ ์กํฉ๋๋ค. ์ด๋ Elasticsearch์ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ฑฐ๋, ๋ค๋ฅธ ์์คํ ์ผ๋ก ์ ์กํ์ฌ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง์ด๋ ๋ณด๊ณ ์ ์์ฑ ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
์์ฝํ์๋ฉด, Logstash๋ ๋ค์ํ ๋ฐ์ดํฐ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ , ํํฐ๋งํ๊ณ , ๊ฐ๊ณตํ์ฌ ๋ค์ํ ๋์์ ์ ๋ฌํ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ง์ ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ณ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
Kibana๋ Elasticsearch์ ํจ๊ป ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ์๊ฐํ ๋ฐ ๊ด๋ฆฌ ๋๊ตฌ์ ๋๋ค. Elasticsearch๋ก ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์, ์๊ฐํ, ๋ถ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ์ฉ์๋ Kibana๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์๊ฐํํ๊ณ ๋์๋ณด๋๋ฅผ ๋ง๋ค์ด ๋ค์ํ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
๊ฐ๋จํ ๋งํด, Elasticsearch๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ์์ง์ด๊ณ , Kibana๋ ์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๊ณ ์ดํดํ๊ธฐ ์ฝ๋๋ก ๋์์ฃผ๋ ๋๊ตฌ์
๋๋ค.
bin โ ์๋ฒ๋ฅผ ์์ํ๋๋ฐ ํ์ํ ๋ชจ๋ ์คํฌ๋ฆฝํธ์ ๊ธฐํ ์ ํธ๋ฆฌํฐ๊ฐ ๋ค์ด ์๋ ๋๋ ํฐ๋ฆฌ
bin/elasticsearch.bat โ ์๋ผ์คํฑ์์น ์๋ฒ๋ฅผ ์์ํ๋ ๋ฐฐ์น ํ์ผ
config โ ์๋ฒ ๊ตฌ์ฑ ํ์ผ์ด ๋ค์ด ์๋ ๋๋ ํฐ๋ฆฌ (๋๋ถ๋ถ ๊ธฐ๋ณธ ์ค์ ์ผ๋ก ์คํ์ด ๊ฐ๋ฅ)
config/elasticsearch.yml โ ํด๋ฌ์คํฐ ์ ๋ณด, ๊ฐ ๋ ธ๋์ ์ ๋ณด, ๋ฐ์ดํฐ ํ์ผ์ ์ ์ฅํ ๊ฒฝ๋ก ๋ฑ ์๋ผ์คํฑ์์น์ ํต์ฌ์ ์ธ ์ค์ ์ ํฌํจ
config/jvm.options โ ํ ์ฌ์ด์ฆ๋ GC(Garbage Collection) ์ต์ , ํ ๋คํ ๋ฑ JVM ์ค์ ์ ํฌํจ
config/log4j2.properties โ log4j2 ๋ก๊น ๊ณผ ๊ด๋ จ๋ ์ค์ ์ ํฌํจ
plugins โ ํ๋ฌ๊ทธ์ธ ํธ์คํ ์ ์ํ ๋๋ ํฐ๋ฆฌ
modules โ ๋ชจ๋ ํฌํจ
logs โ ์คํ ์ค์ธ ์๋ผ์คํฑ์์น ์ธ์คํด์ค๊ฐ ์๋ฒ ๋ฐ ๊ฐ๋น์ง ์์ง ๋ก๊ทธ๋ฅผ ํฌํจํ ๋ก๊น ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ๋๋ ํฐ๋ฆฌ
data โ ํผ์์คํดํธ ์ ์ฅ์ ์ฒ๋ผ ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋๋ ํด๋
c:\Users\crpark> cd c:\ELK
c:\ELK> code .
โ ๋ฌธ์ ๋งจ ๋ง์ง๋ง์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐ
xpack.security.enabled: false
c:\Users\crpark> cd c:\ELK\elasticsearch-8.13.2\bin
c:\ELK\elasticsearch-8.13.2\bin> elasticsearch.bat
c:\ELK>curl -XGET http://localhost:9200
{
"name" : "DESKTOP-304U2MR", โ ์ธ์คํด์ค ์ด๋ฆ (๊ธฐ๋ณธ๊ฐ์ ์ปดํจํฐ ์ด๋ฆ)
"cluster_name" : "elasticsearch", โ ํด๋น ๋
ธ๋๊ฐ ๊ฐ์
ํ ํด๋ฌ์คํฐ ์ด๋ฆ (๊ธฐ๋ณธ๊ฐ์ elasticsearch)
"cluster_uuid" : "ncUNUa67SQSaoOoX5MfhuA",
"version" : {
"number" : "8.13.2",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "16cc90cd2d08a3147ce02b07e50894bc060a4cbf",
"build_date" : "2024-04-05T14:45:26.420424304Z",
"build_snapshot" : false,
"lucene_version" : "9.10.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
elasticsearch.bat ๋ช
๋ น์ผ๋ก ์คํํ ๊ฒ์ Ctrl + C ์
๋ ฅ์ผ๋ก ์ข
๋ฃ
Elasticsearch๋ฅผ Windows ์์คํ ์ ์๋น์ค๋ก ์ค์นํ๊ณ ์คํํ ์ ์๋ค. ์๋น์ค๋ฅผ ์์ฑํ๋ฉด Elasticsearch๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ ์ ์์ผ๋ฉฐ, ์์คํ ๋ถํ ์ ์๋์ผ๋ก ์์๋๋๋ก ์ค์ ํ ์๋ ์๋ค.
c:\ELK\elasticsearch-8.13.2\bin> elasticsearch-service.bat install
Installing service : elasticsearch-service-x64
c:\ELK\elasticsearch-8.13.2\bin> elasticsearch-service.bat start
The service 'elasticsearch-service-x64' has been started
c:\ELK\elasticsearch-8.13.2\bin> >curl -XGET http://localhost:9200
โ ์๋ผ์คํฑ์์น๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ๋๋ฏ๋ก ๋ค๋ฅธ ์์
์ด ๊ฐ๋ฅ
{
"name" : "DESKTOP-304U2MR",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "zBcM02mqQmmltfJvstR3kA",
"version" : {
"number" : "8.13.2",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "16cc90cd2d08a3147ce02b07e50894bc060a4cbf",
"build_date" : "2024-04-05T14:45:26.420424304Z",
"build_snapshot" : false,
"lucene_version" : "9.10.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
c:\ELK\elasticsearch-8.13.2\bin> elasticsearch-service.bat stop
server.port โ ํค๋ฐ๋ ๋ฐฑ์๋ ์๋ฒ ํฌํธ
server.host โ ํค๋ฐ๋ ์๋ฒ์ ํธ์คํธ๋ก ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๊ฒ ํ๋ ค๋ฉด ์๋ฒ์ IP ์ฃผ์๋ DNS ์ด๋ฆ์ผ๋ก ์ง์
server.publicBaseUrl โ ์ฌ์ฉ์๊ฐ ์ธ๋ถ์์ ์ด๋ค URL๋ก ํค๋ฐ๋์ ์ ๊ทผํ๋์ง๋ฅผ ์ง์ ("/"๋ก ๋๋๋ฉด ์ ๋จ)
elasticsearch.hosts โ ์๋ผ์คํฑ์์น ์ฟผ๋ฆฌ๋ฅผ ์ ๋ฌํ ์๋ผ์คํฑ์์น์ ํธ์คํธ URL ๋ชฉ๋ก์ ์ง์
c:\Users\crpark> cd c:\ELK\kibana-8.13.2\bin
c:\ELK\kibana-8.13.2\bin> kibana.bat
โ ELK ๊ตฌ์ถ ์ค Kibana ์ฃผ์๋ก ์ ์์ ํด ๋ณด๋ฉด kibana server is not ready yet ๋ฉ์ธ์ง๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, ๊ตฌ์ถํ๋ ๋๋ผ์ด๋ธ์์ 85% ์ด์์ ์ฉ๋์ ์ฌ์ฉํ๊ณ ์์ ๋ ์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ฉ๋์ ๋๋ ค์ค ๋ค ๋ค์ ELK๋ฅผ ๋์๋ณด๋ฉด ์๋ฌ ์์ด ์ ๋์ํ๋ค
โ ๊ธฐ๋ณธ์ด ๋ณด์๋ชจ๋
c:\ELK\elasticsearch-8.13.2\bin> cd c:\temp\
c:\Temp> code .
c:\Temp> cd elasticsearch-8.13.2\bin
c:\Temp\elasticsearch-8.13.2\bin> chcp
ํ์ฑ ์ฝ๋ ํ์ด์ง: 949
c:\Temp\elasticsearch-8.13.2\bin> chcp 65001
โ UTF-8๋ก ๋ณ๊ฒฝ (ํ๊ธ์ด ๊นจ์ ธ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ฐฉ์ง)
Acive code page:65001
c:\Temp\elasticsearch-8.13.2\bin> elasticsearch.bat
:
โ
Elasticsearch security features have been automatically configured!
โ ๋ณด์ ์ค์ ์ ๋นํ์ฑํํ์ง ์๊ณ , ์๋ผ์คํฑ์์น๋ฅผ ์์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ณด์ ๊ตฌ์ฑ์ ์๋์ผ๋ก ์ํ
(1) TLS์ฉ ์ธ์ฆ์์ ํค ์์ฑ
2) elasticsearch.yml ํ์ผ์ TLS ๊ตฌ์ฑ์ ์ค์ (
(3) elastic ์ฌ์ฉ์์ ๋ํ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑ
(4) Kibana ๋ฑ๋ก ํ ํฐ์ ์์ฑ
โ Authentication is enabled and cluster connections are encrypted.
๐น Password for the elastic user (reset with bin/elasticsearch-reset-password -u elastic
):
oebiVw2bcAVCdCXzEj08 โ (3) elastic ์ฌ์ฉ์์ ๋ํ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑ
๐น HTTP CA certificate SHA-256 fingerprint:
26a419c2705c244af88e4efc4e319218772feb7283100f61523aff6e34d633aa
๐น Configure Kibana to use this cluster:
โข Run Kibana and click the configuration link in the terminal when Kibana starts.
โข Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30 minutes):
eyJ2ZXIiOiI4LjEzLjIiLCJhZHIiOlsiMTkyLjE2OC4wLjE0Mzo5MjAwIl0sImZnciI6IjI2YTQxOWMyNzA1YzI0NGFmODhlNGVmYzRlMzE5MjE4NzcyZmViNzI4MzEwMGY2MTUyM2FmZjZlMzRkNjMzYWEiLCJrZXkiOiJpWDdzTzQ4QkJYQ041aG94ME9vdjpaWVN5V0k5bVNSYXEySkZ5VEQ0a2p3In0= โ (4) Kibana ๋ฑ๋ก ํ ํฐ
๐น Configure other nodes to join this cluster:
โข On this node:
โ Create an enrollment token with bin/elasticsearch-create-enrollment-token -s node
.
โ Uncomment the transport.host setting at the end of config/elasticsearch.yml.
โ Restart Elasticsearch.
โข On other nodes:
โ Start Elasticsearch with bin/elasticsearch --enrollment-token <token>
, using the enrollment token that you generated.
C:\ELK\kibana-8.13.2\bin> cd c:\temp\kibana-8.13.2\bin
c:\Temp\kibana-8.13.2\bin> kibana.bat
c:\Users\crpark> curl -XGET http://localhost:9200
โ HTTP๋ก ์ ๊ทผ ๋ถ๊ฐ
curl: (52) Empty reply from server
c:\Users\crpark> curl -XGET https://localhost:9200
curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325) - ์ ๋ขฐ๋์ง ์์ ๊ธฐ๊ด์์ ์ธ์ฆ์ ์ฒด์ธ์ ๋ฐ๊ธํ์ต๋๋ค.
c:\Users\crpark> curl -XGET https://localhost:9200 -k
โ Allow insecure server connections
"-k" ์ต์ ์ curl์ด ๋ณด์ ์ธ์ฆ์๋ฅผ ํ์ธํ์ง ์๊ณ ๋ HTTPS ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ธ์ฆ์๊ฐ ์ ํจํ์ง ์๊ฑฐ๋ ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ curl์ด HTTPS ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๋ณด์์ ์ทจ์ฝ์ ์ ์ด๋ํ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
c:\Users\crpark> curl -XGET https://localhost:9200?pretty -k
"?pretty"๋ Elasticsearch์ ์๋ต์ ๊ฐ๋ ์ฑ ์๊ฒ ์ถ๋ ฅํ๋๋ก ์์ฒญํ๋ค.
c:\Users\crpark> curl -XGET https://localhost:9200 -k -u elastic
Enter host password for user 'elastic': oebiVw2bcAVCdCXzEj08
- ์ ๋ช ๋ น์ด๋ curl์ ์ฌ์ฉํ์ฌ Elasticsearch์ ์ธ์ฆ๋ ์ฌ์ฉ์ "elastic"์ผ๋ก ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด๋ค.
- "-u elastic"์ ์ฌ์ฉ์ ์ด๋ฆ "elastic"์ผ๋ก ์ธ์ฆ๋จ์ ๋ํ๋ธ๋ค. ์ด๊ฒ์ Elasticsearch์ ๋ํ ์ธ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ค.
- "Enter host password for user 'elastic'"๋ผ๋ ๋ฉ์์ง๊ฐ ๋ํ๋๋ฉด, curl์ด ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฒญํ๊ณ ์์์ ๋ํ๋ธ๋ค.
- ์ ๋ ฅ๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ ํ ์ํฐ๋ฅผ ๋๋ฅด๋ฉด curl์ด Elasticsearch๋ก ์์ฒญ์ ๋ณด๋ด๊ณ , ์ธ์ฆ์ด ์ฑ๊ณตํ๋ฉด ํด๋น ์๋ฒ์ ์ ๋ณด๊ฐ ๋ฐํ๋๋ค.
c:\Temp\elasticsearch-8.13.2\bin> cd c:\elk\elasticsearch-8.13.2\bin
c:\ELK\elasticsearch-8.13.2\bin> elasticsearch.bat
c:\Temp\kibana-8.13.2\bin> cd c:\ELK\kibana-8.13.2\bin
c:\ELK\kibana-8.13.2\bin> kibana.bat
๋์ ๋ฐ์ดํฐ๋ฅผ ELK(Elasticsearch, Logstash, Kibana) ์คํ์ผ๋ก ์ ์ฅํ๊ณ ์๊ฐํํ๊ธฐ ์ํด JSON ๋ฌธ์์ ํํ๋ก ํํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, "Effective Java"๋ผ๋ ์ฑ ์ ์ ๋ณด๋ฅผ JSON ๋ฌธ์๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค:
title : ๋์๋ช
author : ์๊ฐ๋ช
release_date : ์ถ๋ฐ์ผ
amazon_rating : ์๋ง์กด ํ์
best_seller : ๋ฒ ์คํธ ์
๋ฌ ์ฌ๋ถ
prices : ๋ฌ๋ฌ, ํ์ด๋, ์ ๋ก ํํ ๋จ์์ ๊ฐ๊ฒฉ
{
"title": "Effective Java", โ ํค : ๊ฐ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ํํ
"author": "Josuha Bloch", โ ํค๋ ๋ฌธ์์ด ํํ
"release_date": "2001-06-01", โ ๊ฐ์ ๋ฌธ์์ด, ์ซ์, ์ฐธ(true), ๊ฑฐ์ง(false), ๋ ๋ค๋ฅธ ๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ
"amazon_rating": 4.7, ๋ค์ํ ํํ๊ฐ ์ฌ ์ ์์
"best_seller": true,
"prices": {
"usd": 9.95,
"gbp": 7.95,
"eur": 8.95
}
}
<HTTP_METHOD> <SERVER:PORT>/<INDEX_NAME>/_doc/<DOC_ID>
{
์์ฒญ ๋ณธ๋ฌธ
}
HTTP_METHOD - GET, POST, PUT, DELETE ๋ฑ
SERVER:PORT - localhost:9200
INDEX_NAME - ์ธ๋ฑ์ค ์ด๋ฆ = ์์ธ ๋ช
_doc - ๋ฌธ์ API์ ์๋ํฌ์ธํธ ๊ธฐ๋ณธ๊ฐ
POST <index_name>/_doc
{
<document>
}
GET <index_name>/_doc/<_id>
POST <index-name>/_doc/<_id>
{
<๋ณ๊ฒฝํ ๋ด์ฉ>
}
GET/POST <index-name>/_search
{
"query": {
...
}
}
DELETE <index_name>/_id/<_id>
์ธ๋ฑ์ฑ(Indexing)์ ๊ฒ์ ์์ง์ด ๋ฌธ์๋ฅผ ์ ์ฅํ๊ณ ํจ์จ์ ์ผ๋ก ๊ฒ์ํ ์ ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํํ๋ ๊ณผ์ ์ด๋ค. . ๋ฌธ์๋ ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ, JSON, XML ๋๋ ๊ธฐํ ํ์์ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์๋ฅผ ๊ฒ์ํ ์ ์๋๋ก ๋ง๋ค๊ธฐ ์ํด ๊ฒ์ ์์ง์ ๋ฌธ์์ ๋ด์ฉ์ ๋ถ์ํ์ฌ ์์ธ(index)์ ์์ฑํฉ๋๋ค. ์ด ์์ธ์ ๋ฌธ์์ ๋ด์ฉ์ ์์ธํํ์ฌ ํน์ ๊ฒ์์ด์ ๋ํ ๋น ๋ฅธ ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
c:\Users\crpark> curl -XPUT "localhost:9200/books/_doc/1" -H "Content-Type: application/json" -d "{ ... }"
์ ๋ช ๋ น์ด๋ Curl์ ์ฌ์ฉํ์ฌ Elasticsearch ์๋ฒ์ HTTP PUT ์์ฒญ์ ๋ณด๋ด์ด "books" ์ธ๋ฑ์ค์ "_doc" ์๋ํฌ์ธํธ์ ID๊ฐ 1์ธ ๋ฌธ์๋ฅผ ์์ฑ ๋๋ ์ ๋ฐ์ดํธํฉ๋๋ค. ์์ฒญ ๋ณธ๋ฌธ์๋ ์ฑ ์ ๋ณด๊ฐ JSON ํ์์ผ๋ก ํฌํจ๋์ด ์์ต๋๋ค.
โ -XPUT :
์์ฒญ ๋ฐฉ์์ ์ง์ . HTTP ์์ฒญ ๋ฉ์๋๋ฅผ PUT์ผ๋ก ์ง์ ํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋ ์๋ก ์์ฑํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
โก "localhost:9200/books/_doc/1" :
์๋ฒ ํธ์คํธ ์ด๋ฆ๊ณผ ํฌํธ ๋ฒํธ๋ฅผ ๋ํ๋ด๋ฉฐ, "books"๋ ์ธ๋ฑ์ค ์ด๋ฆ, "_doc"์ ๋ฌธ์ API์ ์๋ํฌ์ธํธ, "1"์ book ID์
๋๋ค.
โข -H "Content-Type: application/json" :
Content-Type ์์ฒญ ํค๋๋ฅผ ์ค์ โ ๋ณธ๋ฌธ ๋ด์ฉ์ด JSON ํ์
. ์์ฒญ ํค๋๋ฅผ ์ค์ ํ์ฌ ์์ฒญ ๋ณธ๋ฌธ์ด JSON ํ์์์ ๋ช
์ํฉ๋๋ค.
โฃ -d "{ ... }" :
์์ฒญ ๋ณธ๋ฌธ = ๋ฐ์ดํฐ. ์์ฒญ ๋ณธ๋ฌธ์ ์ค์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ JSON ํ์์ผ๋ก ์ฑ
์ ๋ณด๊ฐ ์ ๊ณต๋ฉ๋๋ค. ์์ฒญ ๋ณธ๋ฌธ์ ๋ด์ฉ์ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ฐ์ดํ๋ฅผ ์ด์ค์ผ์ดํํ์ฌ ์ฌ์ฉํฉ๋๋ค.
*) ์์ฒญ ๋ณธ๋ฌธ์ ๊ธฐ์ ํ ๋ ์๋ฐ์ํ๋ฅผ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌํด์ผ ํจ โ ์๋ฐ์ํ๋ฅผ ๋๋ฒ ์ฐ์ ํ๊ธฐ ๋๋ \" ํ์์ผ๋ก ์ด์ค์ผ์ดํ
โ ์์ฒญ ๋ณธ๋ฌธ:
"title": "Effective Java", "author": "Josuha Bloch", "release_date": "2001-06-01", "amazon_rating": 4.7, "best_seller": true, "prices": { "usd": 9.95, "gbp": 7.95, "eur": 8.95 }
โก ๋ ๋ฒ ์ฐ์์ผ๋ก ์๋ฐ์ดํ ํ๊ธฐ:
""title"": ""Effective Java"", ""author"": ""Josuha Bloch"", ""release_date"": ""2001-06-01"", ""amazon_rating"": 4.7, ""best_seller"": true, ""prices"": { ""usd"": 9.95, ""gbp"": 7.95, ""eur"": 8.95 }
โข ๋ฐฑ์ฌ๋์๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ค์ผ์ดํ:
\"title\": \"Effective Java\", \"author\": \"Josuha Bloch\", \"release_date\": \"2001-06-01\", \"amazon_rating\": 4.7, \"best_seller\": true, \"prices\": { \"usd\": 9.95, \"gbp\": 7.95, \"eur\": 8.95 }
PUT books/_doc/2
{
"title":"Core Java Volume I - Fundamentals",
"author":"Cay S. Horstmann",
"release_date":"2018-08-27",
"amazon_rating":4.8,
"best_seller":true,
"prices": {
"usd":19.95,
"gbp":17.95,
"eur":18.95
}
}
PUT books/_doc/4
{
"title":"Java: A Beginnerโs Guide",
"author":"Herbert Schildt",
"release_date":"2018-11-20",
"amazon_rating":4.2,
"best_seller":true,
"prices": {
"usd":19.99,
"gbp":19.99,
"eur":19.99
}
}
_count API : ํด๋น ์ธ๋ฑ์ค์ ์ํ๋ ๋ฌธ์์ ์๋ฅผ ๋ฐํ
์ด ๋ช ๋ น์ด๋ Curl์ ์ฌ์ฉํ์ฌ Elasticsearch์ HTTP GET ์์ฒญ์ ๋ณด๋ด์ด "books" ์ธ๋ฑ์ค์ ์๋ ๋ฌธ์์ ์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด๋ค.
c:\Users\crpark> curl -XGET "localhost:9200/books/_count"
{"count":4,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}
c:\Users\crpark> curl -XGET "localhost:9200/books/_count"?pretty
{
"count" : 4,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
}
}
c:\Users\crpark> curl -XGET "localhost:9200/books,books2/_count"?pretty
โ ๋์ผํ API๋ฅผ ์ฌ์ฉํด์ ์ฌ๋ฌ ์ธ๋ฑ์ค์์ ๋์์ ๊ฐ์ ธ์ค๋ ๊ฒ๋ ๊ฐ๋ฅ
{
"error" : {
"rootcause" : [
{
"type" : "index_not_found_exception", โ books2 ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ฅผ ๋ฐํ
"resource.type" : "index_or_alias",
"resource.id" : "books2",
"index_uuid" : "_na",
"index" : "books2"
}
],
"type" : "indexnot_found_exception",
"reason" : "no such index [books2]",
"resource.type" : "index_or_alias",
"resource.id" : "books2",
"index_uuid" : "_na",
"index" : "books2"
},
"status" : 404
}
c:\Users\crpark> curl -XGET "localhost:9200/_count"?pretty
{
"count" : 4, โ ์์คํ
๋ฐ ์จ๊ฒจ์ง ์ธ๋ฑ์ค๋ฅผ ํฌํจํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฌธ์๊ฐ ๋ฐํ
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
}
}
c:\Users\crpark> curl -XGET http://localhost:9200/books/_doc/1
{"_index":"books","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{ "title": "Effective Java", "author": "Josuha Bloch", "release_date": "2001-06-01", "amazon_rating": 4.7, "best_seller": true, "prices": { "usd": 9.95, "gbp": 7.95, "eur": 8.95 } }}
c:\Users\crpark> curl -XGET http://localhost:9200/books/_doc/1?pretty
{
"_index" : "books", --+ ๋ฉํ ๋ฐ์ดํฐ
"_id" : "1", |
"_version" : 1, |
"_seq_no" : 0, |
"_primary_term" : 1, --+
"found" : true,
"_source" : { --+ ์๋ณธ ๋ฌธ์ (์์ค ๋ฐ์ดํฐ)
"title" : "Effective Java", |
"author" : "Josuha Bloch", |
"release_date" : "2001-06-01",|
"amazon_rating" : 4.7, |
"best_seller" : true, |
"prices" : { |
"usd" : 9.95, |
"gbp" : 7.95, |
"eur" : 8.95 |
} --+
}
}
No request selected ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
{
"took": 20,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "books",
"_id": "1",
"_score": 1,
"_source": {
"title": "Effective Java",
"author": "Josuha Bloch",
"release_date": "2001-06-01",
"amazon_rating": 4.7,
"best_seller": true,
"prices": {
"usd": 9.95,
"gbp": 7.95,
"eur": 8.95
}
}
},
{
"_index": "books",
"_id": "3",
"_score": 1,
"_source": {
"title": "Effective Java",
"author": "Josuha Bloch",
"release_date": "2001-06-01",
"amazon_rating": 4.7,
"best_seller": true,
"prices": {
"usd": 9.95,
"gbp": 7.95,
"eur": 8.95
}
}
},
{
"_index": "books",
"_id": "2",
"_score": 1,
"_source": {
"title": "Core Java Volume I - Fundamentals",
"author": "Cay S. Horstmann",
"release_date": "2018-08-27",
"amazon_rating": 4.8,
"best_seller": true,
"prices": {
"usd": 19.95,
"gbp": 17.95,
"eur": 18.95
}
}
}
]
}
}
"took": 20: Elasticsearch๊ฐ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ์ ๋ฐ๋ฆฌ์ด๋ก ํ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ 20๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ ธ์ต๋๋ค.
"timed_out": false: ์์ฒญ์ด ์๊ฐ ์ด๊ณผ๋์ง ์์์์ ๋ํ๋ ๋๋ค.
"_shards": ํด๋ฌ์คํฐ ๋ด์ ์ค๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ด ๊ฒฝ์ฐ ์ด 1๊ฐ์ ์ค๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋์์ต๋๋ค.
ํด๋ฌ์คํฐ ๋ด์ ์ค๋๋ Elasticsearch์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ธฐ๋ณธ์ ์ธ ๋จ์์ ๋๋ค.
์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ๋ ๋ ผ๋ฆฌ์ ๋จ์์ด๋ฉฐ, Elasticsearch๋ ์ด๋ฌํ ์ค๋๋ฅผ ํตํด ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
"hits": ์ค์ ๊ฒ์ ๊ฒฐ๊ณผ์ ๋๋ค.
"total": ๊ฒ์ ๊ฒฐ๊ณผ์ ํฌํจ๋ ์ด ๋ฌธ์ ์๋ฅผ ๋ํ๋ ๋๋ค. ์ฌ๊ธฐ์๋ 3๊ฐ์ ๋ฌธ์๊ฐ ๊ฒ์๋์์ต๋๋ค.
"max_score": ๊ฒ์ ๊ฒฐ๊ณผ ์ค ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๊ฐ์ง ๋ฌธ์์ ์ ์์ ๋๋ค.
"hits": ๊ฒ์๋ ๊ฐ ๋ฌธ์์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋ ๋ฐฐ์ด์ ๋๋ค. ๊ฐ ๋ฌธ์๋ "_index", "_id", "_score", "_source" ๋ฑ์ ํ๋๋ฅผ ํฌํจํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๊ฐ ๋ฌธ์์ "_index"๋ "books"์ด๋ฉฐ, "_id"๋ ๊ฐ ๋ฌธ์์ ๊ณ ์ ์๋ณ์์ ๋๋ค. "_source"๋ ๊ฒ์๋ ๋ฌธ์์ ์ค์ ๋ด์ฉ์ ํฌํจํฉ๋๋ค.
c:\Users\crpark> curl -XGET http://localhost:9200/books/_search -H "Content-Type: application/json" -d "{ ""query"": { ""ids"" : { ""values"": [1, 2, 3] } } }"
c:\Users\crpark> curl -XGET http://localhost:9200/books/_search ? pretty -H"Content-Type: application/json" -d "{ ""query"": { ""ids"" : { ""values"": [1, 2, 3] } } }"
match ์ฟผ๋ฆฌ โ ํน์ ํ๋์์ ์ฃผ์ด์ง ๊ฒ์์ด์ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ๊ฒ์
match ์ฟผ๋ฆฌ๋ ๋จ์ด์ ์์น ๋ฐ ๋์๋ฌธ์ ๊ด๊ณ ์์ด ์ผ์นํ๋ ๋จ์ด๋ฅผ ํฌํจํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
"author": "Josuha"
"author": "josuha"
"author": "JOSUHA"
"author": "Bloch"
์๋ฒฝํ ๋จ์ด ์ค์์ ์ผ์นํ๋ ๋จ์ด๊ฐ ์์ผ๋ฏ๋ก ๊ฒ์๋์ง ์์
"author": "jos"
GET /books/_search
{
"query": {
"prefix": {
"author": "jos" โ ๋จ์ด๋ฅผ ์์ํ๋ ๋ฌธ์๋ฅผ ์๋ฌธ์๋ก ํ๊ธฐ
}
}
}
๊ธฐ๋ณธ์ ์ผ๋ก OR ์ฐ์ฐ์ ํ๋ฏ๋ก, ์ ์ ์ด๋ฆ์ Josuha๊ฐ ๋ค์ด๊ฐ ๊ฒ๊ณผ Schildt๊ฐ ๋ค๊ฐ ๊ฒ์ ๋ชจ๋ ์กฐํ
_bulk API๋ Elasticsearch์์ ์ฌ๋ฌ ์์ ์ ํ ๋ฒ์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ API์ ๋๋ค. ์ด API๋ฅผ ์ฌ์ฉํ๋ฉด ๋จ์ผ ์์ฒญ์ผ๋ก ์ฌ๋ฌ ๋ฌธ์์ ์์ธ(index), ์ญ์ (delete), ์ ๋ฐ์ดํธ(update) ๋ฑ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋คํธ์ํฌ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ๊ณ ์ฒ๋ฆฌ ์๋๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค.
โ ๋ฌธ์๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ง๋ค ํด๋น ๋ฌธ์์ _version ํ๋๋ฅผ ํ์ธํ์ฌ ์ต์ ๋ฒ์ ์ธ์ง ํ์ธํ ์ ์๋ค.
โ
์
๋ฐ์ดํธ๋ ๋ด์ฉ์ด title ํ๋์ ๋ฐ์๋์๋ค๋ฉด, ํด๋น ๋ด์ฉ์ _source ํ๋์์ ํ์ธํ ์ ์๋ค.
{
"title": "Head First Java",
"author": "Kathy Sierra and Bert Bates",
"edition": 2,
"synopsis": "The most important selling points of Head First Java is its
simplicity and super-effective real-life analogies that pertain to the Java
programming concepts.",
"amazon_rating": 4.3,
"release_date": "2005-02-18",
"tags": [
"IT Certification Exams",
"Object-Oriented Software Design",
"Design Pattern Programming"
]
}
title: ์ฑ ์ ์ ๋ชฉ์ ๋ํ๋ด๋ ๋ฌธ์์ด
author: ์ฑ ์ ์ ์๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด
edition: ์ฑ ์ ํ์ ๋ํ๋ด๋ ์ซ์
synopsis: ์ฑ ์ ๊ฐ๋ตํ ๊ฐ์ ๋๋ ์์ฝ์ ๋ํ๋ด๋ ๋ฌธ์์ด
amazon_rating: ์๋ง์กด์์์ ํ์ ์ ๋ํ๋ด๋ ์ซ์
release_date: ์ฑ ์ด ์ถ์๋ ๋ ์ง๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด
tags: ์ฑ
์ ๊ด๋ จ๋ ํ๊ทธ ๋ชฉ๋ก์ ๋ํ๋ด๋ ๋ฐฐ์ด. ํ๊ทธ๋ ์ฑ
์ ์ฃผ์ ๋ ํน์ฑ์ ์ค๋ช
ํ๋ ๋ฐ ์ฌ์ฉ
multi_match ์ฟผ๋ฆฌ๋ Elasticsearch์์ ์ฌ๋ฌ ํ๋์์ ํ ๋ฒ์ ๊ฒ์์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ํ๋์ ๋ํด ๋์์ ๊ฒ์์ ์ํํ ์ ์์ผ๋ฉฐ, ๊ฒ์์ด๊ฐ ํ๋ ์ด์์ ํ๋์์ ๋ฐ์ํ๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
"query"๋ ์ฌ์ฉ์๊ฐ ๊ฒ์ํ๋ ๊ฒ์์ด๋ฅผ ๋ํ๋ ๋๋ค. "fields"๋ ๊ฒ์์ ์ํํ ํ๋์ ๋ชฉ๋ก์ ๋ํ๋ ๋๋ค.
{
"took": 30,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10,
"relation": "eq"
},
"max_score": 0.33537668,
"hits": [
{
"_index": "books",
"_id": "2",
"_score": 0.33537668,
"_source": {
"title": "Effective Java",
"author": "Joshua Bloch",
"edition": 3,
"synopsis": "A must-have book for every Java programmer and Java aspirant, Effective Java makes up for an excellent complementary read with other Java books or learning material. The book offers 78 best practices to follow for making the code better.",
"amazon_rating": 4.7,
"release_date": "2017-12-27",
"tags": [
"Object Oriented Software Design"
]
}
},
{
โ
โ
โ
"title^3"๋ ์ ๋ชฉ ํ๋์ ๋ํด ๋ถ์คํ ์ ์ ์ฉํ๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
๊ฒ์ ๊ฒฐ๊ณผ์์ ์ ๋ชฉ์ ํฌํจ๋ ๊ฒ์์ด์ ๊ด๋ จ๋ ๋ฌธ์๊ฐ ๋ ๋์ ์์๋ก ํ์๋ฉ๋๋ค.
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10,
"relation": "eq"
},
"max_score": 1.0061301,
"hits": [
{
"_index": "books",
"_id": "2",
"_score": 1.0061301,
"_source": {
"title": "Effective Java",
"author": "Joshua Bloch",
"edition": 3,
"synopsis": "A must-have book for every Java programmer and Java aspirant, Effective Java makes up for an excellent complementary read with other Java books or learning material. The book offers 78 best practices to follow for making the code better.",
"amazon_rating": 4.7,
"release_date": "2017-12-27",
"tags": [
"Object Oriented Software Design"
]
}
},
{
"_index": "books",
"_id": "5",
"_score": 0.90180784,
"_source": {
"title": "Head First Java",
"author": "Kathy Sierra and Bert Bates",
"edition": 2,
"synopsis": "The most important selling points of Head First Java is its simplicity and super-effective real-life analogies that pertain to the Java programming concepts.",
"amazon_rating": 4.3,
"release_date": "2005-02-18",
"tags": [
"IT Certification Exams",
"Object-Oriented Software Design",
"Design Pattern Programming"
]
}
},
"highlight": {
"synopsis": [
"A <em>must-have book for every Java programmer</em> and Java aspirant, Effective Java makes up for an excellent"
]
slop ๋งค๊ฐ๋ณ์๋ Elasticsearch์ multi_match ์ฟผ๋ฆฌ์์ ์ฌ์ฉ๋๋ ์ต์ ์ค ํ๋์ ๋๋ค. ์ด ์ต์ ์ ๊ฒ์์ด์์ ๋จ์ด ์ฌ์ด์ ์ต๋ ํ์ฉ ๊ฑฐ๋ฆฌ๋ฅผ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ ์์์์ slop ๋งค๊ฐ๋ณ์๋ 2๋ก ์ค์ ๋์ด ์์ผ๋ฉฐ, ๋จ์ด ์ฌ์ด์ ์ต๋ 2๊ฐ์ ๋จ์ด๊ฐ ํ์ฉ๋ฉ๋๋ค
fuzziness ๋งค๊ฐ๋ณ์๋ Elasticsearch์ ๊ฒ์์์ ์ฌ์ฉ๋๋ฉฐ, ์ฃผ์ด์ง ๊ฒ์์ด์ ์ผ์นํ๋ ๋ํ๋จผํธ๋ฅผ ์ฐพ์ ๋ ํ์ฉํ ์ ์๋ ์คํ์ ์๋ฅผ ์ง์ ํฉ๋๋ค
์ ์ ๊ฐ: ํ์ฉํ ์ต๋ ํธ์ง ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ๋ ๋๋ค. ์๋ฅผ ๋ค์ด, 2๋ก ์ค์ ํ๋ฉด ์ต๋ 2๊ฐ์ ๋ฌธ์๊ฐ ์คํ์ผ ๊ฒฝ์ฐ์๋ ์ผ์นํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
"AUTO": Elasticsearch์๊ฒ ์๋์ผ๋ก ์ ์ ํ ํธ์ง ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํ๋๋ก ํฉ๋๋ค. ๊ฒ์์ด์ ๊ธธ์ด์ ๋ฐ๋ผ ์ ์ ํ ๊ฐ์ ์๋์ผ๋ก ์ ํํฉ๋๋ค.
์ฉ์ด ์์ค ์ฟผ๋ฆฌ(term-level query)๋ Elasticsearch์์ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ฟผ๋ฆฌ ์ ํ์ ๋๋ค. ์ด ์ฟผ๋ฆฌ๋ ๋ฐ์ดํฐ์ ์ ํํ ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ๊ฒ์ํ๋ ๋ฐ ์ง์คํ๋ฉฐ, ๊ฒ์ ๊ฒฐ๊ณผ์ ๊ด๋ จ์ฑ ์ ์๋ฅผ ์์ฑํ์ง ์์ต๋๋ค.
๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ซ์, ๋ ์ง, ๋ฒ์, IP ์ฃผ์ ๋ฑ๊ณผ ๊ฐ์ด ์ด๋ฏธ ๊ตฌ์กฐํ๋์ด ์๊ณ ๋ถ์๋์ง ์์ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค. ์ด๊ฒ์ ์ฉ์ด ์์ค ์ฟผ๋ฆฌ๊ฐ ์ ํํ ์ผ์น๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฉ์ด ์์ค ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ซ์ ํ๋์์ ํน์ ๊ฐ๊ณผ ์ ํํ๊ฒ ์ผ์นํ๋ ๋ํ๋จผํธ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค. ๋ํ ๋ ์ง ๋ฒ์๋ IP ์ฃผ์์ ๊ฐ์ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ์์๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
๊ตฌ์กฐํ๋์ง ์์ ๋ฐ์ดํฐ(์: ๋ฌธ์์ด)๋ Elasticsearch์์ ๊ฒ์ํ๊ธฐ ์ ์ ๋ถ์๋์ด ์ ์ฅ๋๋ ๋ฐ๋ฉด, ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ ์ด๋ฏธ ๋ถ์๋์ง ์๊ณ ๊ทธ๋๋ก ์ ์ฅ๋ฉ๋๋ค.
์์ฝํ๋ฉด, ์ฉ์ด ์์ค ์ฟผ๋ฆฌ๋ ๋ฐ์ดํฐ์ ์ ํํ ์ผ์น๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ, ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ์์ ์๋ํ๋ฉฐ ๊ฒ์ ๊ฒฐ๊ณผ์ ๊ด๋ จ์ฑ ์ ์๋ฅผ ์์ฑํ์ง ์์ต๋๋ค.
{
"title": "Head First Java",
"author": "Kathy Sierra and Bert Bates",
"edition": 2,
"synopsis": "The most important selling points of Head First Java is its simplicity and super-effective real-life analogies that pertain to the Java programming concepts.",
"amazon_rating": 4.3,
"release_date": "2005-02-18",
"tags": [
"IT Certification Exams",
"Object-Oriented Software Design",
"Design Pattern Programming"
]
}
title: ์ฑ ์ ์ ๋ชฉ. ์ฌ๊ธฐ์๋ "Head First Java"์ ๋๋ค.
author: ์ฑ ์ ์ ์ ๋๋ ์ ์๋ค. ์ฌ๊ธฐ์๋ "Kathy Sierra and Bert Bates"์ ๋๋ค.
edition: ์ฑ ์ ํ๋งค ๋ฒ์ . ์ฌ๊ธฐ์๋ 2ํ(2)์ ๋๋ค.
synopsis: ์ฑ ์ ๊ฐ๋ตํ ๊ฐ์ ๋๋ ๋ด์ฉ ์์ฝ. ์ฌ๊ธฐ์๋ "The most important selling points of Head First Java is its simplicity and super-effective real-life analogies that pertain to the Java programming concepts."์ ๋๋ค.
amazon_rating: ์๋ง์กด์์์ ํ์ . ์ฌ๊ธฐ์๋ 4.3์ ๋๋ค.
release_date: ์ฑ ์ ์ถ์์ผ. ์ฌ๊ธฐ์๋ "2005-02-18"์ ๋๋ค.
tags: ์ฑ ๊ณผ ๊ด๋ จ๋ ํ๊ทธ ๋ชฉ๋ก. ์ฌ๊ธฐ์๋ "IT Certification Exams", "Object-Oriented Software Design", "Design Pattern Programming"์ ๋๋ค.
term ์ฟผ๋ฆฌ๋ ํ ์คํธ ๋ถ์์ ๊ฑฐ์น์ง ์๊ณ ํ๋์ ๊ฐ์ ๊ทธ๋๋ก ๊ฒ์ํ๋ฏ๋ก, ์ ํํ ์ฉ์ด๋ ๊ฐ์ ์ฐพ์ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๊ฒ์ ํ ์คํธ๋ ๋ฌธ์์ด๊ณผ ๊ฐ์ ๊ตฌ์กฐํ๋์ง ์์ ๋ฐ์ดํฐ๋ณด๋ค๋ ์ซ์, ๋ ์ง, ํค์๋์ ๊ฐ์ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ์ ๋ ์ ํฉํฉ๋๋ค.
์ด ์ฟผ๋ฆฌ๋ ํน์ ๋ฒ์ ๋ด์ ์๋ ๊ฐ์ ๊ฐ์ง ๋ํ๋จผํธ๋ฅผ ๊ฒ์ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. range ์ฟผ๋ฆฌ๋ ์ซ์, ๋ ์ง ๋ฐ ๊ธฐํ ์ ํ์ ํ๋์ ๋ํด ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ง์ ๋ ๋ฒ์ ๋ด์ ์๋ ๊ฐ์ผ๋ก ํ๋๋ฅผ ํํฐ๋งํฉ๋๋ค.
์ฆ, range ์ฟผ๋ฆฌ๋ ํน์ ๋ฒ์ ๋ด์ ์๋ ๊ฐ์ ํํฐ๋งํ๋ ๋ฐ ์ ์ฉํ๋ฉฐ, ์ซ์๋ ๋ ์ง์ ๊ฐ์ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ์์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
range ์ฟผ๋ฆฌ์ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ต์ ์ด ์์ต๋๋ค. ์ฃผ์ ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
gte: Greater than or equal to (์ด์). ์ง์ ๋ ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง ๋ํ๋จผํธ๋ฅผ ๋ฐํํฉ๋๋ค.
gt: Greater than (์ด๊ณผ). ์ง์ ๋ ๊ฐ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง ๋ํ๋จผํธ๋ฅผ ๋ฐํํฉ๋๋ค.
lte: Less than or equal to (์ดํ). ์ง์ ๋ ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง ๋ํ๋จผํธ๋ฅผ ๋ฐํํฉ๋๋ค.
lt: Less than (๋ฏธ๋ง). ์ง์ ๋ ๊ฐ๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง ๋ํ๋จผํธ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ณตํฉ ์ฟผ๋ฆฌ๋ Elasticsearch์์ ์ฌ๋ฌ ๊ฐ์ ๋จ์ผ ์ฟผ๋ฆฌ๋ฅผ ๊ฒฐํฉํ์ฌ ๋ณต์กํ ๊ฒ์์ ์ํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ๋ณตํฉ ์ฟผ๋ฆฌ๋ ํ๋ ์ด์์ ๋จ์ผ ์ฟผ๋ฆฌ๋ฅผ ์กฐํฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ ํ๊ฑฐ๋ ํํฐ๋งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ถ์ธ(bool) ์ฟผ๋ฆฌ:
๋ถ์ธ ์ฟผ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ ๋จ์ผ ์ฟผ๋ฆฌ๋ฅผ ์กฐํฉํ์ฌ ๋ณต์กํ ๋
ผ๋ฆฌ์ ์กฐ๊ฑด์ ๋ง์กฑ์ํฌ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํํฐ๋ง, ๋ฐ๋์ ์ผ์นํด์ผ ํ๋ ์กฐ๊ฑด, ๋๋ ๋ฐ๋์ ์ผ์นํ์ง ์์์ผ ํ๋ ์กฐ๊ฑด ๋ฑ์ ์ ์ฉํ ์ ์์ต๋๋ค.
์์ ์ ์(constant_score) ์ฟผ๋ฆฌ:
์์ ์ ์ ์ฟผ๋ฆฌ๋ ๋จ์ผ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๋ชจ๋ ๊ฒฐ๊ณผ์ ๋ํด ๋์ผํ ์ ์๋ฅผ ํ ๋นํฉ๋๋ค. ์ด๋ ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๋ชจ๋ ๊ฒฐ๊ณผ์ ๋ํด ๋์ผํ ์ค์๋๋ฅผ ๋ถ์ฌํ๊ณ ์ถ์ ๋ ์ ์ฉํฉ๋๋ค.
๊ธฐ๋ฅ ์ ์(function_score) ์ฟผ๋ฆฌ:
๊ธฐ๋ฅ ์ ์ ์ฟผ๋ฆฌ๋ ๋จ์ผ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ ์๋ฅผ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฒ์ ๊ฒฐ๊ณผ์ ์์๋ฅผ ๊ฐ์ ํ๊ฑฐ๋ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค.
๋ถ์คํ
(boosting) ์ฟผ๋ฆฌ:
๋ถ์คํ
์ฟผ๋ฆฌ๋ ์ผ์นํ๋ ๋ฌธ์์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ์ฌ ๊ฒ์ ๊ฒฐ๊ณผ์ ์์๋ฅผ ์กฐ์ ํฉ๋๋ค. ์ด๋ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ผ์นํ๋ ๋ฌธ์์ ์ค์๋๋ฅผ ๋์ด๊ฑฐ๋ ๋ฎ์ถ ๋ ์ ์ฉํฉ๋๋ค.
๋ถ๋ฆฌ ์ต๋(dis_max) ์ฟผ๋ฆฌ:
๋ถ๋ฆฌ ์ต๋ ์ฟผ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ทธ ์ค ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๊ฐ์ง ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ๋ค์ํ ์ฟผ๋ฆฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฐ์ฅ ๊ด๋ จ์ฑ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์ ๋ ์ ์ฉํฉ๋๋ค.
GET books/_search
{
"query": {
"bool": {
"must": [ { } ],
"must_not": [ { } ],
"should": [ { } ],
"filter": [ { } ]
}
}
}
must: ๋ฌธ์์ ์ผ์นํด์ผ ํ๋ ์กฐ๊ฑด์ ๋ํ๋ ๋๋ค. ์ฆ, ์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฌธ์๋ง ๊ฒฐ๊ณผ์ ํฌํจ๋ฉ๋๋ค.
must_not: ๋ฌธ์์ ์ผ์นํ์ง ์์์ผ ํ๋ ์กฐ๊ฑด์ ๋ํ๋ ๋๋ค. ์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฌธ์๋ ๊ฒฐ๊ณผ์์ ์ ์ธ๋ฉ๋๋ค.
should: ๋ฐ๋์ ์ผ์นํด์ผ ํ๋ ๊ฒ์ ์๋์ง๋ง, ์ผ์นํ๋ ๊ฒฝ์ฐ ๋์ ๊ด๋ จ์ฑ ์ ์๊ฐ ๋ถ์ฌ๋๋ ์กฐ๊ฑด์ ๋ํ๋ ๋๋ค. ์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฌธ์๋ ๊ฒฐ๊ณผ์ ํฌํจ๋ ์ ์์ง๋ง, ๋ฐ๋์ ํฌํจ๋์ง๋ ์์ต๋๋ค.
filter: must์ ๊ฐ์ด ๋ฌธ์์ ์ผ์นํ์ง๋ง, ๊ด๋ จ์ฑ ์ ์์ ์ํฅ์ ์ฃผ์ง ์๋ ์กฐ๊ฑด์ ๋ํ๋ ๋๋ค. ์ผ์นํ๋ ๋ฌธ์๋ ๊ฒฐ๊ณผ์ ํฌํจ๋์ง๋ง, ๊ด๋ จ์ฑ ์ ์๊ฐ ๋ถ์ฌ๋์ง ์์ต๋๋ค.
์ฐธ๊ณ *) Elasticsearch์ ๋ฐ์ดํฐ ๊ด๋ จ ๊ธฐ๋ฅ๊ณผ REST API์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ ๊ณต.
https://esbook.kimjmin.net/04-data/4.1-rest-api
https://esbook.kimjmin.net/04-data/4.2-crud
https://esbook.kimjmin.net/04-data/4.3-_bulk
https://esbook.kimjmin.net/04-data/4.4-_search
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
GET books/_search
{
"query": {
"bool": { โ ๋ถ์ธ ์ฟผ๋ฆฌ
"must": { โ must ์ โ ๋ฌธ์๊ฐ ๊ธฐ์ค๊ณผ ์ผ์นํด์ผ ํจ
"match": { โ match ์ฟผ๋ฆฌ โ Joshua Bloch๊ฐ ์ด ์ฑ
๊ณผ ์ผ์นํ๋ ๊ถ๋ฆฌ
"author": "Joshua Bloch"
}
}
}
},
"_source": ["title", "author"]
}
"books" ์ธ๋ฑ์ค์์ "author" ํ๋๊ฐ "Joshua Bloch"์ธ ๋ฌธ์๋ฅผ ๊ฒ์ํ๋ ๋ถ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
๋ถ์ธ ์ฟผ๋ฆฌ(bool query): ๋ถ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ๊ฒ์ ์กฐ๊ฑด์ ์กฐํฉํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ "must" ์ ์ ์ฌ์ฉํ์ฌ ๋ฌธ์๊ฐ ํน์ ์กฐ๊ฑด๊ณผ ์ผ์นํด์ผ ํ๋ค๋ ์กฐ๊ฑด์ ์ง์ ํ๊ณ ์์ต๋๋ค.
must ์ (must clause): must ์ ์ ๋ฌธ์๊ฐ ์ง์ ๋ ์กฐ๊ฑด๊ณผ ๋ฐ๋์ ์ผ์นํด์ผ ํจ์ ๋ํ๋ ๋๋ค. ์ฌ๊ธฐ์๋ "author" ํ๋๊ฐ "Joshua Bloch"์ธ ๋ฌธ์๋ฅผ ์ฐพ๊ณ ์์ต๋๋ค.
match ์ฟผ๋ฆฌ(match query): match ์ฟผ๋ฆฌ๋ ์ง์ ๋ ํ๋์์ ํน์ ๊ฐ๊ณผ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ๊ฒ์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ "author" ํ๋์์ "Joshua Bloch"์ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ์ฐพ๊ณ ์์ต๋๋ค.
๊ฒ์ ๊ฒฐ๊ณผ์๋ "_source" ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ๊ฒฐ๊ณผ์ ํฌํจ๋ ํ๋๋ฅผ ์ง์ ํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ "title"๊ณผ "author" ํ๋๋ง ๊ฒฐ๊ณผ์ ํฌํจ์ํค๊ณ ์์ต๋๋ค.
์ด ์์ฒญ์ "author" ํ๋๊ฐ "Joshua Bloch"์ธ ์ฑ
์ ์ ๋ชฉ๊ณผ ์ ์ ์ ๋ณด๋ฅผ ๊ฒ์ํ์ฌ ๋ฐํ
"match_phrase" ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ํ ๋จ์ด๋ ๊ตฌ๋ฌธ์ด ๋ฌธ์ ๋ด์์ ์ ํํ ์์๋ก ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
"author" ํ๋๊ฐ "Joshua Block"์ธ ๋ฌธ์๋ฅผ ์ฐพ์ต๋๋ค.
"amazon_rating" ํ๋์ ๊ฐ์ด 4.7 ๋ฏธ๋ง์ธ ๋ฌธ์๋ ์ ์ธํฉ๋๋ค.
*) _score๋ ๊ฒ์ ๊ฒฐ๊ณผ์ ๊ด๋ จ์ฑ์ ๋ํ๋ด๋ ๊ฐ์ผ๋ก, ๋์ _score๋ฅผ ๊ฐ์ง ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์ฟผ๋ฆฌ์ ๋ ๊ด๋ จ์ฑ์ด ๋์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ฉฐ ๊ฒ์ ๊ฒฐ๊ณผ์ ์์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
โ should ์ ์ ์กฐ๊ฑด์ ๊ฒ์ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋, ๋ง์ฝ ์ผ์นํ๋ค๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ์ ์ ์ฌ๋ ์ ์๊ฐ ์ฆ๊ฐํ๋ ๊ฒ์ ํ์ธ
์ง๊ณ ์ ํ
๋ฉํธ๋ฆญ ์ง๊ณ - ํฉ๊ณ, ์ต์, ์ต๋, ํ๊ท โ ๋ฌธ์ ๋ฐ์ดํฐ ์งํฉ ์ ์ฒด์ ๊ฑธ์ณ ์ง๊ณ๋ ๊ฐ
๋ฒํท ์ง๊ณ - ๋ ์ง, ์ฐ๋ น ๊ทธ๋ฃน ๋ฑ๊ณผ ๊ฐ์ ๊ฐ๊ฒฉ์ผ๋ก ๋ถ๋ฆฌ๋ ๋ฒํท์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ์ง๊ณ โ ํ์คํ ๊ทธ๋จ, ์ํ ์ฐจํธ, ๊ธฐํ ์๊ฐํ ๊ตฌ์ถ์ ์ฌ์ฉ
ํ์ดํ๋ผ์ธ ์ง๊ณ - ๋ค๋ฅธ ์ง๊ณ์ ์ถ๋ ฅ์ ๋ํด ์๋ํ๋ ์ง๊ณ
๊ฒ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก _search ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉ
query ๊ฐ์ฒด ๋์ aggs ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ
https://github.com/madhusudhankonda/elasticsearch-in-action/blob/main/datasets/covid-26march2021.txt
GET books/_search โ ์กฐํ์ ๋์ผํ ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉ(_search API๋ฅผ ์ด์ฉ)
{
"aggs": { โ ์ง๊ณ๋ฅผ ์๋ฏธ
"avg_rating": { โ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ์ฌ์ฉ์ ์ ์ ์ด๋ฆ
"avg": { โ ์ง๊ณ ์ ํ (avg = ํ๊ท )
"field": "amazon_rating" โ ์ง๊ณ ๋์
}
}
}
}
๋ฌธ์ ๊ตฌ์กฐ
{
"country": "United States of America",
"date": "2021-03-26",
"cases": 30853032, โ ํ์ง์
"deaths": 561142, โ ์ฌ๋ง์
"recovered": 23275268, โ ์์น์
"critical": 8610 โ ์ค์ฆํ์
}
์ง๊ณ(aggregation): "critial_patients"
"critical" ํ๋์ ๊ฐ์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
์ด ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด "critical" ํ๋์ ๊ฐ์ด ๋ชจ๋ ํฉ์ฐ๋์ด ์ค์ํ ํ์๋ค์ ์ด ์๊ฐ ๋ฐํ๋ ๊ฒ์ ๋๋ค.
"size 0" : ๊ฒ์ ๊ฒฐ๊ณผ๋ก ๋ฌธ์๋ฅผ ๋ฐํํ์ง ์๊ณ , ์ง๊ณ ๊ฒฐ๊ณผ๋ง ๋ฐํํฉ๋๋ค.
"aggs": ์ง๊ณ ์ฟผ๋ฆฌ๋ฅผ ์ ์ํฉ๋๋ค.
"critical_patients": ์ง๊ณ์ ์ด๋ฆ์ ์ ์ํฉ๋๋ค.
"sum": ์ง์ ๋ ํ๋์ ๊ฐ์ ํฉ์ฐํฉ๋๋ค.
"field": "critical": critical ํ๋์ ๊ฐ์ ์ฌ์ฉํ์ฌ ํฉ์ฐํฉ๋๋ค. ์ด ํ๋๋ ํ์์ ์ฌ๊ฐํ ์ํ๋ฅผ ๋ํ๋ด๋ ๊ฒ์ผ๋ก ์ถ์ ๋ฉ๋๋ค.
"size": 0: ๊ฒ์ ๊ฒฐ๊ณผ๋ก ๋ฌธ์๋ฅผ ๋ฐํํ์ง ์๊ณ , ์ง๊ณ ๊ฒฐ๊ณผ๋ง ๋ฐํํฉ๋๋ค.
"aggs": ์ง๊ณ ์ฟผ๋ฆฌ๋ฅผ ์ ์ํฉ๋๋ค.
"max_deaths": ์ต๋ ์ฌ๋ง์ ์๋ฅผ ๊ณ์ฐํ๋ ์ง๊ณ์ ๋๋ค.
"min_deaths": ์ต์ ์ฌ๋ง์ ์๋ฅผ ๊ณ์ฐํ๋ ์ง๊ณ์ ๋๋ค.
"min": ์ต์ ๊ฐ์ ์ฐพ๊ธฐ ์ํ ์ง๊ณ ์ ํ์ ๋๋ค.
"field": "deaths": deaths ํ๋์ ๊ฐ์์ ์ต์ ๊ฐ์ ์ฐพ์ต๋๋ค.
"avg_deaths": ํ๊ท ์ฌ๋ง์ ์๋ฅผ ๊ณ์ฐํ๋ ์ง๊ณ์ ๋๋ค.
"field": "deaths": deaths ํ๋์ ๊ฐ์ ํ๊ท ์ ๊ณ์ฐํฉ๋๋ค.
"stats" ์ง๊ณ๋ ์ง์ ๋ ํ๋์ ๋ํ ๋ค์๊ณผ ๊ฐ์ ํต๊ณ ์ ๋ณด๋ฅผ ๊ณ์ฐํฉ๋๋ค:
count: ํด๋น ํ๋์ ๊ฐ์ ๊ฐ์
min: ํด๋น ํ๋์ ์ต์๊ฐ
max: ํด๋น ํ๋์ ์ต๋๊ฐ
avg: ํด๋น ํ๋์ ํ๊ท ๊ฐ
sum: ํด๋น ํ๋์ ๋ชจ๋ ๊ฐ์ ํฉ๊ณ
"size": 0: ๊ฒ์ ๊ฒฐ๊ณผ๋ก ๋ฌธ์๋ฅผ ๋ฐํํ์ง ์๊ณ , ์ง๊ณ ๊ฒฐ๊ณผ๋ง ๋ฐํํฉ๋๋ค.
"aggs" : ์ง๊ณ ์ฟผ๋ฆฌ๋ฅผ ์ ์ํฉ๋๋ค.
"all_stats" : ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ๋ ์ฌ์ฉํ๋ ์ฌ์ฉ์ ์ ์ ์ด๋ฆ์ ๋๋ค.
"stats" : ๊ฐ์, ์ต์๊ฐ, ์ต๋๊ฐ, ํ๊ท , ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ ์ง๊ณ ์ ํ์ ๋๋ค.
"field": "deaths" : deaths ํ๋์ ๊ฐ์ ๋ํด ํต๊ณ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
โ count: ํด๋น ํ๋์ ๊ฐ์ ๊ฐ์
โก min: ํด๋น ํ๋์ ์ต์๊ฐ
โข max: ํด๋น ํ๋์ ์ต๋๊ฐ
โฃ avg: ํด๋น ํ๋์ ํ๊ท ๊ฐ
โค sum: ํด๋น ํ๋์ ๋ชจ๋ ๊ฐ์ ํฉ๊ณ
โฅ sum_of_squares: ํด๋น ํ๋ ๊ฐ์ ์ ๊ณฑ์ ํฉ
โฆ variance: ํด๋น ํ๋ ๊ฐ์ ๋ถ์ฐ
โง std_deviation: ํด๋น ํ๋ ๊ฐ์ ํ์ค ํธ์ฐจ
โจ std_deviation_bounds: ํ์ค ํธ์ฐจ ๊ฒฝ๊ณ๊ฐ์ ํฌํจํ ๊ฐ์ฒด
๋ฐ์ดํฐ๋ฅผ ๋ค์ํ ๊ทธ๋ฃน์ด๋ ๋ฒํท์ผ๋ก ๋ถ๋ฆฌ โ ๋ฒํทํ
ํ์คํ ๊ทธ๋จ์ ํ๋ ๊ฐ์ ์ง์ ๋ ๊ฐ๊ฒฉ(interval)์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ทธ๋ฃน์ผ๋ก ๋๋๋ ์ง๊ณ ๋ฐฉ๋ฒ ์ค ํ๋์ ๋๋ค. ๊ฐ ๊ทธ๋ฃน์ "๋ฒํท"์ด๋ผ๊ณ ๋ ๋ถ๋ฆฝ๋๋ค.
"size": 0: ๊ฒ์ ๊ฒฐ๊ณผ๋ก ๋ฌธ์๋ฅผ ๋ฐํํ์ง ์๊ณ , ์ง๊ณ ๊ฒฐ๊ณผ๋ง ๋ฐํํฉ๋๋ค.
"aggs": ์ง๊ณ ์ฟผ๋ฆฌ๋ฅผ ์ ์ํฉ๋๋ค.
"critical_patients_as_histogram": ํ์คํ ๊ทธ๋จ์ ๋ํ๋ด๋ ์ฌ์ฉ์ ์ ์ ์ด๋ฆ์ ๋๋ค.
"histogram": ํ์คํ ๊ทธ๋จ ์ง๊ณ๋ฅผ ์ ์ํฉ๋๋ค.
"field": "critical" : critical ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์คํ ๊ทธ๋จ์ ์์ฑํฉ๋๋ค.
"interval": 2500 : ๊ฐ ๋ฒํท(bin)์ ํฌ๊ธฐ๋ฅผ ์ง์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ critical ๊ฐ์ ๋ฒ์๋ฅผ 2500 ๋จ์๋ก ๋๋์ด ๋ฒํท์ ์์ฑํฉ๋๋ค.
0๋ถํฐ 2499๊น์ง์ ๊ฐ์ ํด๋นํ๋ ๋ฌธ์๊ฐ 4๊ฐ ์์ต๋๋ค.
2500๋ถํฐ 4999๊น์ง์ ๊ฐ์ ํด๋นํ๋ ๋ฌธ์๊ฐ 3๊ฐ ์์ต๋๋ค.
5000๋ถํฐ 7499๊น์ง์ ๊ฐ์ ํด๋นํ๋ ๋ฌธ์๊ฐ 0๊ฐ ์์ต๋๋ค.
7500๋ถํฐ ๋๊น์ง์ ๊ฐ์ ํด๋นํ๋ ๋ฌธ์๊ฐ 3๊ฐ ์์ต๋๋ค.
๋ฒ์ ๋ฒํท์ ์ง์ ๋ ํ๋์ ๊ฐ์ ๋ฒ์๋ก ๊ทธ๋ฃนํํ์ฌ ํด๋น ๋ฒ์์ ์ํ๋ ๋ฌธ์์ ๊ฐ์๋ฅผ ์ง๊ณํฉ๋๋ค.
"field": "critical": critical ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฒ์๋ฅผ ์ค์ ํฉ๋๋ค.
"ranges": ๊ฐ ๋ฒ์๋ฅผ ์ ์ํฉ๋๋ค. ๊ฐ ๋ฒ์๋ ์์๊ฐ๊ณผ ๋๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ฃผ์ด์ง ๊ฒฐ๊ณผ๋ "critical_patients_as_range" ์ง๊ณ์ ๊ฒฐ๊ณผ๋ก ์์ฑ๋ ๋ฒ์ ๋ฒํท์ ๋ณด์ฌ์ค๋๋ค. ๊ฐ ๋ฒํท์ "critical" ํ๋์ ๊ฐ์ ํน์ ๋ฒ์๋ก ๋๋์ด์ ํด๋น ๋ฒ์์ ์ํ๋ ๋ฌธ์์ ๊ฐ์๋ฅผ ์ง๊ณํฉ๋๋ค.
"key": ๋ฒ์๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด์ ๋๋ค. ๋ฒ์๋ ์์๊ฐ๊ณผ ๋๊ฐ์ผ๋ก ํ์๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฒซ ๋ฒ์งธ ๋ฒํท์ 0๋ถํฐ 60000๊น์ง์ ๋ฒ์๋ฅผ ๋ํ๋ ๋๋ค.
"from": ๋ฒ์์ ์์๊ฐ์ ๋ํ๋ด๋ ์ซ์์ ๋๋ค.
"to": ๋ฒ์์ ๋๊ฐ์ ๋ํ๋ด๋ ์ซ์์ ๋๋ค.
"doc_count": ํด๋น ๋ฒ์์ ์ํ๋ ๋ฌธ์์ ๊ฐ์๋ฅผ ๋ํ๋ ๋๋ค
์๋น์ค ํ๊ฒฝ์์๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ํ ์์ค์์ ์์ฑ๋๋ฉฐ, ์ด๋ฌํ ๋ฐ์ดํฐ๋ ์ค์์ง์ค์ ๋ก๊น ํ๋ซํผ์ ํตํด ์์ง, ์ ์ฅ, ๋ถ์๋์ด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๋ฐ์ดํฐ ์ ํ์ด ํฌํจ๋ ์ ์์ต๋๋ค:
โ ๋คํธ์ํฌ ์ข ๋จ์ ์๋ ๊ธฐ๊ธฐ:
โก ํ๋ก ํธ์๋, ๋ฐฑ์๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ ๊ทธ๋ฃน:
โข ๊ณ ๊ฐ์ด ์คํํ๋ ์ ํ๋ฆฌ์ผ์ด์ :
์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๊ฐํ ๊ณ์ธก ๋ฐ์ดํฐ(์: ์ฑ๋ฅ ์งํ, ์ฌ์ฉ๋ ๋ฐ์ดํฐ ๋ฑ)์ ์ถ์ ๋ฐ์ดํฐ(์: ์ฌ์ฉ์ ํ๋, ์ด๋ฒคํธ ๋ก๊ทธ ๋ฑ)๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฌํ ๋ฐ์ดํฐ๋ ์๋น์ค์ ์ฌ์ฉ์ ๊ฒฝํ์ ํ๊ฐํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ , ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ก๊ทธ(Logs):
๋ก๊ทธ๋ ์์คํ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ฑํ, ํน์ ์ด๋ฒคํธ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๋๋ค. ์ด๋ฌํ ์ด๋ฒคํธ์๋ ์ค๋ฅ ๋ฉ์์ง, ๊ฒฝ๊ณ ๋ฉ์์ง, ์ ๋ณด ๋ฉ์์ง, ๋๋ฒ๊ทธ ๋ฉ์์ง ๋ฑ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
๋ก๊ทธ๋ ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ ํ์์ผ๋ก ๊ธฐ๋ก๋๋ฉฐ, ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์๊ฐ, ์ด๋ฒคํธ ์ ํ, ์ด๋ฒคํธ์ ๋ํ ์์ธ ๋ด์ฉ ๋ฑ์ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค
์ฃผ์ ์ฉ๋๋ ๋ฌธ์ ํด๊ฒฐ, ๋๋ฒ๊น , ๊ฐ์ฌ ์ถ์ ๋ฑ์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๋ฉํธ๋ฆญ(Metrics):
๋ฉํธ๋ฆญ์ ํน์ ์์ ์์ ์์คํ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์ธก์ ํ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, CPU ์ฌ์ฉ๋ฅ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ๋์คํฌ ์ฉ๋, ๋คํธ์ํฌ ์๋ ๋ฑ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
๋ฉํธ๋ฆญ์ ์ซ์ ํ์์ผ๋ก ๊ธฐ๋ก๋๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก๋ ์๊ฐ ๊ฐ๊ฒฉ๋ง๋ค ์ธก์ ๋๊ณ ๊ธฐ๋ก๋ฉ๋๋ค.
์ฃผ์ ์ฉ๋๋ ์์คํ
๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง, ๋ฆฌ์์ค ์ฌ์ฉ ์ถ์ , ์ฉ๋ ๊ณํ ๋ฑ์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๋น์ธ (Beats)๋ Elastic Stack๊ณผ ํตํฉ๋์ด ๋ฐ์ดํฐ ์์ง์ ๋ด๋นํ๋ ๊ฒฝ๋ ๋ฐ์ดํฐ ์์ง๊ธฐ์ ๋๋ค.
Beats๋ ๋ก๊ทธ, ๋ฉํธ๋ฆญ, ์ด๋ฒคํธ ๋ฑ ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ์ค์ ์ง์ค์์ผ๋ก ์ ์กํฉ๋๋ค.
โช ๋์คํฌ์ ์๋ ํ์ผ
โช HTTP API ์๋ํฌ์ธํธ
โช ์นดํ์นด, ์ ์ ์ด๋ฒคํธ ์์ง๊ธฐ, GCP Pub/Sub ๊ฐ์ ๋ฉ์์ง ์คํธ๋ฆผ
โช Syslog ๋ฆฌ์ค๋