[🌎elasticsearch] Elasticsearch νƒ€μž…μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž!

Park Ji YoungΒ·2021λ…„ 1μ›” 19일
0

elasticsearch

λͺ©λ‘ 보기
7/8
post-thumbnail


ElasticSearch 의 λ‹€μ–‘ν•œ κΈ°λŠ₯듀을 λ‘˜λŸ¬λ³΄κΈ° μ „ κΌ­ μ•Œμ•„μ•Ό ν•  νƒ€μž…λ“€μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.!!
μ§„μ§œ μ§„μ§œ μ§„μ§œ μ€‘μš”ν•˜λ‹ˆ κΌ­ 컀피 슀윽 λ§ˆμ‹œκ³  μ½μ–΄μ£Όμ„Έμš”!!

πŸ” Mapping

Mapping μ–΄λ–»κ²Œ ElasticSearch 의 λ¬Έμ„œλ“€μ΄ μ €μž₯되고 색인 λ˜μ—ˆλŠ”μ§€μ— λŒ€ν•œ μ •μ˜μž…λ‹ˆλ‹€.
이 Mapping 의 μ •μ˜λ₯Ό 톡해 λΆˆν•„μš”ν•œ ν”„λ‘œμ„ΈμŠ€ λ“€κ³Ό 곡간 λ‚­λΉ„λ₯Ό 쀄이고 ν•„μš”ν•œ κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
예λ₯Ό λ“€λ©΄,

  • μ–΄λ–€ ν•„λ“œλ“€μ΄ Full-Text-Search 의 λŒ€μƒμ΄ λ˜μ–΄μ•Ό ν•˜λŠ”κ°€?
  • μ–΄λ–€ ν•„λ“œλ“€μ΄ 숫자, λ‚ μ§œ, μœ„μΉ˜ 정보λ₯Ό ν¬ν•¨ν•˜λŠ”κ°€?

λ˜ν•œ 이후 ν¬μŠ€νŠΈμ—μ„œ Dynamic Mapping 을 λ‹€λ£° λ•Œμ—λ„ Mapping κ³Ό νƒ€μž…μ— λŒ€ν•œ κΈ°λ³Έ κ°œλ…μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

🍟 Field Data Type

λ¨Όμ € 이번 ν¬μŠ€νŠΈμ—μ„œλŠ” Metadata Fields κ°€ μ•„λ‹Œ Properties 에 λŒ€ν•œ Field Type λ‹€λ£Ήλ‹ˆλ‹€.

Metadata Fields λŠ” "_index", "_id", "_source" 와 같이 metadata 와 κ΄€λ ¨λœ λ…€μ„λ“€μž…λ‹ˆλ‹€!

λ¨Όμ € μ€‘μš”ν•œ 녀석듀을 λ½‘μžλ©΄,

  • Text
  • Keyword
  • Numbers
  • Date
  • Object

κ·Έ 외에

  • Nested

등이 μžˆμŠ΅λ‹ˆλ‹€.

더 μžμ„Έν•œ λ‚΄μš©μ€ πŸ‘†μ—˜λΌμŠ€ν‹± ν™ˆνŽ˜μ΄μ§€ μ°Έκ³ ν•˜κΈ°!!

πŸ•Keyword & Text

μš” 두 녀석은 정말 μ€‘μš”ν•©λ‹ˆλ‹€.

  • keyword λŠ” exact search, sorting, aggregations 등을 μœ„ν•œ λ…€μ„μž…λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ Id, Email, Tag 등을 검색할 λ•Œ μœ μš©ν•©λ‹ˆλ‹€.
  • text λŠ” Full-Text-Search κΈ°λŠ₯을 μœ„ν•œ λ…€μ„μž…λ‹ˆλ‹€. μš°λ¦¬κ°€ κ²€μƒ‰ν•˜λ €λŠ” 단어와 μ΅œλŒ€ν•œ κ΄€λ ¨λœ 검색을 μœ„ν•΄ μ‚¬μš©ν•˜λŠ” λ†ˆ μž…λ‹ˆλ‹€!

기본적으둜 μš°λ¦¬κ°€ μ–΄λ–€ ν•„λ“œ νƒ€μž…μ„ 지정해주지 μ•Šκ³  λ¬Έμžμ—΄ 데이터λ₯Ό λ„£κ²Œ 되면 (지정 μ•ˆν•΄λ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.)
ElasticSearch λŠ” 이 ν•„λ“œκ°€ μ–΄λ–€ μš©λ„λ‘œ μ‚¬μš©λ  지 μ•Œ 방법이 μ—†κΈ° λ•Œλ¬Έμ— keyword 와 text νƒ€μž…μ„ 같이 지정해주어 색인과정을 μ§„ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.

