Elasticsearch
- κ²μ μμ§ (search engine) μ μΉμμ μ 보λ₯Ό μμ§ν΄ κ²μ κ²°κ³Όλ₯Ό μ 곡νλ νλ‘κ·Έλ¨
- κ²μ μμ§μ κ²μ κ²°κ³Όλ‘ μ 곡λλ λ°μ΄ν°μ νΉμ±μ λ°λΌ ꡬν ννκ° κ°κ° λ¬λΌμ§
- κ²μ μμ€ν
(search system) μ λμ©λ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ μ λ’°μ± μλ κ²μ κ²°κ³Όλ₯Ό μ 곡νκΈ° μν΄ κ²μ μμ§μ κΈ°λ°μΌλ‘ ꡬμΆλ μμ€ν
μ ν΅μΉνλ μ©μ΄
- μμ§κΈ°λ₯Ό μ΄μ©ν΄ λ°©λν λ°μ΄ν°λ₯Ό μμ§νκ³ μ΄λ₯Ό λ€μμ κ²μ μμ§μ μ΄μ©ν΄ μμΈνκ³ κ²μ κ²°κ³Όλ₯Ό UIλ‘ μ 곡
- μμ€ν
λ΄λΆμ μ μ±
μ λ°λΌ κ΄λ ¨λκ° λμ λ¬Έμλ₯Ό κ²μ κ²°κ³Όμ μμμ λ°°μΉν μ μμ λΏλλ¬ νΉμ νλλ λ¬Έμμ κ°μ€μΉλ₯Ό λ¬μ κ²μμ μ νλλ₯Ό λμΌ μ μμ
- κ²μ μλΉμ€ (search service) λ κ²μ μμ§μ κΈ°λ°μΌλ‘ ꡬμΆν κ²μ μμ€ν
μ νμ©ν΄ κ²μ κ²°κ³Όλ₯Ό μλΉμ€λ‘ μ 곡
Elasticsearch
λ μλ°ν λ§νμλ©΄ κ²μ μμ§μ΄λ©° κ²μ μλΉμ€λ₯Ό μ 곡νκΈ° μν΄ Elasticsearch
λ₯Ό μ΄μ©ν΄ κ²μ μμ€ν
μ κ΅¬μΆ ν μ μμ
Elasticsearch λ?
Elasticsearch
λ ν
μ€νΈ β μ«μ β μμΉ κΈ°λ° μ 보 β μ ν λ° λΉμ ν λ°μ΄ν° λ± λͺ¨λ μ νμ λ°μ΄ν°λ₯Ό μν λ¬΄λ£ κ²μ λ° λΆμ μμ§
- Apache Lucene (μνμΉ λ£¨μ¬) κΈ°λ°μ Java μ€νμμ€ λΆμ° κ²μ μμ§
Elasticsearch
λ₯Ό ν΅ν΄ Lucene λΌμ΄λΈλ¬λ¦¬λ₯Ό λ¨λ
μΌλ‘ μ¬μ©ν μ μκ² λμμΌλ©° λ°©λν μμ λ°μ΄ν°λ₯Ό κ±°μ μ€μκ° (NRT: Near Real Time) μΌλ‘ μ μ₯ β κ²μ β λΆμν μ μμ
Elasticsearch
λ κ²μμ μν΄ λ¨λ
μΌλ‘ μ¬μ©λκΈ°λ νλ©° ELK Stack (Elasticsearch
/ Logstatsh
/ Kibana
) μΌλ‘ μ¬μ©λκΈ°λ ν¨
Tip! ELK Stackμ΄λ?
- Logstash (λ‘κ·Έμ€νμ)
λ€μν μμ€ (DB β CSV νμΌ λ±) μ λ‘κ·Έ λλ νΈλμμ
λ°μ΄ν°λ₯Ό μμ§ β μ§κ³ β νμ±νμ¬ Elasticsearch
λ‘ μ λ¬
- Elasticsearch (μλΌμ€ν±μμΉ)
Logstash
λ‘λΆν° λ°μ λ°μ΄ν°λ₯Ό κ²μ λ° μ§κ³λ₯Ό νμ¬ νμν κ΄μ¬ μλ μ 보λ₯Ό νλ
- Kibana (ν€λ°λ)
Elasticsearch
μ λΉ λ₯Έ κ²μμ ν΅ν΄ λ°μ΄ν°λ₯Ό μκ°ν λ° λͺ¨λν°λ§
Elasticsearchμ νΉμ§
μ€νμμ€ (Open Source)
Elasticsearch
μ ν΅μ¬ κΈ°λ₯λ€μ Apache 2.0 λΌμ΄μΌμ€λ‘ λ°°ν¬λκ³ μκ³ Elastic Stack μ λͺ¨λ μ νλ€μ ( https://github.com/elastic ) λ ν¬μ§ν 리μμ μμ€λ₯Ό μ°Ύμ μ μμ
- 6.3 λ²μ λΆν°λ Elastic λΌμ΄μΌμ€μ Apache λΌμ΄μΌμ€κ° μμ¬ μμ§λ§ κ°κ°μ λ²μ μ λν΄ λ³λ λ°°ν¬νμ΄ μ‘΄μ¬νκ³ λΌμ΄μΌμ€ νμΌμμ μ΄λ€ κ²½λ‘μ νμΌλ€μ΄ μ΄λ€ λΌμ΄μΌμ€λ‘ λμ΄ μλμ§ νμΈμ΄ κ°λ₯
- νμ¬λ x-pack λλ ν 리 μλ μλ νμΌλ€λ§μ΄ Elastic λΌμ΄μΌμ€λ₯Ό λ°λ₯΄κ³ κ·Έ μΈμ νμΌλ€μ Apache λΌμ΄μΌμ€λ₯Ό λ°λ¦
- Lucene μ΄ Java λ‘ λ§λ€μ΄μ‘κΈ° λλ¬Έμ
Elasticsearch
λ λ§μ°¬κ°μ§λ‘ Java λ‘ μ½λ©μ΄ λμ΄ μμ
- Lucene μ Hadoop (νλ‘) μ κ°λ°ν Doug Cutting (λκ·Έ 컀ν
) μ μν΄ μ²μ λ§λ€μ΄μ‘μ§λ§
Elasticsearch
μμ§λμ΄λ€ μ€μλ Lucene 컀미ν°λ€μ΄ λ€μ μμ΄μ Lucene μ λ§€μ° κΉμ λ 벨μμ λ€λ£¨κ³ μμ
- Elastic μ¬μ Lucene 컀미ν°μΈ κ°λ°μλ€μ΄ μ€μ λ‘ Lucene νλ‘μ νΈμ μ λ° μ΄μμ κΈ°λ₯μ κ°λ°μ κΈ°μ¬νκ³ μμ
μ€μκ° λΆμ (Real-Time)
Elasticsearch
μ κ°μ₯ ν° νΉμ§ μ€ νλλ μ€μκ° (real-time) λΆμ μμ€ν
- νμ¬ λμ©λ λ°μ΄ν° λΆμμ κ°μ₯ λ리 μ¬μ©λκ³ μλ κ²μ Hadoop νλ«νΌ μμμ μ€νλλ Pig β Hiveμ κ°μ λ€μν Map Reducer (맡 리λμ)
- Hadoop μ κΈ°λ³Έμ μΌλ‘ λ°°μΉ κΈ°λ°μ λΆμ μμ€ν
μΌλ‘ λΆμμ μ¬μ©λ μμ€ λ°μ΄ν° β λΆμμ μν ν νλ‘κ·Έλ¨μ μ¬λ € λκ³ λΆμμ μ€ννμ¬ κ²°κ³Ό μ
μ΄ λμ€λλ‘ νλ νλμ 루ν΄μΌλ‘ μ€ν
Elasticsearch
λ Hadoop μμ€ν
κ³Ό λ¬λ¦¬ Elasticsearch
ν΄λ¬μ€ν°κ° μ€νλκ³ μλ λμμλ κ³μν΄μ λ°μ΄ν°κ° μ
λ ₯ (κ²μ μμ§μμλ μμΈ: μΈλ±μ± indexing μ΄λΌκ³ νν) λκ³ κ·Έμ λμμ μ€μκ°μ κ°κΉμ΄ (NRT: Near Real Time) μλλ‘ μμΈλ λ°μ΄ν°μ κ²μ β μ§κ³κ° κ°λ₯
Tip! 맡 리λμ (Map reducer) λ?
κ±°λν μΈν λ°μ΄ν°λ₯Ό μͺΌκ°μ΄ μλ§μ λ¨Έμ λ€μκ² λΆμ°μμΌμ λ‘μ§μ μνν λ€μ κ²°κ³Όλ₯Ό νλλ‘ ν©μΉμλ κ²μ΄ ν΅μ¬ μμ΄λμ΄
- Map Reduce μ§ν μμ
- μͺΌκ°κΈ° (Split): ν¬κΈ°κ° ν° μΈν νμΌμ μμ λ¨μμ μ²ν¬λ€λ‘ λλμ΄ λΆμ° νμΌ μμ€ν
(μμ: HDFS) μ μ μ₯
- λ°μ΄ν° μ²λ¦¬νκΈ° (Map): μκ² μͺΌκ°μ΄μ§ νμΌμ μΈνμΌλ‘ λ°μμ λ°μ΄ν°λ₯Ό λΆμνλ λ‘μ§μ μν
- μ²λ¦¬λ λ°μ΄ν° ν©μΉκΈ° (Reduce): μ²λ¦¬λ λ°μ΄ν°λ₯Ό λ€μ ν©μΉ¨
μ λ¬Έ (Full Text) κ²μ μμ§
- Lucene μ κΈ°λ³Έμ μΌλ‘ Inverted File Index (μνμΌ μμΈ) λΌλ κ΅¬μ‘°λ‘ λ°μ΄ν°λ₯Ό μ μ₯
- Lucene μ μ¬μ©νκ³ μλ
Elasticsearch
λ λ§μ°¬κ°μ§λ‘ μμΈλ λͺ¨λ λ°μ΄ν°λ₯Ό μνμΌ μμΈ κ΅¬μ‘°λ‘ μ μ₯νμ¬ κ°κ³΅λ ν
μ€νΈλ₯Ό κ²μ
- μ΄λ° νΉμ±μ μ λ¬Έ (full text) κ²μμ΄λΌκ³ ν¨
- JSON λ¬Έμ κΈ°λ°
Elasticsearch
λ λ΄λΆμ μΌλ‘λ μνμΌ μμΈ κ΅¬μ‘°λ‘ λ°μ΄ν°λ₯Ό μ μ₯νκ³ μμΌλ μ¬μ©μμ κ΄μ μμλ JSON νμμΌλ‘ λ°μ΄ν°λ₯Ό μ λ¬
- JSON νμμ κ°κ²°νκ³ κ°λ°μλ€μ΄ λ€λ£¨κΈ° νΈν κ΅¬μ‘°λ‘ λμ΄ μμ΄ μμΈ ν λμ λ¬Έμλ₯Ό κ°κ³΅ νκ±°λ λ€λ₯Έ ν΄λΌμ΄μΈνΈ νλ‘κ·Έλ¨κ³Ό μ°λνκΈ°μ μ©μ΄
- λν key-value νμμ΄ μλ λ¬Έμ κΈ°λ°μΌλ‘ λμ΄ μκΈ°μ 볡ν©μ μΈ μ 보λ₯Ό ν¬ν¨νλ νμμ λ¬Έμλ₯Ό μλ κ·Έλλ‘ μ μ₯μ΄ κ°λ₯νλ©° μ¬μ©μκ° μ§κ΄μ μΌλ‘ μ΄ν΄νκ³ μ¬μ©ν μ μμ
Elasticsearch
μμ μ§μμ μ¬μ©λλ 쿼리문μ΄λ 쿼리μ λν κ²°κ³Όλ λͺ¨λ JSON νμμΌλ‘ μ λ¬λκ³ λ°ν
- λ€λ§ JSONμ΄
Elasticsearch
κ° μ§μνλ μ μΌν νμμ΄κΈ° λλ¬Έμ μ¬μ μ μ
λ ₯ν λ°μ΄ν°λ₯Ό JSON νμμΌλ‘ κ°κ³΅νλ κ²μ΄ νμ
- CSV β Apache log β Syslog λ±κ³Ό κ°μ΄ λ리 μ¬μ©λλ νμλ€μ
Logstash
μμ λ³νμ μ§μνκ³ μμ
RESTFul API
- νμ¬ λκ·λͺ¨ μμ€ν
λ€μ λλΆλΆ MSA (λ§μ΄ν¬λ‘ μλΉμ€ μν€ν
μ²) λ₯Ό κΈ°λ³ΈμΌλ‘ μ€κ³
- μ΄λ¬ν ꡬ쑰μ λΉ μ§ μ μλ κ²μ΄ REST API μ κ°μ νμ€ μΈν°νμ΄μ€
Elasticsearch
λ Rest API λ₯Ό κΈ°λ³ΈμΌλ‘ μ§μνλ©° λͺ¨λ λ°μ΄ν° μ‘°ν β μ
λ ₯ β μμ λ₯Ό HTTP νλ‘ν μ½μ ν΅ν΄ Rest API λ‘ μ²λ¦¬
Tip!
Elasticsearch
λ κΈ°λ³Έμ μΌλ‘ HTTP λ₯Ό ν΅ν΄ JSON νμμ RESTful API λ₯Ό μ΄μ©
Elasticsearch
λ Java λ‘ κ°λ°λμ§λ§ μ¬λ¬ κ°μ§ νλ‘κ·Έλλ° μΈμ΄λ₯Ό ν΅ν΄ νμ©ν μλ μμ
Elasticsearch
λ₯Ό μ¬μ©νκΈ° μν API μμ² κ΅¬μ‘°
curl -X(λ©μλ) http://host:port/(μΈλ±μ€)/(νμ
)/(λ¬Έμ id) -d '{json λ°μ΄ν°}'
Elasticsearch
λ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ κ²μλ³΄λ€ ν¨μ¬ μ μ°
- μμμΈλλ λ¬Έμμ΄ μ 체λ₯Ό μ μ±
μ λ°λΌ μλ¬Έμ νΉμ λλ¬Έμλ‘ μμ±νκ³ μΏΌλ¦¬κ° λ€μ΄μ€λ νν°λ₯Ό μμΈ μκ°κ³Ό κ²μ μκ°μ λμΌνκ² μ§μ νλ€λ©΄ ν΄λΉ 쿼리λ μ΄λ ν λ¬Έμμ΄ (λμλ¬Έμ κ΅¬λΆ μμ) μ΄ λ€μ΄μλ κ²μμ΄ κ°λ₯
- λν
Elasticsearch
λ ꡬ쑰νλμ§ μμ λΉμ ν λ°μ΄ν°λ κ²μμ΄ κ°λ₯
- λ°μ΄ν°λ² μ΄μ€λ μ€ν€λ§λ₯Ό 미리 μ μν΄μΌλ§ λ°μ΄ν° μ μ₯κ³Ό μ‘°νκ° κ°λ₯ν λ°λ©΄
Elasticsearch
λ ꡬ쑰νλμ§ μμ λ°μ΄ν°κΉμ§ μ€μ€λ‘ λΆμν΄ μλμΌλ‘ νλλ₯Ό μμ±νκ³ μ μ₯
Elasticsearch
λ NoSQLμ μΌμ’
μΌλ‘μ λΆλ₯κ° κ°λ₯νκ³ λΆμ° μ²λ¦¬λ₯Ό ν΅ν΄ μ€μκ°μ μ€νλ λΉ λ₯Έ κ²μμ΄ κ°λ₯
- κΈ°μ‘΄ λ°μ΄ν°λ² μ΄μ€λ‘λ μ²λ¦¬νκΈ° μ΄λ €μ΄ λλμ λΉμ ν λ°μ΄ν°λ κ²μν μ μμΌλ©° μ λ¬Έ κ²μ (Full Text) κ³Ό ꡬ쑰 κ²μ λͺ¨λλ₯Ό μ§μ
λ©ν°ν
λμ (Multitenancy)
Elasticsearch
μ λ°μ΄ν°λ€μ μΈλ±μ€ (Index) λΌλ λ
Όλ¦¬μ μΈ μ§ν© λ¨μλ‘ κ΅¬μ±λλ©° μλ‘ λ€λ₯Έ μ μ₯μμ λΆμ°λμ΄ μ μ₯
- μλ‘ λ€λ₯Έ μΈλ±μ€λ€μ λ³λμ 컀λ₯μ
μμ΄ νλμ μ§μλ‘ λ¬Άμ΄μ κ²μνκ³ κ²μ κ²°κ³Όλ€μ νλμ μΆλ ₯μΌλ‘ λμΆν μ μλλ°
Elasticsearch
μ μ΄λ¬ν νΉμ§μ λ©ν°ν
λμ λΌκ³ ν¨
Tip! μΆκ° λ΄μ©
κ²μ μμ€ν
μ ꡬμ±μμ
- κ²μ μμ€ν
μ κΈ°λ³Έ ꡬ쑰λ μΌλ°μ μΌλ‘ μ 보λ₯Ό μμ§νλ μμ§κΈ° β μμ§ν λ°μ΄ν°λ₯Ό μ μ₯νλ μ€ν λ¦¬μ§ β μμ§ν λ°μ΄ν°λ₯Ό κ²μμ μ μ ν ννλ‘ λ³ννλ μμΈκΈ° β μμΈλ λ°μ΄ν°μμ μΌμΉνλ λ¬Έμλ₯Ό μ°Ύλ κ²μκΈ°λ‘ κ΅¬μ±
μμ§κΈ°
- μμ§κΈ°λ μΉμ¬μ΄νΈ β λΈλ‘κ·Έ β μΉ΄ν λ± μΉμμ νμν μ 보λ₯Ό μμ§νλ νλ‘κ·Έλ¨
- ν¬λ‘€λ¬ (Crawler) β μ€νμ΄λ (Spider) β μ (Worms) β μΉλ‘λ΄ (Web Robot) λ±μΌλ‘ λΆλ¦Ό
- νμΌ β λ°μ΄ν°λ² μ΄μ€ β μΉνμ΄μ§ λ± μΉ μμ λλΆλΆμ μ λ³΄κ° μμ§ λμ
μ€ν 리μ§
- λ°μ΄ν°λ² μ΄μ€μμ λ°μ΄ν°λ₯Ό μ μ₯νλ 물리μ μΈ μ μ₯μ
- κ²μ μμ§μ μμΈν λ°μ΄ν°λ₯Ό μ€ν 리μ§μ 보κ΄
μμΈκΈ°
- κ²μ μμ§μ΄ μμ§ν μ 보μμ μ¬μ©μ μ§μμ μΌμΉνλ μ 보λ₯Ό μ°ΎμΌλ €λ©΄ μμ§λ λ°μ΄ν°λ₯Ό κ²μ κ°λ₯ν κ΅¬μ‘°λ‘ κ°κ³΅νκ³ μ μ₯ν΄μΌ ν¨
- κ·Έ μν μ νλ κ²μ΄ μμΈκΈ°
- μμΈκΈ°λ λ€μν ννμ λΆμκΈ°λ₯Ό μ‘°ν©ν΄ μ 보μμ μλ―Έκ° μλ μ©μ΄λ₯Ό μΆμΆνκ³ κ²μμ μ 리ν μμμΈ κ΅¬μ‘°λ‘ λ°μ΄ν°λ₯Ό μ μ₯
κ²μκΈ°
- κ²μκΈ°λ μ¬μ©μ μ§μλ₯Ό μ
λ ₯λ°μ μμΈκΈ°μμ μ μ₯ν μμμΈ κ΅¬μ‘°μμ μΌμΉνλ λ¬Έμλ₯Ό μ°Ύμ κ²°κ³Όλ‘ λ°ν
- μ§μμ λ¬Έμκ° μΌμΉνλμ§λ μ μ¬λ κΈ°λ°μ κ²μ μμ μκ³ λ¦¬μ¦μΌλ‘ νλ¨νλλ° κ²μκΈ° λν μμΈκΈ°μ λ§μ°¬κ°μ§λ‘ ννμ λΆμκΈ°λ₯Ό μ΄μ©ν΄ μ¬μ©μ μ§μμμ μ μλ―Έν μ©μ΄λ₯Ό μΆμΆν΄ κ²μ
- λ°λΌμ μ¬μ©νλ ννμ λΆμκΈ°μ λ°λΌ κ²μ νμ§μ΄ λ¬λΌμ§
- κ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ SQL λ¬Έμ μ΄μ©ν΄ μνλ μ 보μ κ²μμ΄ κ°λ₯νλ° ν
μ€νΈ 맀μΉμ ν΅ν λ¨μν κ²μλ§ κ°λ₯
- ν
μ€νΈλ₯Ό μ¬λ¬ λ¨μ΄λ‘ λ³ννκ±°λ μ¬λ¬ κ°μ λμμ΄λ μ μμ΄λ₯Ό νμ©ν κ²μμ λΆκ°λ₯
- λ°λ©΄ κ²μ μμ§μ λ°μ΄ν°λ² μ΄μ€μμλ λΆκ°λ₯ν λΉμ ν λ°μ΄ν°λ₯Ό μμΈνκ³ κ²μν μ μμ
- ννμ λΆμμ ν΅ν΄ μ¬λμ΄ κ΅¬μ¬νλ μμ°μ΄μ μ²λ¦¬κ° κ°λ₯ν΄μ§κ³ μμμΈ κ΅¬μ‘°λ₯Ό λ°νμΌλ‘ λΉ λ₯Έ κ²μ μλλ₯Ό 보μ₯
κΈ°λ³Έ μ©μ΄
Elasticsearch
μ λ°μ΄ν°λ λ€μκ³Ό κ°μ΄ μΈλ±μ€ β νμ
β λ¬Έμ β νλ κ΅¬μ‘°λ‘ κ΅¬μ±
μΈλ±μ€ (Index)
- μΈλ±μ€ (Index) λ λ°μ΄ν° μ μ₯ 곡κ°
- νλμ μΈλ±μ€λ νλμ νμ
λ§ κ°μ§λ©° νλμ 물리μ μΈ λ
Έλμ μ¬λ¬ κ°μ λ
Όλ¦¬μ μΈ μΈλ±μ€λ₯Ό μμ±ν μ μμ
- κ²μ μ μΈλ±μ€ μ΄λ¦μΌλ‘ λ¬Έμ λ°μ΄ν°λ₯Ό κ²μνλ©° μ¬λ¬ κ°μ μΈλ±μ€λ₯Ό λμμ κ²μνλ κ²λ κ°λ₯
Elasticsearch
λ₯Ό λΆμ° νκ²½μΌλ‘ ꡬμ±νλ©΄ νλμ μΈλ±μ€κ° μ¬λ¬ λ
Έλμ λΆμ° μ μ₯λμ΄ κ΄λ¦¬λ¨μ λ°λΌ λΆμ° μ²λ¦¬μ λ°λ₯Έ μ¬λ¬ μ΄μ μ λ릴 μ μμ
Elasticsearch
λ μΈλ±μ€ μμ±μ κΈ°λ³Έμ μΌλ‘ 5κ°μ νλΌμ΄λ¨Έλ¦¬ (Primary) μ€λμ 1κ°μ λ ν리카 (Replica) μ€λ μΈνΈλ₯Ό μμ±
- κ°κ°μ μ€λ μλ μΈλ±μ€λ₯Ό μμ±ν λ μ΅μ
μ μ΄μ©ν΄ λ³κ²½ν μ μμ
- μΈλ±μ€μ μ΄λ¦μ λͺ¨λ μλ¬Έμμ¬μΌ νλ©° μΆκ° β μμ β μμ β κ²μμ RESTful API λ‘ μνν μ μμ
- λ§μ½ μΈλ±μ€κ° μλ μνμμ λ°μ΄ν°κ° μΆκ°λλ€λ©΄ λ°μ΄ν°λ₯Ό μ΄μ©ν΄ μΈλ±μ€κ° μλμΌλ‘ μμ±λ¨
μ€λ (Shard)
- μμΈλ λ¬Έμλ νλμ μΈλ±μ€μ λ΄κΉ
- μΈλ±μ€ λ΄λΆμ μμΈλ λ°μ΄ν°λ 물리μ μΈ κ³΅κ°μ μ¬λ¬ κ°μ νν°μ
μΌλ‘ λλμ΄ κ΅¬μ±λλλ° μ΄ νν°μ
μ
Elasticsearch
μμλ μ€λ (Shard) λΌκ³ λΆλ¦
Elasticsearch
λ λ€μμ μ€λλ‘ λ¬Έμλ₯Ό λΆμ° μ μ₯νκ³ μμ΄ λ°μ΄ν° μμ€ μνμ μ΅μνν μ μμ
νμ
(Type)
- νμ
(Type) μ μΈλ±μ€μ λ
Όλ¦¬μ ꡬ쑰λ₯Ό μλ―Ένλ©° μΈλ±μ€ μμ±μ λ°λΌ λΆλ₯νκΈ°λ ν¨
Elasticsearch
6.0 λ²μ μ΄νμμλ νλμ μΈλ±μ€μ μ¬λ¬ νμ
μ€μ μ΄ κ°λ₯νμ§λ§ 6.1 λ²μ λΆν°λ μΈλ±μ€λΉ νλμ νμ
λ§ μ¬μ©ν μ μμ
Elasticsearch
6.0 μ΄ν λ²μ μμλ νΉμ μΉ΄ν
κ³ λ¦¬λ₯Ό λΆλ₯νλ λͺ©μ μΌλ‘ νμ
μ΄ λ§μ΄ μ¬μ©λμμ
- μλ₯Ό λ€μ΄ music μ΄λΌλ μΈλ±μ€κ° μ‘΄μ¬νλ€λ©΄ μ₯λ₯΄λ³ (Rock β K-pop β Classic) λ‘ λΆλ¦¬ν΄ μ¬μ©νμΌλ νμ¬λ νμ
μ μ¬μ©νλ κ²μ κΆμ₯νμ§ μκΈ° λλ¬Έμ μ₯λ₯΄ λ³λ‘ λ³λμ μΈλ±μ€λ₯Ό κ°κ° μμ±ν΄μ μ¬μ©ν΄μΌ ν¨
λ¬Έμ (Document)
- λ¬Έμ (Document) λ
Elasticsearch
μμ λ°μ΄ν°κ° μ μ₯λλ μ΅μ λ¨μ
- κΈ°λ³Έμ μΌλ‘ JSON ν¬λ§·μΌλ‘ λ°μ΄ν°κ° μ μ₯
- λ°μ΄ν°λ² μ΄μ€μ λΉκ΅νμλ©΄ ν
μ΄λΈμ νμ΄
Elasticsearch
μ λ¬Έμμ ν΄λΉνλ€κ³ λ³Ό μ μμ
- νλμ λ¬Έμλ λ€μμ νλλ‘ κ΅¬μ±λΌ μλλ° κ° νλλ λ°μ΄ν°μ ννμ λ°λΌ μ©λμ λ§λ λ°μ΄ν° νμ
(Data Type) μ μ μν΄μΌ νλ©° λ¬Έμλ μ€μ²© ꡬ쑰λ₯Ό μ§μνκΈ° λλ¬Έμ μ΄λ₯Ό μ΄μ©ν΄ λ¬Έμ μμ λ¬Έμλ₯Ό μ§μ νλ κ²λ κ°λ₯
νλ (Field)
- νλ (Field) λ λ¬Έμλ₯Ό ꡬμ±νκΈ° μν μμ±μ΄λΌκ³ ν μ μμ
- μΌλ°μ μΌλ‘ λ°μ΄ν°λ² μ΄μ€μ μΉΌλΌ (Column) κ³Ό λΉκ΅ν μ μμΌλ 컬λΌμ΄ μ μ (static) μΈ λ°μ΄ν° νμ
μΈ λ° λ°ν΄ νλλ μ’ λ λμ (dynamic) μΈ λ°μ΄ν° νμ
μ΄λΌκ³ ν μ μμ
- νλμ νλλ λͺ©μ μ λ°λΌ λ€μμ λ°μ΄ν° νμ
μ κ°μ§ μ μμ
- μν μ 보λ₯Ό λ΄μλ λ¬Έμμ μ λͺ© νλκ° μλ€κ³ κ°μ νμ λ μν μ λͺ©μ κ²μν λ λ§€μΉ κ²μμ νκ±°λ μ΄μ±μ μ΄μ©ν κ²μμ΄ λͺ¨λ μ§μλλλ‘ μ λͺ© νλλ 2κ°μ λ°μ΄ν° νμ
μ κ°μ ΈμΌ ν¨
맀ν (Mapping)
- 맀ν (Mapping) μ λ¬Έμμ νλμ νλμ μμ±μ μ μνκ³ κ·Έμ λ°λ₯Έ μμΈ λ°©λ²μ μ μνλ νλ‘μΈμ€
- μΈλ±μ€μ 맀ν μ 보μλ μ¬λ¬ κ°μ§ λ°μ΄ν° νμ
μ μ§μ ν μ μμ§λ§ νλλͺ
μ μ€λ³΅ν΄μ μ¬μ©ν μ μμ
κΈ°λ³Έ ꡬμ±
- ν΄λ¬μ€ν°λ 물리μ μΈ λ
Έλ μΈμ€ν΄μ€λ€μ λͺ¨μ
- ν΄λ¬μ€ν°λ λͺ¨λ λ
Έλμ κ²μκ³Ό μμΈ μμ
μ κ΄μ₯νλ λ
Όλ¦¬μ μΈ κ°λ
μ΄λΌ ν μ μμ
- κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μ κ²½μ° λͺ¨λ μμ²μ μλ² νλμμ μ²λ¦¬ν΄μ κ²°κ³Όλ₯Ό μ 곡νμ§λ§
Elasticsearch
μ κ²½μ°μλ λ€μμ μλ²λ‘ λΆμ°ν΄μ μ²λ¦¬νλ κ²μ΄ κ°λ₯νκΈ° λλ¬Έμ λμ©λ λ°μ΄ν°λ₯Ό μ²λ¦¬ν μ μμ
- λΆμ° μ²λ¦¬λ₯Ό μν΄μλ λ€μν ννμ λ
Έλλ€μ μ‘°ν©ν΄μ ν΄λ¬μ€ν°λ₯Ό ꡬμ±ν΄μΌ ν¨
- κΈ°λ³Έμ μΌλ‘ λ§μ€ν° λ
Έλκ° μ 체μ μΈ ν΄λ¬μ€ν°λ₯Ό κ΄λ¦¬νκ³ λ°μ΄ν° λ
Έλκ° μ€μ λ°μ΄ν°λ₯Ό κ΄λ¦¬
Elasticsearch
λ κ° μ€μ μ λ°λΌ 4κ°μ§ μ νμ λ
Έλλ₯Ό μ 곡νλλ° μ€μ μ λ°λΌ κ° λ
Έλλ νκ°μ§ μ νμΌλ‘ λμν μλ μκ³ μ¬λ¬ κ°μ μ νμ κ²Έν΄μ λμν μλ μμ
λ§μ€ν° λ
Έλ (Master Node)
- λ§μ€ν° λ
Έλλ μΈλ±μ€λ₯Ό μμ± β μμ νλ λ± ν΄λ¬μ€ν°μ κ΄λ ¨λ μ λ°μ μΈ μμ
μ λ΄λΉ
- λ°λΌμ λ€νΈμν¬ μλκ° λΉ λ₯΄κ³ μ§μ°μ΄ μλ λ
Έλλ₯Ό λ§μ€ν° λ
Έλλ‘ μ μ ν΄μΌ ν¨
- λ€μμ λ
Έλλ₯Ό λ§μ€ν° λ
Έλλ‘ μ€μ ν μ μμ§λ§ κ²°κ³Όμ μΌλ‘ νλμ λ
Έλλ§μ΄ λ§μ€ν° λ
Έλλ‘ μ μΆλμ΄ λμν¨
- λ§μ½ λ
Έλλ₯Ό λ§μ€ν° λ
Έλ μ μ©μΌλ‘ μ€μ νκ³ μ νλ€λ©΄
Elasticsearch
μλ²μ conf ν΄λ μμ elasticsearch.yml νμΌμ μ΄κ³ λ€μκ³Ό κ°μ΄ μ€μ νλ©΄ λ¨
node.master: true
node.data: false
node.ingest: false
search.remote.connect: false
λ°μ΄ν° λ
Έλ (Data Node)
- λ°μ΄ν° λ
Έλλ λ¬Έμκ° μ€μ λ‘ μ μ₯λλ λ
Έλ
- λ°μ΄ν°κ° μ€μ λ‘ λΆμ° μ μ₯λλ 물리μ 곡κ°μΈ μ€λκ° λ°°μΉλλ λ
Έλμ΄κΈ°λ ν¨
- μμΈ μμ
μ CPU β λ©λͺ¨λ¦¬ β μ€ν λ¦¬μ§ κ°μ μ»΄ν¨ν
리μμ€λ₯Ό λ§μ΄ μλͺ¨νκΈ° λλ¬Έμ 리μμ€ λͺ¨λν°λ§μ΄ νμ
- λ°μ΄ν° λ
Έλλ κ°λ₯ν ν λ§μ€ν° λ
Έλμ λΆλ¦¬ν΄μ ꡬμ±νλκ² μ’μ
- λ¨, μμΈν λ¬Έμμ μκ° μ μΌλ©΄ ν¨κ» ꡬμ±ν΄λ μκ΄μ μμ
- elasticsearch.yml νμΌμ λ€μκ³Ό κ°μ΄ μμ νλ©΄ λ°μ΄ν° λ
Έλ μ μ©μΌλ‘ μ€μ ν μ μμ
node.mster: false
node.data: true
node.ingest: false
search.remote.connect: false
μ½λλ€μ΄ν
λ
Έλ (Coordinating Node)
- λ°μ΄ν° λ
Έλ β λ§μ€ν° λ
Έλ β μΈμ μ€νΈ λ
Έλμ μν μ νμ§ μκ³ λ€μ΄μ¨ μμ²μ λ¨μν λΌμ΄λλ‘λΉ λ°©μμΌλ‘ λΆμ°μμΌμ£Όλ λ
Έλ
- κ΅¬μ± λ°©λ²μ μλμ κ°μ
node.master: false
node.data: false
node.ingest: false
search.remote.connect: false
μΈμ μ€νΈ λ
Έλ (Ingest Node)
- μμΈμ μμ λ°μ΄ν°λ₯Ό μ μ²λ¦¬νκΈ° μν λ
Έλ
- λ°μ΄ν°μ ν¬λ§·μ λ³κ²½νκΈ° μν΄ μ€ν¬λ¦½νΈλ‘ μ μ²λ¦¬ νμ΄νλΌμΈμ ꡬμ±νκ³ μ€νν μ μμ
- κ΅¬μ± λ°©λ²μ λ€μκ³Ό κ°μ
node.master: false
node.data: false
node.ingest: true
search.remote.connect: false
ν΄λ¬μ€ν° β λ
Έλ β μ€λ
Elasticsearch
ν΄λ¬μ€ν°λ μΈλ±μ€μ λ¬Έμλ₯Ό μ‘°νν λ λ§μ€ν° λ
Έλλ₯Ό ν΅ν΄ 2κ°μ λ
Έλλ₯Ό λͺ¨λ μ‘°νν΄μ κ° λ°μ΄ν°λ₯Ό μ·¨ν©ν ν κ²°κ³Όλ₯Ό νλλ‘ ν©μ³μ μ 곡
- μ¬λ¬ κ°μ ν΄λ¬μ€ν°λ₯Ό μ°κ²°ν΄μ ꡬμ±ν μλ μμΌλ©° μ΄λλ ν΄λ¬μ€ν°μ μ΄λ¦μΌλ‘ κ°κ°μ ꡬλΆ
- λ§μ½ ν΄λ¬μ€ν°μ μ΄λ¦μ΄ λͺ
μμ μΌλ‘ μ€μ λμ§ μμλ€λ©΄
Elasticsearch
λ ν΄λ¬μ€ν°μ μ΄λ¦μ μμμ λ¬Έμμ΄λ‘ μ§μ
- λν ν΄λ¬μ€ν°μ μλ λ
Έλλ μ€μκ°μΌλ‘ μΆκ° β μ κ±°κ° κ°λ₯νκΈ° λλ¬Έμ κ°μ©μ±μ΄λ νμ₯μ± μΈ‘λ©΄μμ λ§€μ° μ μ°
Elasticsearch
λ μ₯μ μ λ ν리카 μ€λλ₯Ό μ΄μ©ν΄ μ€λλ₯Ό 볡ꡬ
- μ₯μ κ° λ°μνλ©΄ λ§μ€ν° λ
Έλλ λ°μ΄ν°λ₯Ό μ¬λΆλ°°νκ±°λ λ ν리카 μ€λλ₯Ό νλΌμ΄λ¨Έλ¦¬ μ€λλ‘ μΉκ²©μμΌ μλΉμ€ μ€λ¨ μλ λ³΅κ΅¬κ° κ°λ₯
- λ°λΌμ μ₯μ 극볡 (Failover) μν©μ μΌλμ λκ³ λ
Έλμ μ€λμ μλ₯Ό μ μ ν ꡬμ±ν΄μΌ ν¨
Elasticsearch μμ μ 곡νλ μ£Όμ API
Elasticsearch
λ RESTful λ°©μμ APIλ₯Ό μ 곡νλ©° μ΄λ₯Ό ν΅ν΄ JSON κΈ°λ°μΌλ‘ ν΅μ
Elasticsearch
λ κΈ°λ³Έμ μΌλ‘ HTTP ν΅μ μ μν΄ 9200λ² ν¬νΈλ₯Ό μ¬μ©
- μΈλ±μ€ κ΄λ¦¬ API (Indices API): μΈλ±μ€ κ΄λ¦¬
- λ¬Έμ κ΄λ¦¬ API (Document API): λ¬Έμμ μΆκ° β μμ β μμ
- κ²μ API (Search API): λ¬Έμ μ‘°ν
- μ§κ³ API (Aggregation API): λ¬Έμ ν΅κ³
- λ¬Έμλ₯Ό μμΈνκΈ° μν΄μλ κΈ°λ³Έμ μΌλ‘ μΈλ±μ€λ₯Ό μμ±ν΄μΌ ν¨
- μΈλ±μ€λ₯Ό ν΅ν΄ μ
λ ₯λλ λ¬Έμμ νλλ₯Ό μ μνκ³ κ° νλμ μλ§μ λ°μ΄ν° νμ
μ μ§μ ν μ μμ
- μ΄λ¬ν κ³Όμ μ ν΅ν΄ μ’λ ν¨μ¨μ μΈ μμΈμ΄ κ°λ₯ν΄μ§
Index vs Indices
- μμΈμ λ°μ΄ν°κ° ν ν°νλμ΄ μ μ₯λλ μλ£ κ΅¬μ‘°λ₯Ό μλ―Ένλ©° Index λΌλ λ¨μ΄λ₯Ό λ²μν κ²
- νμ§λ§
Elasticsearch
μμλ μΈλ±μ€λΌλ μ©μ΄λ₯Ό μμΈκ³Όλ λ€λ₯Έ μλ―Έλ‘ μ¬μ©
Elasticsearch
μμλ μ©μ΄μ λ°λ₯Έ νΌλμ λ°©μ§νκΈ° μν΄ μμΈμ μλ―Έν κ²½μ° Index λΌλ λ¨μ΄λ₯Ό μ¬μ©νκ³ λ§€ν μ μ 곡κ°μ μλ―Έν κ²½μ° Indices λΌλ λ¨μ΄λ‘ νν
- Index: μμΈ λ°μ΄ν°
- Indexing: μμΈνλ κ³Όμ
- Indices: 맀ν μ 보λ₯Ό μ μ₯νλ λ
Όλ¦¬μ μΈ λ°μ΄ν° 곡κ°
Elasticsearch
λ μ¬μ© νΈμμ±μ μν΄ μ€ν€λ§λ¦¬μ€ (Schemaless) λΌλ κΈ°λ₯μ μ 곡
- λ¬Έμλ₯Ό μμΈνκΈ° μν΄μλ κΈ°λ³Έμ μΌλ‘ μΈλ±μ€λ₯Ό μμ±νλ κ³Όμ μ΄ νμνλ° μΈλ±μ€λ₯Ό μμ±νλ κ³Όμ μμ΄ λ¬Έμλ₯Ό μΆκ°νλλΌλ λ¬Έμκ° μμΈλλλ‘ μ§μνλ μΌμ’
μ νΈμ κΈ°λ₯
Elasticsearch
λ μ΅μ΄ λ¬Έμκ° μμΈλ λ μΈλ±μ€μ μ‘΄μ¬ μ¬λΆλ₯Ό νμΈνκ³ λ§μ½ μΈλ±μ€κ° μ‘΄μ¬νμ§ μλλ€λ©΄ λ¬Έμλ₯Ό λΆμν΄μ λ¬Έμκ° μμΈλ μ μκ² μΈλ±μ€λ₯Ό μλμΌλ‘ μμ±
μ€ν€λ§λ¦¬μ€ κΈ°λ₯μ κ°κΈμ μ΄λ©΄ μ¬μ©νμ§ μλλ€
- μ€ν€λ§λ¦¬μ€ κΈ°λ₯μ μ΄μ©νλ©΄ λ€μν ννμ λΉμ ν λ°μ΄ν°λ₯Ό νλμ μΈλ±μ€λ‘ ꡬμ±ν μ μμ§λ§ μ΄λ μ±λ₯κ³Ό λ°μ ν μ°κ΄μ΄ μκΈ° λλ¬Έμ νΉμν μν©μμλ§ μ¬μ©ν΄μΌ ν¨
- λ§μ½ μ€ν€λ§λ¦¬μ€λ₯Ό μ¬μ©ν΄μΌ νλ€λ©΄ λ°μ΄ν° ꡬ쑰 λ° κ²μ λ°©μμ νμ€ν μ΄ν΄ν΄μΌ ν¨
- μΈλ±μ€κ° μλμΌλ‘ μμ±λλ©΄ μΈλΆμ μΈ νλ μ λ³΄κ° λ§€νλμ§ μμ
- μ΄λ° μμΌλ‘ μΈλ±μ€λ₯Ό μλ μμ±ν κ²½μ° νΉμ λ¨μ΄λ₯Ό κ²μν λ κ²μ κ²°κ³Όμμ λλ½λλ λ± λ¬Έμ κ° λ°μν κ°λ₯μ±μ΄ λμμ§
- κΈ°λ³Έμ μΌλ‘ λͺ¨λ νλκ° text νμ
κ³Ό keyword νμ
μ λμμ μ 곡νλ λ©ν°νλ κΈ°λ₯μΌλ‘ ꡬμ±λ¨
- νμ§λ§ νΉμ νλλ text νμ
λ§ νμν μλ μκ³ keyword νμ
λ§ νμν μλ μλλ° μ΄λ¬ν κ²½μ° λ°μ΄ν° 곡κ°μ λλΉλ₯Ό μ΄λν¨
Elasticsearch
λ μ€ν€λ§λ¦¬μ€λΌλ νΉμ±μ λ°λΌ λ°μ΄ν°μ λν 맀νμ μλμΌλ‘ μμ±νλ νΈλ¦¬ν κΈ°λ₯μ μ 곡νμ§λ§ μ΄ κΈ°λ₯μ νΉμν μν©μμλ§ μ νμ μΌλ‘ μ¬μ©ν΄μΌ ν¨
- μ¬μ€μ μ€λ¬΄μμλ λλΆλΆ μ¬μ©νμ§ μμ
- μ€λ¬΄μμλ λ°μ΄ν°κ° λλΆλΆ 볡μ‘ν ꡬ쑰λ₯Ό κ°κΈ° λλ¬Έμ μμΉ« κ²μ νμ§μ΄ λ¨μ΄μ§κ±°λ μ±λ₯μ λ¬Έμ κ° λ°μν κ°λ₯μ±μ΄ 컀μ§κΈ° λλ¬Έ
- μλ₯Ό λ€μ΄ "μλ²μ§κ° λ°©μ λ€μ΄ κ°μ λ€" μ κ°μ λ¬Έμ₯μ μμΈνλ€κ³ κ°μ νμ λ
- μ€ν€λ§λ¦¬μ€λ₯Ό μ΄μ©ν΄ μμΈνλ€λ©΄ κΈ°λ³Έμ μΌλ‘ text νμ
μ Standard Analyzer λ₯Ό μ¬μ©νλ λ°μ΄ν° νμ
μ΄ μ μλ κ²
- μ΄λ¬ν κ²½μ° ν΄λΉ λΆμκΈ°λ "μλ²μ§κ°" β "λ°©μ" β "λ€μ΄" β "κ°μ λ€"λΌλ ν ν°μΌλ‘ λΆλ¦¬λμ΄ ν
(Term) μ΄ μμ±λκ³ κ²μ μ "μλ²μ§"λΌλ ν€μλκ° μ
λ ₯λλλΌλ ν΄λΉ λ¬Έμλ κ²μλμ§ μμ κ²
- κ²μμ μν΄μλ Standard Analyzer κ° λΆλ¦¬ν ν ν° κ·Έλλ‘ "μλ²μ§κ°"λΌλ ν€μλλ₯Ό μ
λ ₯ν΄μΌλ§ ν¨
- μνλ κ²°κ³Όλ₯Ό μ»κΈ° μν΄μλ νκΈ ννμλ₯Ό λΆμνλ λΆμκΈ°λ₯Ό μ¬μ©νλλ‘ λ°μ΄ν° νμ
μ μ§μ μ μν΄μΌ ν¨
- μνλ κ²°κ³Όλ₯Ό μ»κΈ° μν΄μλΌλ μ€ν€λ§λ¦¬μ€ λ°©μμ μ¬μ©μ μ§μνκ³ λ°λμ μΈλ±μ€λ₯Ό μ§μ μ μν΄μ μ¬μ©νλ μ΅κ΄μ λ€μ΄λ κ²μ΄ μ’μ
- μ€ν€λ§λ¦¬μ€ κΈ°λ₯μ μ¬μ©νκ³ μΆμ§ μλλΌλ μΈλ±μ€λ₯Ό μ€μ νμ§ μκ³ μ€μλ‘ λ°μ΄ν°λ₯Ό μμΈνλ©΄
Elasticsearch
λ μΈλ±μ€λ₯Ό μλμΌλ‘ μμ±
- μ΄λ μμΉ« μμ€ν
μ μμ μ±μ ν΄μΉ μλ μμ
- μ΄λ¬ν μ€μλ₯Ό λ°©μ§νκΈ° μν΄ μ€ν€λ§λ¦¬μ€ κΈ°λ₯μ λͺ
μμ μΌλ‘ μ¬μ©νμ§ μλλ‘ μ€μ νλ κ²μ΄ κ°λ₯
- λ
Έλ μ€μ νμΌμμ action.auto_create_index λ₯Ό false λ‘ μ€μ ν κ²½μ° μλμΌλ‘ μΈλ±μ€κ° μμ±λμ§ μμ
- λλ μΈλ±μ€ λ³λ‘ μ 곡λλ index.maapper.dynamic μ€μ μ false λ‘ μ€μ νλ©΄ νΉμ μΉΌλΌμ μλ 맀ν μμ±μ λΉνμ±νν μ μμ
μΈλ±μ€ κ΄λ¦¬ API
- μΈλ±μ€ κ΄λ¦¬ API λ μΈλ±μ€λ₯Ό κ΄λ¦¬νκΈ° μν API
- μ΄λ₯Ό μ΄μ©ν΄ μΈλ±μ€λ₯Ό μΆκ°νκ±°λ μμ ν μ μλλ° μΈλ±μ€ κ΄λ¦¬ API λ HTTP λ©μλλ₯Ό μ§μ νλ λ°©μμ ν΅ν΄ μ¬μ©ν μ μμ
- μΈλ±μ€λ₯Ό μμ±ν λλ 맀νμ΄λΌλ μΈλΆ μ€μ μ μ΄μ©ν μ μλλ° λ§€νμ λ¬Έμμ λ¬Έμμ ν¬ν¨λ νλ β νλ νμ
λ±μ μΈμΈνκ² μ§μ νλ κ²μ΄ κ°λ₯ν μ€μ λ°©μ
- μΈλ±μ€ μμ± μ μ΄λ¬ν 맀ν μ 보λ₯Ό μΆκ°ν μ μλλ° νκ°μ§ μ£Όμν μ μ νλ² μμ±λ 맀ν μ 보λ λ³κ²½ν μ μλ€λ μ
- λ§μ½ μλͺ» μμ±νκ±°λ λ³κ²½ν΄μΌ νλ κ²½μ°μλ λ°μ΄ν°λ₯Ό μμ νκ³ λ€μ μμΈνλ μ λ°μ μμ
Elasticsearch
μμλ λ€μν ννμ λ°μ΄ν° νμ
μ μ 곡
- λ¨μν λ¬Έμμ΄λ‘ μ μ₯νκ³ μΆμ κ²½μ° keyword νμ
μ μ¬μ©νλ©΄ λκ³ ννμ λΆμμ μν κ²½μ° text νμ
μ μ¬μ©
- μλ₯Ό λ€μ΄ 맀ν μ€μ μΌλ‘ μ μλ νλ μ€ νκΈ μν μ΄λ¦ (movieNm) κ³Ό μλ¬Έ μν μ΄λ¦ (moviceNmEn) μ κ²μμ μ¬μ©λκΈ° λλ¬Έμ ννμ λΆμμ΄ κ°λ₯νλλ‘ text λ‘ νμ
μ μ§μ
- μν μ½λ (movieCd) μ μ μμ°λ (prdtYear) λ μ«μ λ°μ΄ν° νμ
μΌλ‘ μ§μ νκ³ κ°λ΄μΌ (openDt) μ λ μ§ νμ
μΌλ‘ μ§μ
- κ·Έ λ°μ νλ νμ
μ λͺ¨λ keyword νμ
- μΈλ±μ€λ₯Ό νλ² μμ νλ©΄ λ€μλ 볡ꡬν μ μκΈ° λλ¬Έμ μΈλ±μ€ μμ λ μ μ€νκ²ν΄μΌ ν¨
λ¬Έμ κ΄λ¦¬ API
- λ¬Έμ κ΄λ¦¬ API λ μ€μ λ¬Έμλ₯Ό μμΈ β μ‘°ν β μμ β μμ λ₯Ό μ§μνλ API
Elasticsearch
λ κΈ°λ³Έμ μΌλ‘ κ²μ μμ§μ΄κΈ° λλ¬Έμ κ²μμ μν΄ λ€μν κ²μ ν¨ν΄μ μ§μνλ Search API λ₯Ό λ³λλ‘ μ 곡
- νμ§λ§ μμΈλ λ¬Έμμ IDλ₯Ό κΈ°μ€μΌλ‘ ν 건μ λ¬Έμλ₯Ό λ€λ€μΌ νλ κ²½μ° λ¬Έμ κ΄λ¦¬ API λ₯Ό μ¬μ©
- λ¬Έμ κ΄λ¦¬ APIλ λ€μκ³Ό κ°μ μΈλΆ κΈ°λ₯μ μ 곡
- Index API: ν 건μ λ¬Έμλ₯Ό μμΈ
- Get API: ν 건μ λ¬Έμλ₯Ό μ‘°ν
- Delete API: ν 건μ λ¬Έμλ₯Ό μμ
- Update API: ν 건μ λ¬Έμλ₯Ό μ
λ°μ΄νΈ
- λ¬Έμ κ΄λ¦¬ API λ κΈ°λ³Έμ μΌλ‘ ν 건μ λ¬Έμλ₯Ό μ²λ¦¬νκΈ° μν κΈ°λ₯μ μ 곡νλ©° Single document API λΌκ³ λ λΆλ¦
- νμ§λ§ ν΄λ¬μ€ν°λ₯Ό μ΄μνλ€ λ³΄λ©΄ λ€μμ λ¬Έμλ₯Ό μ²λ¦¬ν΄μΌ νλ κ²½μ°λ μ’
μ’
λ°μνλλ° μ΄λ¬ν κ²½μ°μ λλΉν΄ Multi-document API λ μ 곡
- Multi Get API: λ€μμ λ¬Έμλ₯Ό μ‘°ν
- Bulk API: λλμ λ¬Έμλ₯Ό μμΈ
- Delete By Query API: λ€μμ λ¬Έμλ₯Ό μμ
- Update By Query API: λ€μμ λ¬Έμλ₯Ό μ
λ°μ΄νΈ
- Reindex API: μΈλ±μ€μ λ¬Έμλ₯Ό λ€μ μμΈ
IDλ₯Ό μ§μ νμ§ μκ³ λ¬Έμλ₯Ό μμ±
- _id κ°μ μ§μ μ§μ νμ§ μκ³ URIμ μΈλ±μ€λͺ
κ³Ό νμ
λ§ μ§μ νλ€λ©΄
Elasticsearch
κ° μλμΌλ‘ _id κ°μ μμ±νκ² λ¨
- μ΄λ _id κ°μ UUID λ₯Ό ν΅ν΄ 무μμλ‘ μμ±λ¨
- μ΄λ¬ν λ°©μμ΄ μμΉ« νΈλ¦¬ν΄ λ³΄μΌ μλ μμ§λ§ 무μμλ‘ μμ±λ Id κ° λλ¬Έμ ν΄λΉ λ¬Έμλ₯Ό μ
λ°μ΄νΈ ν λ λ¬Έμ μ¬νμ΄ μκΈΈ μ μμ
- μλ₯Ό λ€μ΄
Elasticsearch
μ λκΈ°νλ λ°μ΄ν°λ² μ΄μ€μ λ°μ΄ν°κ° λ³κ²½λλ€κ³ κ°μ νμ λ
- κ²μ μμ§μ ν΄λΉ λ°μ΄ν°λ² μ΄μ€μ μ£ΌκΈ°μ μΌλ‘ λκΈ°νν΄μΌ νκΈ° λλ¬Έμ λ³κ²½λ λ΄μ©μ λ°λΌ λκΈ°νλΌμΌ ν κ²
- μ΄λ₯Ό μν΄μλ
Elasticsearch
μ μμΈλ _id κ°μ λ°μ΄ν°λ² μ΄μ€μ PK (Primary Key) νΉμ μλ³μ΄ λλ ν€ κ°κ³Ό 맀μΉν μ λ³΄κ° μ΄λκ°μλ μ μ₯λμ΄ κ΄λ¦¬λΌμΌ ν¨
- νμ§λ§ 1μ²λ§ 건μ΄λ 1μ΅κ±΄ μ λ λλ λ°μ΄ν°μ ν΄λΉ μλ³ κ°μ μ΄λκ°μ λ³λλ‘ μ μ₯νλ€λ κ²μ κ±°μ λΆκ°λ₯
- κ·Έλμ μμΈλ λ¬Έμμ _id κ°μ μ
λ°μ΄νΈλ₯Ό κ³ λ €ν΄μ λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈμ μλ³ κ°κ³Ό λ§μΆ° μ£Όλ κ²μ΄ μ€μ
κ²μ API
Elasticsearch
κ²μ API μ μ¬μ© λ°©μμ λ€μκ³Ό κ°μ΄ ν¬κ² λ κ°μ§λ‘ λλ¨
- HTTP URI (Uniform Resource Identifier) ννμ νλΌλ―Έν°λ₯Ό URI μ μΆκ°ν΄ κ²μνλ λ°©λ²
- RESTful API λ°©μμΈ QueryDSL μ μ¬μ©ν΄ μμ² λ³Έλ¬Έ (Request Body) μ μ§μ λ΄μ©μ μΆκ°ν΄ κ²μνλ λ°©λ²
- Request Body λ°©μμ URI λ°©μλ³΄λ€ μ μ½μ¬νμ΄ μ κΈ° λλ¬Έμ νμ
μμλ Request Body λ°©μμ μ νΈ
- URI λ°©μμ κ°λ¨ν 쿼리 κ²μμ νκ±°λ λλ²κΉ
ν λ κ°νΈνκ² μ¬μ©νλ κ²½μ°μ μ’
μ’
μ΄μ©
- κ°λ¨ν ννμμ΄λΌλ©΄ λκ°μ§ νμμ μμ΄μ μ¬μ©νλ κ²λ κ°λ₯
- μλ₯Ό λ€μ΄ Query λ₯Ό URI λ°©μμΌλ‘ μ¬μ©νκ³ λλ¨Έμ§ κΈ°λ₯μ JSON ννλ‘ μ¬μ©ν΄λ λ¨
GET /movice/_doc/_search?q=prdtYear:2017&pretty=true
{
"sort": {
"movieCd": {
"order" : "asc"
}
}
}
- QueryDSL μ μ¬μ©νλ©΄ κ°λ
μ±μ΄ λκ³ JSON νμμΌλ‘ λ€μν ννμ΄ κ°λ₯
- Query μ 쑰건μ μ¬λ¬ κ° λ§λ€κ±°λ ν΅κ³λ₯Ό μν μ§κ³ (Aggregation) 쿼리 λ± λ³΅μ‘ν 쿼리λ₯Ό μμ±νλ €λ©΄ QueryDSL μ μ¬μ©νλ κ²μ΄ μ’μ
- URIλ‘ μ¬λ¬ λ¨κ³μ ꡬ쑰λ₯Ό κ°μ§λ μ€μ²©λ νν νννλ κ²μ λΆκ°λ₯νκΈ° λλ¬Έ
URI λ°©μμ κ²μ μ§μ
- λ¨Όμ μ΄ν΄λ³Ό URI λ°©μμ κ²μ μ§μλ λ¬Έμ IDμΈ _id κ°μ μ¬μ©ν΄ λ¬Έμλ₯Ό μ‘°ννλ λ°©μ
- κ²°κ΅ URLμ νλΌλ―Έν°λ₯Ό λΆμ¬ μ‘°ννλ μ
- λ€μμ q νλΌλ―Έν°λ₯Ό μ¬μ©ν΄ ν΄λΉ μ©μ΄μ μΌμΉνλ λ¬Έμλ§ μ‘°νν¨
POST /movie/_search?q=μ₯νΈ
- μλ΅ κ²°κ³Όλ₯Ό νμΈνλ©΄ JSON ν¬λ§· ν€λμλ μΏΌλ¦¬κ° μ€νλ μ΄ μκ° (took) κ³Ό κ²°κ³Όλ₯Ό 보μ¬μ€
- _shards μμλ μ±κ³΅μ μΌλ‘ λ°νν μ€λμ μμ μ€ν¨ν μ€λμ μλ₯Ό μ μ μμ
- hits μμλ μΌμΉνλ λ¬Έμμ μμ ν¨κ» μ μ (_score) κ° κ°μ₯ λμ μμ 10κ°μ λ¬Έμλ₯Ό 보μ¬μ€
- κ²μμ μ€ν¨ν μ€λμ μλ κ²μμ μ€μ λ time_out μ λ°λΌ κ²°μ λ¨
- time_out μκ°μ΄ μ΄κ³Όλλ©΄ κ·ΈλκΉμ§ κ²μλ λ΄μ©κΉμ§λ§ κ²μ κ²°κ³Όλ‘ λ°νλκΈ° λλ¬Έμ μ€ν¨ν μ€λμ μκ° μ§λμΉκ² λ§λ€λ©΄ time_out μκ°μ μ μ ν μ‘°μ ν΄μΌ ν¨
- q νλΌλ―Έν°λ₯Ό μ¬μ©ν λ λ³λμ νλλͺ
μ μ§μ νμ§ μμΌλ©΄ μ‘΄μ¬νλ λͺ¨λ νλλ₯Ό λμμΌλ‘ κ²μμ μνν¨
- νΉμ νλλ§ μ‘°ννκ³ μΆλ€λ©΄ λ€μ μ½λμ κ°μ΄ νλλͺ
μ ν¬ν¨ν΄μ μμ²νλ©΄ λ¨
- λ€μμ typeNm νλμ κ°μ΄ "μ₯νΈ"μΈ λ¬Έμμ΄λ§ κ²μν μ
POST /movie/_search?q=typeNm:μ₯νΈ
Request Body λ°©μμ κ²μ μ§μ
- URI κ²μ μ§μλ μ¬λ¬ νλλ₯Ό κ°κΈ° λ€λ₯Έ κ²μμ΄λ‘ μ§μνλ κ²μ΄ μ΄λ €μ
- 쿼리μ μ‘°κ±΄μ΄ λ³΅μ‘νκ³ κΈΈμ΄μ§κΈ° λλ¬ΈμΈλ° μ΄λ΄ λλ JSON λ°©μμΌλ‘ μ§μνλκ² μ’μ
- JSON ν¬λ§·μ μ΄μ©ν΄ RESTful λ°©μμΌλ‘ μ§μνλ©΄ λ§€μ° λ³΅μ‘ν 쿼리λ μ½κ² ννν μ μκ³ μ¬λ¬ 쑰건μ νλ²μ μ²λ¦¬ν μ μμ
POST /{indexλͺ
}/_search
{
JSON 쿼리 ꡬ문
}
- movie μΈλ±μ€μ typeNm νλλ₯Ό κ²μνλ μλ λ€μκ³Ό κ°μ
POST movie/_search
{
"query": {
"term": {"typeNm": "μ₯νΈ"}
}
}
- 쿼리 ꡬ문μ λ€μκ³Ό κ°μ΄ μ¬λ¬ κ°μ ν€λ₯Ό μ‘°ν©ν΄ κ°μ²΄μ ν€ κ°μΌλ‘ μ¬μ©ν μ μμ
{
size:
# λͺκ°μ κ²°κ³Όλ₯Ό λ°νν μ§ κ²°μ νλ€(κΈ°λ³Έκ°μ 10)
from:
# μ΄λ μμΉλΆν° λ°νν μ§λ₯Ό κ²°μ νλ€
# 0λΆν° μμνλ©΄ μμ 0~10건μ λ°μ΄ν°λ₯Ό λ°ννλ€(κΈ°λ³Έκ°μ 0)
_source:
# νΉμ νλλ§ κ²°κ³Όλ‘ λ°ννκ³ μΆμλ μ¬μ©νλ€.
sort:
# νΉμ νλλ₯Ό κΈ°μ€μΌλ‘ μ λ ¬νλ€.
# asc, descμ μ€λ¦μ°¨μ, λ΄λ¦Όμ°¨μ μ λ ¬μ μ§μ ν μλ μλ€.
query: {
# κ²μλ 쑰건μ μ μνλ€.
}
filter: {
# κ²μ κ²°κ³Ό μ€ νΉμ ν κ°μ λ€μ 보μ¬μ€λ€.
# κ²°κ³Ό λ΄μμ μ¬κ²μν λ μ¬μ©νλ κΈ°λ₯ μ€ νλμ΄λ€.
# λ€λ§ νν°λ₯Ό μ¬μ©νκ² λλ©΄ μλμΌλ‘ score κ°μ΄ μ λ ¬λμ§ μλλ€.
}
}
μ§κ³ API
- κ³Όκ±°μλ ν΅κ³ μμ
μ μν΄ Lucene μ΄ μ 곡νλ ν¨μ― (Facets) κΈ°λ₯μ λ§μ΄ νμ©νμ
- ν¨μ― κΈ°λ₯μ κΈ°λ³Έμ μΌλ‘ λμ€ν¬ κΈ°λ°μΌλ‘ λμνκ³ λΆμ° νκ²½μλ μ΅μ νλμ§ μμκΈ° λλ¬Έμ λμ©λ λ°μ΄ν°μ ν΅κ³ μμ
μλ μ ν©νμ§ μμ
- μ΄λ‘ μΈν΄ λ§μ μ₯μ κ° λ°μνκΈ° λλ¬Έ
Elasticsearch
μμλ 5.0 μ΄νμ ν¨μ― λ°©μμ ν΅κ³ κΈ°λ₯μ μ κ±°νκ³ λ
μμ μΈ μ§κ³ (Aggregation) APIλ₯Ό λ΄λμμ
- μ§κ³ APIλ κΈ°λ³Έμ μΌλ‘ λ©λͺ¨λ¦¬ κΈ°λ°μΌλ‘ λμνκΈ° λλ¬Έμ λμ©λμ λ°μ΄ν° ν΅κ³ μμ
μ΄ κ°λ₯ν΄μ‘μ
Elasticsearch
λ μ§κ³ APIλ₯Ό ν΅ν΄ κΈ°μ‘΄μ ν¨μ― APIλ‘λ νκΈ° μ΄λ €μ΄ μμ
μ μ²λ¦¬νλ κ²μ΄ κ°λ₯ν΄μ‘μ
- 쿼리μ μ¬μ©λλ μ§κ³μ λ°λΌ μμΉλ₯Ό κ³μ°νκ³ λμ μΌλ‘ μΉ΄μ΄ν
νκ±°λ νμ€ν κ·Έλ¨ κ°μ μμ
λ±λ ν μ μμ
Elasticsearch
μ μ§κ³ APIλ κ°μ’
ν΅κ³ λ°μ΄ν°λ₯Ό μ€μκ°μΌλ‘ μ 곡ν μ μλ κ°λ ₯ν κΈ°λ₯
λ°μ΄ν° μ§κ³
- μλ₯Ό λ€μ΄ movie μΈλ±μ€μ λ¬Έμλ₯Ό μ₯λ₯΄λ³λ‘ μ§κ³ν λ
- _search API λ₯Ό μ¬μ©ν΄ μ§κ³ 쿼리λ₯Ό λ§λ€κ³ terms ν€μλλ₯Ό μ΄μ©ν΄ genreAlt λΌλ νλμ λ°μ΄ν°λ₯Ό κ·Έλ£Ήν
POST /movie/_search?size=0
{
"aggs": {
"genre": {
"terms": {
"field": "genreAlt"
}
}
}
}
- μ§κ³ κ²°κ³Όλ₯Ό μ΄ν΄λ³΄λ©΄ λ²ν· (Buckets) μ΄λΌλ ꡬ쑰 μμ κ·Έλ£Ήνλ λ°μ΄ν°κ° ν¬ν¨λΌ μμ
Elasticsearch
μ μ§κ³κ° κ°λ ₯ν μ΄μ μ€ νλλ λ²ν· μμ λ€λ₯Έ λ²ν·μ κ²°κ³Όλ₯Ό μΆκ°ν μ μλ€λ μ μΈλ° μ΄λ¬ν νΉμ±μ μ΄μ©ν΄ λ€μν μ§κ³ μ νμ κ²°ν©νκ±°λ μ€μ²© β μ‘°ν©νλ κ²μ΄ κ°λ₯ν΄μ§
- λ€μμ μ₯λ₯΄λ³ κ΅κ° ννλ₯Ό μ€μ²©ν΄μ 보μ¬μ£Όλ μ§κ³μ μ
POST movie/_search?size=0
{
"aggs": {
"genre": {"terms": {"field": "genreAlt"}},
"aggs": {
"nation": {"terms": {"field": "nationAlt"}}
}
}
}
Tip! μΆκ° λ΄μ©
κ²μ μλ λΉ λ₯Έ μ΄μ
- MySQLκ³Ό κ°μ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μμ ν
μ΄λΈμ΄ μΈλ±μ± (μμΈ μμ
) λλ©΄ 볡μ‘ν 쿼리μμ ν¨μ¬ λ λμ μ±λ₯μ 보μ¬μ€
- μΈλ±μ±μ λΉ λ₯Έ κ²μμ μν΄ νλ κ°μ μ΄μ΄λ Documentμ 맀ν νλ κ²μ μλ―Έ
- μ£Όμ΄μ§ κ²μμ΄μ λν΄μ λͺ¨λ μ΄μ μ°Ύμ보λ λμ μ μΈλ±μ€ (μμΈ) λ₯Ό μ΄μ©ν΄μ μ΄λ€ λ¬Έμλ μ΄μ ν΄λΉλλμ§ μ°Ύμ μ μμ
- μ΄κ²μ΄ μΈλ±μ€κ° 쿼리 μλλ₯Ό μμ²λκ² λΉ λ₯΄κ² λ§λλ μ΄μ
Elasticsearch
λ (κ²μμ΄κ° λ μ μλ) λ¬Έμλ€μ μ μ°νκ² ν ν°ννκ³ μΈλ±μ±νλλ° νΉνλμ΄ μμ
- μλ₯Ό λ€μ΄ "Hello to the world" λΌλ νλμ λ¬Έμμ΄μ λ€μν λ°©λ²μΌλ‘ μΈλ±μ±μ μ§ν ν μ μμ
- λ¬Έμ₯ μ 체
- μμ: ["Hello to the world"]
- λ¨μ΄
- μμ: ["hello", "to", "the", "world"]
- μ μΉμ¬λ κ΄μ¬ λ±μ μ μΈν μλ―Έ μλ λ¨μ΄
- μμ: ["hello", "world"]
- μ¬μ©μκ° μνλ κ·μΉ
- "to" λΌλ μ μΉμ¬λ₯Ό μ€μνκ² μκ°νλ€λ©΄ μΆκ° κ°λ₯
- μμ: ["hello", "to", "world"]
- μ΄λ κ² ν ν°νλ λ¨μ΄λ€μ΄ μΈλ±μ€ ν€κ° λμ΄ ν¨μ¬ λΉ λ₯΄κ³ ν¨μ¨μ μΈ λ¬Έμ κ²μμ μ§ν
- μμ μ¬μ§μ 보면 μ΄λ€ λ°©μμΌλ‘ λ¬Έμμ΄ λλ Document κ° λ¨μ΄ λ³λ‘ μΈλ±μ±λμ΄ μ μ₯λλμ§ μ μ μμ
- κ΄μ¬λ μ μΉμ¬ λ±μ μ μΈν μ μλ―Έν ν€μλλ€μ μΆλ €λ΄κ³ κ° ν€μλκ° μ΄λ€ Document μ μ μ₯λμ΄ μλμ§ μ μ₯
- μΈλ±μ± μ΄ν "best" λΌλ ν€μλλ‘ κ²μμ μ§ννλ©΄ Document 2μμ best λΌλ ν€μλκ° μ¬μ©λμμμ λ°λ‘ μ°Ύμ μ μμ
- λ§μ½ μ΄λ₯Ό μ ν κ²μμΌλ‘ μ§ννλ€λ©΄ Document 1, Document 2, Document 3μ λͺ¨λ λ¨μ΄λ€μ νλμ© λΉκ΅ λμ‘°νμ¬ μ°Ύμλ΄μΌ ν¨
- μ΄λ° ꡬ쑰λΌλ©΄ νλμ ν€μλλ₯Ό μ°Ύμ λ λ§μΉ ν΄μ¬ (hash) ν
μ΄λΈμ μ΄μ©νλ κ²μ²λΌ μκ°λ³΅μ‘λλ O(1)μ μλ ΄
- μ€μκ° κ²μμ΄ κ°λ₯ν μ΄μ
- SQL λ°μ΄ν°λ² μ΄μ€λ€μ λ§μ μΈλ±μ€λ₯Ό λ€λ£° λ μ±λ₯μ΄ μ νλλ λ°λ©΄
Elasticsearch
λ 볡μ‘νκ³ μλΉν μμ μΈλ±μ€λ₯Ό λ€λ£¨λλΌλ μ±λ₯μ μ νκ° κ±°μ μμ
- κ·Έλ¦¬κ³ μ°Ύμ λ°μ΄ν°λ₯Ό ν¨κ³Όμ μΌλ‘ λ€λ£¨λ λ₯λ ₯λ κ°μ§κ³ μμ
λ¨μ
Elasticsearch
λ SQL λ°μ΄ν°λ² μ΄μ€λ³΄λ€ κ°λ³ λ μ½λ κ²μμ μννλ λ₯λ ₯μ΄ λ¨μ΄μ§
- νΉν λ°μ΄ν°λ₯Ό μ
λ°μ΄νΈ ν λλ μ±λ₯μ΄ ν¬κ² λ¨μ΄μ§
- κ·Έλ¬λ―λ‘ λ§μ½ μμ£Ό μ 보λ₯Ό μ
λ°μ΄νΈ ν΄μΌνλ μ ν리μΌμ΄μ
μ΄λΌλ©΄
Elasticsearch
λ μ μ ν κΈ°μ μ΄ μλ
- SQL λ°μ΄ν°λ² μ΄μ€μμ ν
μ΄λΈ κ°μ μ‘°μΈμ μννλ κ²μ²λΌ Document κ°μ μ‘°μΈμ μνν μ μμ
- λμ μ‘°μΈμ μννλ κ²μ²λΌ 2λ²μ λ³κ°λ‘ μνν΄μΌ ν¨
- 2λ²μ 쿼리λ₯Ό μννλ κ²μ΄ SQL μ‘°μΈ λ³΄λ€ λΉ λ₯Ό μ μμ§λ§ μ΄λ° νμλ₯Ό λμ ν΄μ μννλ€λ©΄ ν¬κ² λκ»΄ μ§ μ μμ