ElasticSearch

ν΄λŸ¬μŠ€ν„° λ‘˜λŸ¬λ³΄κΈ°

1. Cluster

REST API

λ…Έλ“œ 및 ν΄λŸ¬μŠ€ν„°μ™€ ν†΅μ‹ ν•˜λŠ” 방법을 μ•Œμ•„λ³Ό 차둀이닀. ES λŠ” ν΄λŸ¬μŠ€ν„°μ™€μ˜ μƒν˜Έ μž‘μš©μ— μ‚¬μš©ν•  수 μžˆλŠ” 맀우 포괄적이고 κ°•λ ₯ν•œ REST API λ₯Ό μ œκ³΅ν•œλ‹€. 이 API μ—μ„œ λ‹€μŒμ„ λΉ„λ‘―ν•œ λ‹€μ–‘ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.

  • Cluster, Node, Index 의 μƒνƒœ 및 톡계 정보 확인
  • Cluster, Node, Index 의 데이터 및 메타데이터 관리
  • Index에 λŒ€ν•œ CRUD 및 검색 μž‘μ—… μˆ˜ν–‰
  • paging, sort, filtering, scripting, aggregation λ“± μ—¬λŸ¬ κ³ κΈ‰ 검색 μž‘μ—… μ‹€ν–‰
# index(DB/Table 생성)
PUT user

# ν˜„μž¬ index 리슀트 ν™•μΈν•˜κΈ°
GET _cat/indices

# index 의 λ ˆν”Œλ¦¬μΉ΄ 개수 0개둜 λ§Œλ“€μ–΄ Yellow > Green μƒνƒœλ‘œ λ§Œλ“€κΈ°
PUT _settings
{
  "index": {
    "number_of_replicas": 0
  }
}

# ν˜„μž¬ index 리슀트 μž¬ν™•μΈν•˜κΈ°
GET _cat/indices

# index 에 document μΆ”κ°€ν•˜κΈ° (ID 포함)
POST user/_doc/1
{
  "name": "kangjaegu"
}

# index 에 document μΆ”κ°€ν•˜κΈ° (ID 미포함)
POST user/_doc/
{
  "name": "kangjaegu2"
}

# λͺ¨λ“  Document μ‘°νšŒν•˜κΈ°
GET user/_search


# νŠΉμ • Document μ‘°νšŒν•˜κΈ°
GET user/_doc/1

# document μˆ˜μ •
POST user/_doc/1
{
  "name": "kangjaegu_modified"
}

# μˆ˜μ •λœ Document μž¬ν™•μΈ
GET user/_doc/1

############################################################

# example Indexκ°€ μ—†λŠ” μƒνƒœμ—μ„œ example 인덱슀 데이터λ₯Ό μΆ”κ°€ν•˜λ©΄ μžλ™μœΌλ‘œ
# example indexκ°€ μƒμ„±λ˜κ³ , λ§€ν•‘λœλ‹€
GET _cat/indices

PUT example/_doc/1
{
  "content": "test"
}

GET example/_doc/1

GET _cat/indices

# λ§€ν•‘μ •μ˜
# 동적 맀핑 λ°©μ‹μœΌλ‘œ κ°€μž₯ 넓은 ν˜•νƒœμ˜ 데이터 νƒ€μž…μœΌλ‘œ 맀핑을 μƒμ„±ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ,
# 미리 μ •μ˜ 해놓고 μ‹Άλ‹€λ©΄ μ•„λž˜μ™€ 같은 방식을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.
# 이미 λ§Œλ“€μ–΄μ§„ 맀핑에 ν•„λ“œ μΆ”κ°€λŠ” κ°€λŠ₯
# 이미 λ§Œλ“€μ–΄μ§„ ν•„λ“œλ₯Ό μ‚­μ œν•˜κ±°λ‚˜ ν•„λ“œμ˜ νƒ€μž… 및 섀정값을 λ³€κ²½ν•˜λŠ” λΆˆκ°€λŠ₯
# (ν•„λ“œμ˜ 변경이 ν•„μš”ν•œ 경우 re-indexing ν•„μš”)
PUT user
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      }
    }
  }
}

# index μƒˆλ‘œ λ§Œλ“€κΈ° (+mapping κ³Ό ν•¨κ»˜)
PUT /test_index
{
  "mappings": {
    "properties": {
      "text_name":{
        "type": "text"
      },
      "keyword_name": {
        "type":"keyword"
      }
    }
  }
}

# μƒˆλ‘œ λ§Œλ“  test_index ꡬ쑰 ν™•μΈν•˜κΈ°
GET /test_index


# λ§Œλ“  index 에 데이터 λ„£κΈ°
PUT /test_index/_doc/1
{
  "text_name":"I am jaegu.",
  "keyword_name":"I am jaegu."
}

# μžλ£Œν˜•μ„ Keyword 둜 넣은것은 κ²€μƒ‰λ˜μ§€ μ•ŠλŠ”λ‹€.
GET /test_index/_search
{
   "query": {
      "match": {"keyword_name": "jaegu"}
   }
}

# μžλ£Œν˜•μ„ Text 둜 넣은것은 잘 κ²€μƒ‰λœλ‹€.
GET /test_index/_search
{
   "query": {
      "match": {"text_name": "jaegu"}
   }
}

############################################################