keyword 와 text 의 두 κΈ°λŠ₯이 λͺ¨λ‘ ν•„μš”ν•˜λ‹€λ©΄ keyword 와 text νƒ€μž…μ„ 같이 μ§€μ •ν•΄μ£ΌλŠ” 것이 정말 μœ μš©ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 예λ₯Ό λ“€μ–΄λ΄…μ‹œλ‹€.
λ¬Έμ„œμ˜ μž‘μ„±μžλ₯Ό 검색을 ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. μž‘μ„±μžλ₯Ό Email 이라고 ν•©μ‹œλ‹€.
μš°λ¦¬κ°€ 검색할 단어와 Email 이 λΉ„μŠ·ν•œμ§€λŠ” 상관관계λ₯Ό λ”°μ§ˆ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
였직 keyword νƒ€μž…μ˜ ν•„λ“œλ§Œ 있으면 되겠죠.

그럼 Email ν•„λ“œμ— text νƒ€μž…μ€ λΆˆν•„μš”ν•œ νƒ€μž…μ΄κ³ , μ΄λŠ” disk 곡간을 λ‚­λΉ„ν•˜κ²Œ λ©λ‹ˆλ‹€.
λ§Œμ•½ λ¬Έμ„œκ°€ 수백만 μˆ˜μ²œλ§Œκ°œκ°€ λ„˜μ–΄κ°„λ‹€λ©΄ μ΄λŠ” λ¬΄μ‹œν•  수 μ—†λŠ” 곡간일 것 μž…λ‹ˆλ‹€.

μ΄λŠ” λ°˜λŒ€λ„ λ§ˆμ°¬κ°€μ§€ μž…λ‹ˆλ‹€.

ν•„λ“œμ— ν•„μš”ν•œ Type 만 μ§€μ •ν•˜λŠ” 것은 κ²°κ΅­ disk λΉ„μš©μ„ μ€„μ΄λŠ” κ²°κ³Όλ₯Ό κ°€μ Έμ˜€κ² μ£ ??
λΉ„μš©μ€ 맀우 μ€‘μš”ν•˜λ‹ˆκΉŒ κΌ­ ν•„μš”ν•œ 만큼만 μ”μ‹œλ‹€!!

πŸ₯ž Numbers

숫자 λ˜ν•œ μ€‘μš”ν•˜μ§€λ§Œ μ•Œμ•„μ•Ό ν•  κ°œλ…μ€ λ§Žμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
λ§Œμ•½ JSON ν˜•μ‹μ˜ 데이터가 날라와 μ €μž₯ν•˜λŠ”λ° μ •μˆ˜ ν˜•μ‹μ΄λ‹€ 그러면 Long νƒ€μž…μœΌλ‘œ,
μ‹€μˆ˜ ν˜•μ‹μ΄λ‹€ 그러면 Double νƒ€μž…μœΌλ‘œ μžλ™μœΌλ‘œ λ§€ν•‘λ©λ‹ˆλ‹€.

자 μ—¬κΈ°μ„œ 질문. μ™œ Long 이고, Double 일까?

ElasticSearch λŠ” μ§€μ •λ˜μ§€ μ•Šμ€ νƒ€μž…μ— λŒ€ν•΄μ„œ 정보가 μ—†μŠ΅λ‹ˆλ‹€.

λ‹€μ‹œλ§ν•΄ μ •μˆ˜κ°€ μ €μž₯되면 이 μ •μˆ˜μ˜ λ²”μœ„κ°€ μ–΄λ–»κ²Œ 될지에 λŒ€ν•΄μ„œ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.
κ·Έλ ‡κΈ° λ•Œλ¬Έμ— Interger κ°€ μ•„λ‹ˆλΌ 더 큰 수λ₯Ό 담을 수 μžˆλŠ” Long νƒ€μž…μ— λ§€ν•‘ν•˜λŠ” 것 μž…λ‹ˆλ‹€.
Double λ˜ν•œ λ§ˆμ°¬κ°€μ§€ μž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 무쑰건 Long, Double νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ”κ±΄ 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€.
이전에 이미 λ§ν–ˆμ§€λ§Œ λΉ„μš©μ€ 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. Integer 의 λ²”μœ„λ©΄ μΆ©λΆ„ν•œλ° Long 을 μ‚¬μš©ν•˜λŠ” 것은 disk 곡간을 λ‚­λΉ„ν•˜λŠ” 행동이겠죠?

λ§Œμ•½ μ •ν™•ν•˜κ²Œ νŠΉμ • ν•„λ“œκ°€ λ‹€λ£° 숫자의 λ²”μœ„λ₯Ό μ•ˆλ‹€λ©΄ 그에 맞게 μ‚¬μš©ν•˜μ‹œλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

πŸ— Date

