Skip to content

Latest commit

Β 

History

History
377 lines (318 loc) Β· 8.92 KB

File metadata and controls

377 lines (318 loc) Β· 8.92 KB

Data Modeling

Mapping : ESμ—μ„œ 인덱싱 μ‹œ, λ¬Έμ„œμ˜ 데이터 μœ ν˜•μ— λ”°λ₯Έ μ μ ˆν•œ νƒ€μž…μ„ μ§€μ •ν•˜λŠ” 것. 사전에 맀핑을 ν•˜μ§€ μ•ŠμœΌλ©΄ ESκ°€ νƒ€μž… μžλ™μ§€μ •. 문제 λ°œμƒμ‹œν‚€μ§€ μ•ŠκΈ° μœ„ν•΄ λ§€ν•‘ κ³Όμ • 맀우 μ€‘μš”ν•¨

Mapping API

동적 λ§€ν•‘

  • μ‚¬μš©μžκ°€ λ§€ν•‘ νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šκ³ , ESκ°€ μžλ™μ§€μ •.
  • 첫번째둜 μΈμ„œνŠΈλ˜λŠ” 데이터에 따라 νƒ€μž…μ„ μ •μ˜ν•¨
  • ν•œ 번 μƒμ„±λœ λ§€ν•‘ νƒ€μž…μ€ λ³€κ²½ν•  수 μ—†λ‹€. νƒ€μž… 변경을 μ›ν•˜λ©΄ 인덱슀 μ‚­μ œ ν›„ λ‹€μ‹œ μƒμ„±ν•˜κ±°λ‚˜ λ§€ν•‘ λ‹€μ‹œ μ •μ˜ν•΄μ•Ό ν•œλ‹€.

λ§€ν•‘ 생성 μ‹œ 고렀사항

  • λ¬Έμžμ—΄μ„ 뢄석할 것인가?
  • _source에 μ–΄λ–€ ν•„λ“œλ₯Ό μ •μ˜ν•  것인가?
  • λ‚ μ§œ ν•„νŠΈλ₯Ό κ°€μ§€λŠ” ν•„λ“œλŠ” 무엇인가?
  • 맀핑에 μ •μ˜λ˜μ§€ μ•Šκ³  μœ μž…λ˜λŠ” ν•„λ“œλŠ” μ–΄λ–»κ²Œ μ²˜λ¦¬ν•  것인가?

인덱슀 생성

PUT movie_search
{
    "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1,
    },
    "mappings": {
        "_doc": {
            "properties": {
                "movieCd": {
                    "type": "keyword"
                },
                "movieNm": {
                    "type": "text",
                    "analyzer: "standard",
                },
                "prdtYear": {
                    "type": "integer"
                },
                "companies": {
                    "progerties": {
                        "companyCd": {
                            "type": "keyword"
                        },
                        "companyNm": {
                            "type": "keyword"
                        }
                    }
                }
            }
        }
    }
}

λ§€ν•‘ 확인

GET movie_search/_mapping

λ§€ν•‘ νŒŒλΌλ―Έν„°

analyzer

  • ν•΄λ‹Ή ν•„λ“œ 데이터λ₯Ό ν˜•νƒœμ†Œ λΆ„μ„ν•˜κ² λ‹€.
  • text λ°μ΄ν„°νƒ€μž… ν•„λ“œλŠ” analyzer λ§€ν•‘ νŒŒλΌλ―Έν„°λ₯Ό 기본적으둜 μ‚¬μš©ν•΄μ•Όν•¨.