# Inter μžλ£Œν˜•μ„ μ €μž₯ν•˜κΈ° μœ„ν•œ test_index λ₯Ό λ‹€μ‹œ λ§Œλ“€μ–΄λ³΄μž.
# Field λŠ” long_num 이고, λ°μ΄ν„°νƒ€μž…μ€ long, 숫자둜 μ΄ν•΄ν• μˆ˜μžˆλŠ”ν˜•μ‹μ€ μˆ«μžλ‘œμ €μž₯ "4" > 4
PUT /test_num
{
  "mappings": {
    "properties": {
      "long_num": {
        "type": "long",
        "coerce": true
      }
    }
  }
}

# index DDL ν™•μΈν•˜κΈ°
GET /test_num

# index data ν™•μΈν•˜κΈ°
GET /test_num/_search

# index_num 에 데이터 λ„£κΈ°
PUT /test_num/_doc/1?pretty
{
  "long_num": 4.3
}


# 데이터 κ°€μ Έμ˜€κΈ°
# long_num ν•„λ“œμ˜ 값이 3 <= data < 4.2 값을 μš”μ²­ν•˜λŠ”λ°, 검색이 λœλ‹€?
# coerce=True 이기 λ•Œλ¬Έμ— 4.3 > 4 둜 μ €μž₯λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€.
GET /test_num/_search
{
   "query": {
      "range": {
        "long_num": {
          "gte": 3,
          "lt":4.2
        }
      }
   }
}

2. μžλ£Œν˜•μ˜ μ’…λ₯˜

λ¬Έμžμ—΄

  • Text
    1. μž…λ ₯된 λ¬Έμžμ—΄μ„ ν…€ λ‹¨μœ„λ‘œ μͺΌκ°œμ–΄ β€œμ—­ 색인” ꡬ쑰둜 λ§Œλ“¬
    2. Full Text 검색에 μ‚¬μš©ν•  λ¬Έμžμ—΄ ν•„λ“œ
  • Keyword
    1. μž…λ ₯된 λ¬Έμžμ—΄μ„ ν•˜λ‚˜μ˜ ν† ν°μœΌλ‘œ μ €μž₯
    2. Text νƒ€μž…μ— keyword 뢄석기λ₯Ό μ μš©ν•œ 것과 동일
    3. 집계 λ˜λŠ” 정렬에 μ‚¬μš©

숫자

  • long
    • 64λΉ„νŠΈ μ •μˆ˜
  • integer
    • 32λΉ„νŠΈ μ •μˆ˜
  • short
    • 16λΉ„νŠΈ μ •μˆ˜
  • byte
    • 8λΉ„νŠΈ μ •μˆ˜
  • double
    • 64λΉ„νŠΈ μ‹€μˆ˜
  • float
    • 32λΉ„νŠΈ μ‹€μˆ˜
  • half_float
    • 16λΉ„νŠΈ μ‹€μˆ˜
  • scaled_float
    • μ‹€μˆ˜ν˜•μ΄μ§€λ§Œ, λΆ€λ™μ†Œμˆ˜μ μ΄ μ•„λ‹ˆλΌ longν˜•νƒœλ‘œ μ €μž₯ν•˜κ³  μ˜΅μ…˜μœΌλ‘œ μ†Œμˆ˜μ  μœ„μΉ˜λ₯Ό 지정

λ‚ μ§œ

  • ISO8601 ν˜•μ‹μ„ 따라 μž…λ ₯
  • β€œ2019-06-02”, β€œ2019-06-12T17:13:40”, β€œ2019-06-12T17:13:40+09.00” 으둜 μž…λ ₯된 경우 μžλ™μœΌλ‘œ λ‚ μ§œ νƒ€μž…μœΌλ‘œ 인식
  • μœ„μ™€ 같은 ν˜•μ‹μ΄ μ•„λ‹Œ κ²½μš°μ—λŠ” text, keyword둜 μ €μž₯

λΆˆλ¦¬μ–Έ

  • true
  • false

객체(Object)

  • 1번 μœ μ €
"user" : [
   {"name" : "soyeon","age" : 21,"phone" : "01012341234"},
   {"name" : "test","age" : 15,"phone" : "01015155555"}
]
  • 2번 μœ μ €
"user" : [
   {"name" : "chae","age" : 30,"phone" : "01012341234"},
   {"name" : "soyeon","age" : 19,"phone" : "01019191919"}
]

μœ„μ™€ 같이 μ €μž₯λ˜μ–΄ μžˆμ„ λ•Œ. μ•„λž˜μ™€ 같은 Query λ₯Ό μ‘°νšŒν•˜κ²Œλœλ‹€λ©΄,

GET /test_game/_search
{
  "query": {
    "bool": {
      "mmust": [
        {
          "match":  {
            "user.name": "jaegu"
          }
        },
        {
          "match": {
            "user.phone": "01012341234"
          }
        }
      ]
    }
  }
}

User.name이 jaegu μ΄λ©΄μ„œ, user.phone 이 01012341234 인 Document 만 검색이 λ˜κ² μ§€λΌκ³  κΈ°λŒ€ν•˜μ§€λ§Œ,,,

μ‹€μ œλ‘œλŠ” 2개의 Document λͺ¨λ‘ κ²€μƒ‰λ˜λŠ”κ²ƒμ„ 확인할 수 μžˆλ‹€.

μ΄μœ λŠ” 역색인 λ•Œλ¬Έ 이닀.

Nested

Geo

  • Geo Point
  • Geo Shape

IP, Range, Binary

λŒ“κΈ€λ‚¨κΈ°κΈ°