JSON ν˜•μ‹μ˜ λ°μ΄ν„°μ—λŠ” 이 ν•„λ“œλŠ” date νƒ€μž…μ΄λ‹€!! 라고 μ•Œλ €μ£ΌλŠ” μ§€ν‘œκ°€ μ—†μŠ΅λ‹ˆλ‹€.
μš°λ¦¬κ°€ JSON ν˜•μ‹μœΌλ‘œ 데이터λ₯Ό μ£Όκ³  받을텐데.. ElasticSearch λŠ” 이걸 μ–΄λ–»κ²Œ μ•ŒκΉŒμš”?

ElasticSearch λŠ” 맀우 μœ μš©ν•œ κΈ°λŠ₯을 가지고 μžˆμŠ΅λ‹ˆλ‹€.

이 ν•„λ“œκ°€ Date νƒ€μž…μΈμ§€ μ•„λ‹Œμ§€ μœ μΆ”ν•˜λŠ” 것이죠

λ¬Έμžμ—΄ ν•„λ“œμ΄λ©°, Date 정보λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€λ©΄ μ˜ˆλ“€λ“€μ–΄ λ‹€μŒκ³Ό 같은 ν˜•μ‹μ΄λΌλ©΄

{ "date": "2015-01-01" }
{ "date": "2015-01-01T12:10:30Z" }

ElasticSearch λŠ” μ•„!! 이 ν•„λ“œλŠ” Date νƒ€μž…μ΄κ΅¬λ‚˜! 라고 μΆ”λ‘ ν•˜κ²Œ λ©λ‹ˆλ‹€.

λ¬Όλ‘  이 ν˜•μ‹μ€ μ•„λž˜μ™€ 같이 ν˜•μ‹μ„ μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