nomalizer

  • term query에 뢄석기λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©
  • cafe, Cafe, Cafe` κ°€ λͺ¨λ‘ 같은 λ¬Έμ„œλ‘œ μΈμ‹λ˜κΈ° μœ„ν•΄ μ‚¬μš©

boost

  • ν•„λ“œμ— κ°€μ€‘μΉ˜(Weigth) λΆ€μ˜
  • κ°€μ€‘μΉ˜μ— 따라 μœ μ‚¬λ„ 점수(_score)κ°€ 달라짐
  • 인덱싱 μ‹œμ μ— boost μ„€μ •ν•˜λ©΄ λ‹€μ‹œ indexing ν•˜μ§€ μ•ŠλŠ” 이상 κ°€μ€‘μΉ˜ λ³€κ²½ μ•ˆλ¨ -> 검색 μ‹œμ μ—λ§Œ μ‚¬μš©!!
  • 7.0버전뢀터 boost μ„€μ • κΈ°λŠ₯ 제거됨

coerce

  • 인덱싱 μ‹œ μžλ™ λ³€ν™˜ ν—ˆμš© μ—¬λΆ€ μ„€μ •
  • "10"κ³Ό 같은 ν˜•νƒœ λ¬Έμžμ—΄μ΄ integer ν•„λ“œμ— λ“€μ–΄μ˜¬ λ•Œ μžλ™μœΌλ‘œ ν˜•λ³€ν™˜.
    • coerce λ―Έμ„€μ • μ‹œ 인덱싱 μ‹€νŒ¨

copy_to

  • λ§€ν•‘ νŒŒλΌλ―Έν„°λ₯Ό μΆ”κ°€ν•œ ν•„λ“œλ₯Ό μ§€μ •ν•œ ν•„λ“œλ‘œ 볡사.

fileddata

  • ESκ°€ νž™ 곡간에 μƒμ„±ν•˜λŠ” λ§€λͺ¨λ¦¬ μΊμ‹œ
  • 거의 μ‚¬μš©ν•˜μ§€ μ•Šμ§€λ§Œ, textνƒ€μž… ν•„λ“œκ°€ μ •λ ¬λ˜μ–΄μ•Ό ν•  λ•Œ..
  • λ©”λͺ¨λ¦¬ μ†Œλͺ¨κ°€ 크기 λ•Œλ¬Έμ— 기본적으둜 λΉ„ν™œμ„±ν™” λ˜μ–΄μžˆμŒ

doc_values

  • ESμ—μ„œ μ‚¬μš©ν•˜λŠ” κΈ°λ³Έ μΊμ‹œ
  • 루씬 κΈ°λ°” μΊμ‹œ 방식
  • ν•„λ“œλ₯Ό μ •λ ¬, 집계할 ν•„μš” μ—†κ³  μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•„λ“œκ°’μ— μ•‘μ„ΈμŠ€ ν•  ν•„μš” μ—†μœΌλ©΄ λ””μŠ€ν¬ 곡간 μ ˆμ•½ μœ„ν•΄ doc_values λΉ„ν™œμ„œμ˜€ν•˜

dynamic

  • λ§€ν•‘ ν•„λ“œλ₯Ό λ™μ μœΌλ‘œ 생성할지, μƒμ„±ν•˜μ§€ μ•Šμ„μ§€ κ²°μ •
    • true : μƒˆλ‘œ μΆ”κ°€λ˜λŠ” ν•„λ“œλ₯Ό 맀핑에 μΆ”κ°€
    • false : μƒˆλ‘œ μΆ”κ°€λ˜λŠ” ν•„λ“œ λ¬΄μ‹œ. -> μƒˆλ‘œ μΆ”κ°€λ˜λŠ” ν•„λ“œ 검색 λΆˆκ°€(인덱싱 μ•ˆλ¨), _sourceμ—λŠ” ν‘œμ‹œλ¨
    • strict : μƒˆλ‘œμš΄ ν•„λ“œ μΆ”κ°€λ˜λ©΄ μ˜ˆμ™Έ λ°œμƒ, λ¬Έμ„œ μžμ²΄κ°€ μƒ‰μΈλ˜μ§€ μ•ŠμŒ. μƒˆλ‘œ μœ μž…λ˜λŠ” ν•„λ“œλŠ” μ‚¬μš©μžκ°€ 맀핑에 λͺ…μ‹œμ μœΌλ‘œ μΆ”κ°€ν•΄μ•Ό 함

enabled

  • 검색 κ²°κ³Όμ—λŠ” ν¬ν•¨ν•˜μ§€λ§Œ 색인은 ν•˜μ§€ μ•ŠμŒ

format

  • λ‚ μ§œ/μ‹œκ°„μ„ λ¬Έμžμ—΄λ‘œ ν‘œμ‹œ 포맷

ignore_above

  • ν•„λ“œμ— μ €μž₯λ˜λŠ” λ¬Έμžμ—΄μ΄ 일정 크기 λ„˜μ–΄κ°€λ©΄ λΉˆκ°’μœΌλ‘œ 색인

ignore_malformed

  • 잘λͺ»λœ 데이터 νƒ€μž… 인덱싱 μ‹œ, ν•΄λ‹Ή ν•„λ“œλ§Œ λ¬΄μ‹œν•˜κ³  λ„νλ¨ΌνŠΈλŠ” 인덱싱 κ°€λŠ₯

index

  • ν•„λ“œκ°’μ„ 인덱싱할지 κ²°μ •
  • κΈ°λ³Έκ°’ true

fields

  • 닀쀑 ν•„λ“œ μ„€μ • μ˜΅μ…˜
  • ν•„λ“œ μ•ˆμ— λ‹€λ₯Έ ν•„λ“œ μΆ”κ°€ κ°€λŠ₯
PUT my_idx
{
    "mappings": {
        "_doc": {
            "properties": {
                "name": {
                    "type": "text",
                    "fields": {
                        "alias": {
                            "type": "keyword"
                        }
                    }
                }
            }
        }
    }
}

norms

  • _scoreκ°’ 계산에 ν•„μš”ν•œ μ •κ·œν™” 인수 μ‚¬μš© μ—¬λΆ€.
  • κΈ°λ³Έκ°’ true. λΉ„ν™œμ„±ν™”ν•΄μ„œ λ””μŠ€ν¬ 곡간 μ ˆμ•½ κ°€λŠ₯

null_value

  • λ¬Έμ„œκ°’ null이어도 ν•„λ“œ μƒμ„±ν•˜κ³  μ €μž₯함

position_increment_gap

  • λ°°μ—΄ ν˜•νƒœμ˜ 데이터 색인 μ‹œ 검색 정확도 높이기 μœ„ν•΄ μ‚¬μš©
  • ["John Abraham", "Lincon Smith"] 검색 μ‹œ "Abraham Lincon" 으둜 검색해도 검색 κ°€λŠ₯

properties

  • Objectνƒ€μž… or 쀑첩(Nested)νƒ€μž… μŠ€ν‚€λ§ˆ μ •μ˜ μ‹œ μ‚¬μš©

search_analyzer

  • 검색 μ‹œ μ‚¬μš©ν•  뢄석기λ₯Ό λ³„λ„λ‘œ μ§€μ •

simiarity

  • μœ μ‚¬λ„ μΈ‘μ • μ•Œκ³ λ¦¬μ¦˜ μ§€μ •
    • BM25 : ES λ””ν΄νŠΈ μœ μ‚¬λ„ μΈ‘μ • μ•Œκ³ λ¦¬μ¦˜
    • classic : TF/IDF μ•Œκ³ λ¦¬μ¦˜. μš©μ–΄ 개수둜 μœ μ‚¬λ„ 계산
    • boolean : λ³΅μž‘ν•œ μˆ˜ν•™μ  λͺ¨λΈ 없이 λ‹¨μˆœ boolean μ—°μ‚°μœΌλ‘œ μœ μ‚¬λ„ μΈ‘μ •

store

  • ν•„λ“œλ₯Ό 자체적으둜 μ €μž₯ κ°€λŠ₯

term_vector

  • λ£¨μ”¬μ—μ„œ λΆ„μ„λœ μš©μ–΄ 정보λ₯Ό 포함할지 μ—¬λΆ€λ₯Ό 견정
    • no : term vector μ €μž₯ x
    • yes : ν•„λ“œ, μš©μ–΄λ§Œ μ €μž₯
    • with_positions : μš©μ–΄, μš©μ–΄ μ‹œμž‘ 끝 μœ„μΉ˜ μ €μž₯
    • with_offsets : μš©μ–΄, 문자 μ˜€ν”„μ…‹ μ €μž₯
    • with_position_offsets : μš©μ–΄, μš©μ–΄ μ‹œμž‘κ³Ό 끝, 문자 μ˜€ν”„μ…‹ λͺ¨λ‘ μ €μž₯

메타 ν•„λ“œ

μ‹€μ œ λ¬Έμ„œμ˜ 정보λ₯Ό λ‹΄κ³ μžˆλŠ” _source ν•„λ“œ, κ·Έ λ°–μ˜ _index, _type, _id, _score의 λ©”νƒ€ν•„λ“œ

_index

λ¬Έμ„œ 인덱슀 λͺ….

  • 인덱슀 λͺ…κ³Ό μΈλ±μŠ€μ— λͺ‡ 개 λ„νλ¨ΌνŠΈ μžˆλŠ”μ§€ 확인 κ°€λŠ₯

_type

ν•΄λ‹Ή λ„νλ¨ΌνŠΈκ°€ μ†ν•œ λ§€ν•‘ νƒ€μž… 정보

_id

  • λ„νλ¨ΌνŠΈ 식별 ν‚€

_uid

  • # νƒœκ·Έλ₯Ό μ‚¬μš©ν•΄ _typeκ³Ό _idκ°’ μ‘°ν•©ν•΄ μ‚¬μš© -> λ‚΄λΆ€μ μœΌλ‘œλ§Œμ‚¬μš©. 검색 μ‹œ μ‘°νšŒλ˜λŠ” 값은 μ•„λ‹˜

_source

  • λ¬Έμ„œ 원본 데이터

_all

  • 색인에 μ‚¬μš©λœ λͺ¨λ“  ν•„λ“œ 정보 κ°€μ§„ 메타 ν•„λ“œ
  • λͺ¨λ“  ν•„λ“œ λ‚΄μš©μ΄ ν•˜λ‚˜μ˜ ν…μŠ€νŠΈλ‘œ 합쳐져 제곡됨

_routing

  • νŠΉμ • λ¬Έμ„œλ₯Ό μƒ€λ“œμ— μ €μž₯ν•˜κΈ° μœ„ν•΄ μ§€μ •

ν•„λ“œ 데이터 νƒ€μž…

  • keyword, text와 같은 λ¬Έμžμ—΄ νƒ€μž…
  • date, long, double, integer, boolean, ip 같은 데이터 νƒ€μž…
  • 각체, 쀑첩문 λ“± JSON 계측 νŠΉμ„±μ˜ 데이터 νƒ€μž…
  • geo_point, geo_shape 같은 νŠΉμˆ˜ν•œ 데이터 νƒ€μž…

Keyword

λ³„λ„μ˜ 뢄석기λ₯Ό κ±°μΉ˜μ§€ μ•Šκ³  원문 κ·ΈλŒ€λ‘œ 색인.

μ‚¬μš©λ˜λŠ” ν•­λͺ©

  • 검색 μ‹œ 필터링 λ˜λŠ” ν•­λͺ©
  • 정렬이 ν•„μš”ν•œ ν•­λͺ©
  • 집계(aggregation)ν•΄μ•Ό ν•˜λŠ” ν•­λͺ©

ex) 'elastic search' 검색 μ‹œ

  • 'elastic search'둜만 검색 κ°€λŠ₯
  • 'elastic' : 검색 λΆˆκ°€

Kyword νƒ€μž…μ—μ„œ μ„€μ •κ°€λŠ₯ν•œ μ£Όμš” νŒŒλΌλ―Έν„°

  • boost : 검색 κ²°κ³Ό 정렬에 영ν–₯
  • doc_values : ν•„λ“œλ₯Ό λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•΄ μΊμ‹œλ‘œ μ‚¬μš©. κΈ°λ³Έκ°’ true
  • index : ν•΄λ‹Ή ν•„λ“œλ₯Ό 검색에 μ‚¬μš©ν• μ§€. κΈ°λ³Έκ°’ true
  • null_value : 데이터 값이 μ—†λŠ” 겨우 null둜 ν•„λ“œ κ°’ λŒ€μ²΄ν• μ§€ μ„€μ •(기본적으둜 κ°’ μ—†μœΌλ©΄ ν•„λ“œ 자체λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠμŒ)
  • store : ν•„λ“œκ°’μ„ ν•„λ“œμ™€ λ³„λ„λ‘œ _source에 μ €μž₯ν•˜κ³  검색 κ°€λŠ₯ν•˜κ²Œ ν• μ§€ μ„€μ •. κΈ°λ³Έκ°’ false

Text

데이터λ₯Ό λ¬Έμžμ—΄ λ°μ΄ν„°λ‘œ 인식. λΆ„μ„κΈ°λŠ” 기본적으둜 Standard Analyzerλ₯Ό μ‚¬μš©.

textνƒ€μž…μ„ 검색 & μ •λ ¬(sorting) & 집계(aggregation)에 μ‚¬μš©ν•΄μ•Ό ν•  λ•Œ -> λ©€ν‹°ν•„λ“œλ‘œ μ„€μ •

PUT movie_search/_mapping/_doc
{
    "properties": {
        "movieComment": {
            "type": "text",
            "fields": {
                "movieComment_keyword": {
                    "type": "keyword"
                }
            }
        }
    }
}

text νƒ€μž…μ—μ„œ μ„€μ • κ°€λŠ₯ν•œ μ£Όμš” νŒŒλΌλ―Έν„°

  • analyzer : μΈλ±μŠ€μ™€ 검색에 μ‚¬μš©ν•  ν˜•νƒœμ†Œ 뢄석기 μ„€μ •
  • boost
  • fielddata
  • index
  • norms
  • store
  • search_analyzer
  • simialrity
  • term_vector

Array

λ°°μ—΄ 첫번째 값이 데이터 νƒ€μž… κ²°μ •. λ°°μ—΄μ˜ λͺ¨λ“  값이 같은 νƒ€μž…μœΌλ‘œ κ΅¬μ„±λ˜μ–΄μ•Ό 함

Numeric

  • long : 64λΉ„νŠΈ μ •μˆ˜
  • integer : 32λΉ„νŠΈ μ •μˆ˜
  • short : 16λΉ„νŠΈ μ •μˆ˜
  • byte : 8λΉ„νŠΈ μ •μˆ˜
  • double : 64λΉ„νŠΈ 뢀동 μ†Œμˆ˜μ 
  • float : 32λΉ„νŠΈ λΆ€λ™μ†Œμˆ˜μ 
  • half_float : 16λΉ„νŠΈ 뢀동 μ†Œμˆ˜μ 

Date

별도 ν˜•μ‹ μ§€μ •ν•˜μ§€ μ•Šμ„ μ‹œ "yyyy-MM-ddTHH:mm:ssZ" ν˜•νƒœλ‘œ 지정됨.

μ•„λž˜ μ„Έ κ°€μ§€ ν˜•νƒœ 제곡, UTC λ°€λ¦¬μ΄ˆ λ‹¨μœ„

  • λ¬Έμžμ—΄ ν¬ν•¨λœ λ‚ μ§œ ν˜•μ‹
  • ISO_INSTANT ν¬ν•¨λœ λ‚ μ§œ ν˜•μ‹
  • λ°€λ¦¬μ΄ˆ

Range

λ²”μœ„κ°€ μžˆλŠ” 데이터

  • integer_range
  • float_range
  • long_range
  • double_range
  • date_range
  • ip_range

Boolean

Geo-Point

  • μœ„κ²½λ„ μœ„μΉ˜

IP

IPv4, IPv6 λͺ¨λ‘ μ§€μ • κ°€λŠ₯

Object

λ‚΄λΆ€ 객체 계측적 ν‘œν˜„ κ°€λŠ₯. νŠΉμ • ν‚€μ›Œλ“œλ‘œ 데이터 μ •μ˜ν•˜μ§€ μ•Šκ³  ν•„λ“œκ°’μœΌλ‘œ λ¬Έμ„œ ꡬ쑰 μž…λ ₯

{
    "properties": {
        "compaies": {
            "properties": {
                "companyName": {
                    "type": "text"
                }
            }
        }
    }
}

Neseted

Object 객체 배열을 λ…λ¦½μ μœΌλ‘œ 질의/μƒ‰μΈν•˜λŠ” 데이터 νƒ€μž….

ν•„λ“œ λ‚΄ 검색은 기본적으둜 OR쑰건으둜 검색됨.

  • OR 쑰건 검색은 쑰금만 λ³΅μž‘ν•΄μ Έλ„ 검색 λͺ¨ν˜Έν•΄μ§.
  • Array νƒ€μž… λ‚΄λΆ€ 검색은 λͺ¨λ“  데이터λ₯Ό κΈ°μ€€μœΌλ‘œ ORμ—°μ‚°ν•˜κΈ° λ•Œλ¬Έμ— Array λ‚΄λΆ€ λ„νλ¨ΌνŠΈ ν•„λ“œκ°’ μ¦κ°€ν• μˆ˜λ‘ ν˜Όλž€ 가쀑
{
    "title": "해리포터,
    "copanies": [
        {  
            "companyCd": 1,
            "companyName": "μ›Œλ„ˆ"
        },
        {
            "companyCd": 2,
            "companyName": "heyday"
        }
    ]
}

=> 이런 문제 ν•΄κ²° μœ„ν•΄ Nested μ •μ˜!!

PUT movie/_mapping/_doc
{
    "properties: {
        "compaies": {
            "type": "nested"
        }
    }
}

PUT movie/_doc/8
{
    "title": "해리포터",
    "companies: [
        {  
            "companyCd": 1,
            "companyName": "μ›Œλ„ˆ"
        },
        {
            "companyCd": 2,
            "companyName": "heyday"
        }
    ]
}

POST movie/_search
{
    "query": {
        "nested": {
            "path": "companies",
            "query": {
                "bool": {
                    "must": [
                        {
                            "match": {"companies.companyName": "μ›Œλ„ˆ"}
                        },
                        {
                            "match": {"companies.companyCd": "2"}
                        }
                    ]
                }
            }
        }
    }
}

ES 뢄석기