"mappings": {
    "properties": {
        "date": {
            "type":   "date",
            "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
    }
}

아직 mapping ν•˜λŠ” 법을 λ°°μš°μ§„ μ•Šμ•˜μ§€λ§Œ format ν˜•μ‹μ„ λ³΄λ©΄μ„œ μ•„ 이런 μ‹μœΌλ‘œ 지정 κ°€λŠ₯ν•˜κ΅¬λ‚˜ 라고 μ•„μ‹œλ©΄ 될 것 κ°™μŠ΅λ‹ˆλ‹€.

λ˜ν•œ 미리 μ§€μ •ν•œλ‹€λ©΄ Interger, Long νƒ€μž…μ„ Date ν•„λ“œλ‘œ ν‘œν˜„μ΄ κ°€λŠ₯도 ν•©λ‹ˆλ‹€.

  • Integer νƒ€μž…μ€ 1970λ…„ 1μ›” 1일 λΆ€ν„° 초λ₯Ό λ‹¨μœ„λ‘œ κ³„μ‚°ν•œ κ°’μž…λ‹ˆλ‹€.
  • Long νƒ€μž…μ€ 1970λ…„ 1μ›” 1일뢀터 λ°€λ¦¬μ΄ˆλ₯Ό λ‹¨μœ„λ‘œ κ³„μ‚°ν•œ κ°’μž…λ‹ˆλ‹€.

β˜• Object

JSON 의 데이터 ν˜•μ‹μ€ Object 라고 λ³΄μ‹œλ©΄ λ©λ‹ˆλ‹€.
κ³„μΈ΅μ μœΌλ‘œ λ‚΄λΆ€ Object λ₯Ό λ‹€μ‹œ ν¬ν•¨ν•˜κ²Œ 되죠.

ElasticSearch μ—μ„œλŠ” 사싀 Object λΌλŠ” νƒ€μž…μ΄ 애맀λͺ¨ν˜Έν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄

{
    "region": "US",
    "manager": {
        "age":     30,
        "name": {
        "first": "John",
        "last":  "Smith"
        }
    }
}

이런 데이터가 μžˆλ‹€λ©΄ ElasticSearch λŠ” λ‚΄λΆ€μ μœΌλ‘œ

{
    "region":             "US",
    "manager.age":        30,
    "manager.name.first": "John",
    "manager.name.last":  "Smith"
}

점을 톡해 μ €μž₯ν•©λ‹ˆλ‹€. λ”°λΌμ„œ λ‚΄λΆ€μ μœΌλ‘œ λ³Έλ‹€λ©΄, "Object λΌλŠ” νƒ€μž…μ€ μ—†λ‹€." 라고도 ν•  수 μžˆκ² λ„€μš”.

πŸ₯§ Nested

Nested νƒ€μž…μ€ λ°°μ—΄κ³Ό 관련이 μžˆμŠ΅λ‹ˆλ‹€.
더 μžμ„Έν•˜κ²Œ λ§ν•˜λ©΄ Object 의 배열을 색인 ν•˜κΈ° μœ„ν•œ 특수 νƒ€μž…μ΄λΌκ³  λ³΄μ‹œλ©΄ λ˜κ² λ„€μš”.

이전에 λ§ν–ˆλ˜ 것 처럼ElasticSearch λ‚΄λΆ€μ μœΌλ‘œλŠ” Object λΌλŠ” νƒ€μž…μ΄ μ—†λ‹€. 라고 λ§μ”€λ“œλ ΈλŠ”λ°μš”.

{
    "group" : "fans",
        "user" : [
            {
            "first" : "John",
            "last" :  "Smith"
            },
            {
            "first" : "Alice",
            "last" :  "White"
            }
        ]
}

이와 같은 νƒ€μž…μ€ μ–΄λ–»κ²Œ μ €μž₯λ˜μ–΄μ•Ό ν• κΉŒμš”? user.first λŠ” μ—¬λŸ¬κ°œ μžˆμœΌλ‹ˆ λ°°μ—΄λ‘œ μ €μž₯ν•΄μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€.
λ‹€μŒκ³Ό κ°™μ΄μš”.

{
    "group" :        "fans",
    "user.first" : [ "alice", "john" ],
    "user.last" :  [ "smith", "white" ]
}

μ΄λ ‡κ²Œ μ €μž₯되면 alice white λΌλŠ” 이름과 john smith μ΄λ¦„μ˜ 연관성은 μ‚¬λΌμ§€κ²Œ λ©λ‹ˆλ‹€.

순수히 user.first 에 "alice", "john" 이 μ €μž₯λ˜μ—ˆκ³ 
마찬기자둜 user.last 에 "smith", "white" 이 μ €μž₯λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄μ£ .

λ‹€μ‹œλ§ν•΄ smith 라고 κ²€μƒ‰ν•œλ‹€λ©΄ alice κ°€ νŠ€μ–΄λ‚˜μ˜¬ μˆ˜λ„ μžˆλŠ” μƒν™©μ΄λΌλŠ” κ²λ‹ˆλ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Nested λΌλŠ” νƒ€μž…μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
Nested λ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 ElasticSearch λŠ” 배열을 λ‚΄λΆ€μ μœΌλ‘œ μˆ¨κ²¨μ§„ λ¬Έμ„œμ— ν•΄λ‹Ή λ‚΄μš©μ„ λ”°λ‘œ μ €μž₯ν•˜κ²Œ λ©λ‹ˆλ‹€.

λ§Œμ•½ user κ°€ 11λͺ…이라면, 11개의 μˆ¨κ²¨μ§„ user λ¬Έμ„œμ™€ 1개의 λ³Έ λ¬Έμ„œκ°€ μ €μž₯λ˜κ² λ„€μš”.

λ¬Έμ„œκ°€ λŠ˜μ–΄λ‚œλ‹€λŠ” 것은 검색 λΉ„μš©μ΄ λŠ˜μ–΄λ‚œλ‹€λŠ” λ§μž…λ‹ˆλ‹€.
μœ μ˜ν•΄μ„œ 써라... 이 말이죠.

πŸ˜‚ 끝 μž…λ‹ˆλ‹€!!

끝이라 적고 ν•œκ°€μ§€λ§Œ 더 λ§μ”€λ“œλ¦¬μžλ©΄..
이 Mapping 을 톡해 데이터 νƒ€μž…μ„ μ •ν•˜κ³  인덱슀λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.
그리고 μ—„μ²­λ‚œ μ–‘μ˜ 데이터λ₯Ό λ§Œλ“€κ³  λ‚˜λ‹ˆ λ°μ΄ν„°μ˜ νƒ€μž…μ„ λ³€κ²½ν•΄μ•Όν•  상황이 였게 되면...

인덱슀λ₯Ό μ‚­μ œν•˜κ³  λ‹€μ‹œ λ§Œλ“œλŠ” Reindex 과정이 ν•„μš”ν•©λ‹ˆλ‹€... κ·ΈλŸ¬λ‹ˆ λ°˜λ“œμ‹œ.. μ‹¬μ‚¬μˆ™κ³ ν•΄μ„œ.. λ§Œλ“œμ„Έμš”..


짞짞짞 고생 λ§ŽμœΌμ…¨μŠ΅λ‹ˆλ‹€.!! μž μ‹œ 눈 μš΄λ™ν•˜κ³  쉬고 κ³„μ„Έμš”!!

λ‹€μŒμ—λŠ” 또 μ–΄λ €μš΄ λ‚΄μš©μœΌλ‘œ μ°Ύμ•„λ΅κ²Œμš”.. 흑흐ꡬ γ…œγ…œ 곡뢀할 수둝 μ•Œμ•„μ•Όν•  λ‚΄μš©μ΄ λ§ŽμŠ΅λ‹ˆλ‹€.

profile
I am two cat's father

0개의 λŒ“κΈ€