Skip to content

Latest commit

Β 

History

History
403 lines (269 loc) Β· 19.9 KB

File metadata and controls

403 lines (269 loc) Β· 19.9 KB

Elasticsearchλž€?

μ•„νŒŒμΉ˜ 루씬 기반의 java μ˜€ν”ˆμ†ŒμŠ€ λΆ„μ‚° 검색엔진이닀.
λ°©λŒ€ν•œ μ–‘μ˜ 데이터λ₯Ό μ‹ μ†ν•˜κ³  거의 μ‹€μ‹œκ°„μœΌλ‘œ μ €μž₯, 검색, 뢄석할 수 μžˆλ‹€.

κ²€μƒ‰μ—”μ§„μ˜ μ‹œμ΄ˆ, Lucene
λ”κ·Έμ»€νŒ…μ΄ κ³ μ•ˆν•œ 역색인 ꡬ쑰인 μ•„νŒŒμΉ˜ 루씬을 기반으둜 λΆ„μ‚°μ²˜λ¦¬λ₯Ό κ°€λŠ₯ν•˜κ²Œν•œ μ•„νŒŒμΉ˜ 솔라가 λ“±μž₯ν•΄μ„œ 검색엔진 μ‹œμž₯을 μž₯μ•…ν–ˆκ³ , λͺ‡λ…„ 후에 μ—­μ‹œ 루씬을 기반으둜 ν•œ μ—˜λΌμŠ€ν‹±μ„œμΉ˜κ°€ λ“±μž₯ν•΄ μ§€κΈˆμ€ 검색엔진 λΆ„μ•Όμ—μ„œ 지배적인 μœ„μΉ˜μ— μžˆλ‹€.


검색엔진? κ²€μƒ‰μ‹œμŠ€ν…œ? κ²€μƒ‰μ„œλΉ„μŠ€?

  • 검색엔진
    κ΄‘ν• ν•œ μ›Ήμ—μ„œ 정보λ₯Ό μˆ˜μ§‘ν•΄ 검색 κ²°κ³Όλ₯Ό μ œκ³΅ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€.

  • κ²€μƒ‰μ‹œμŠ€ν…œ
    λŒ€μš©λŸ‰ 데이터λ₯Ό 기반으둜 μ‹ λ’°μ„±μžˆλŠ” 검색 κ²°κ³Όλ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ 검색엔진을 기반으둜 κ΅¬μΆ•λœ μ‹œμŠ€ν…œμ„ ν†΅μΉ­ν•˜λŠ” μš©μ–΄μ΄λ‹€.

  • κ²€μƒ‰μ„œλΉ„μŠ€
    검색엔진을 기반으둜 κ΅¬μΆ•ν•œ 검색 μ‹œμŠ€ν…œμ„ ν™œμš©ν•΄ 검색결과λ₯Ό μ„œλΉ„μŠ€λ‘œ μ œκ³΅ν•œλ‹€.

μ—˜λΌμŠ€ν‹±μ„œμΉ˜λŠ” μ—„λ°€νžˆ λ§ν•˜μžλ©΄ 검색엔진이며 μ•„λž˜μ—μ„œλŠ” 검색 μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ μ—˜λΌμŠ€ν‹±μ„œμΉ˜λ₯Ό μ΄μš©ν•΄ 검색 μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•˜λŠ” 것을 보겠닀.

κ²€μƒ‰μ„œλΉ„μŠ€ > κ²€μƒ‰μ‹œμŠ€ν…œ > 검색엔진


κ²€μƒ‰μ‹œμŠ€ν…œ κ΅¬μ„±μš”μ†Œ

image

  • μˆ˜μ§‘κΈ°
    μˆ˜μ§‘κΈ°λŠ” μ›Ήμ‚¬μ΄νŠΈ, λΈ”λ‘œκ·Έ, 카페 λ“± μ›Ήμ—μ„œ ν•„μš”ν•œ 정보λ₯Ό μˆ˜μ§‘ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€.
    크둀러, μŠ€νŒŒμ΄λ”, μ›œ, μ›Ή λ‘œλ΄‡ λ“±μœΌλ‘œ λΆˆλ¦°λ‹€.

  • μ €μž₯μ†Œ
    색인기가 μƒ‰μΈν•œ 데이터λ₯Ό λ³΄κ΄€ν•˜λŠ” 물리적 μ €μž₯μ†Œ

  • 색인기
    μˆ˜μ§‘κΈ°κ°€ μˆ˜μ§‘ν•œ 데이터λ₯Ό 검색 κ°€λŠ₯ν•œ ꡬ쑰둜 κ°€κ³΅ν•΄μ„œ μ €μž₯
    ν˜•νƒœμ†Œ 뢄석기λ₯Ό 톡해 μœ μ˜λ―Έν•œ 단어λ₯Ό μΆ”μΆœν•˜κ³  검색에 μœ λ¦¬ν•œ 역색인 ꡬ쑰둜 데이터λ₯Ό μ €μž₯

  • 검색기
    μ €μž₯된 λ¬Έμ„œμ€‘ μ‚¬μš©μž μ§ˆμ˜μ™€ μΌμΉ˜ν•˜λŠ” κ²°κ³Όλ₯Ό 역색인 ꡬ쑰λ₯Ό 톡해 μ°Ύμ•„μ„œ λ°˜ν™˜
    μœ μ‚¬λ„ 기반의 검색 μˆœμœ„ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ‚¬μš©μž μ§ˆμ˜μ™€ λ¬Έμ„œκ°€ μΌμΉ˜ν•˜λŠ”μ§€ νŒλ‹¨


색인과 역색인 μ΄λž€??

μƒ‰μΈμ΄λž€ νŠΉμ •ν•œ 데이터가 μ–΄λŠ μœ„μΉ˜μ— μžˆλŠ”μ§€ 미리 μ €μž₯해두어 검색 μ‹œμ— λΉ λ₯Έ μ†λ„λ‘œ 찾을 수 μžˆλ‹€.
이λ₯Όν…Œλ©΄ 'λ‚˜λŠ” 홍길동 μž…λ‹ˆλ‹€. λ‚˜λŠ” 아버지λ₯Ό 아버지라 λΆ€λ₯΄μ§€ λͺ» ν•©λ‹ˆλ‹€.' λΌλŠ” λ¬Έμžμ—΄ 데이터가 μžˆλŠ” κ²½μš°μ— λ‹€μŒκ³Ό 같이 색인될 수 μžˆλ‹€.

1. λ‚˜λŠ” 홍길동 μž…λ‹ˆλ‹€.
2. λ‚˜λŠ” 아버지λ₯Ό 아버지라 λΆ€λ₯΄μ§€ λͺ»ν•©λ‹ˆλ‹€.

μœ„μ™€ 같이 색인이 된 κ²½μš°μ— λ‚΄κ°€ 만일 '홍길동'μ΄λž€ 단어가 λ“€μ–΄κ°„ 데이터λ₯Ό μ°ΎλŠ”λ‹€κ³  κ²€μƒ‰ν•˜λ©΄ 색인결과에 따라 1번 데이터에 λ‚΄κ°€ μ›ν•˜λŠ” 데이터가 μžˆλ‹€λŠ” κ²°κ³Όκ°€ λ‚˜μ˜¬ 수 μžˆλ‹€.

ν•˜μ§€λ§Œ 이 λ°©λ²•μ—λŠ” λ¬Έμ œκ°€ μžˆλ‹€. 적은 데이터 μΌλ•ŒλŠ” μƒκ΄€μ—†μ§€λ§Œ 데이터가 맀우 λ§Žλ‹€λ©΄
1λ²ˆλΆ€ν„° 끝 λ°μ΄ν„°κΉŒμ§€ μˆœμ„œλŒ€λ‘œ κ²€μƒ‰ν•˜μ—¬ '홍길동'μ΄λž€ 단어λ₯Ό μ°ΎκΈ° λ•Œλ¬Έμ— μ—„μ²­λ‚œ 속도지연이 λ°œμƒν•  수 μžˆλ‹€.

μ΄λŸ¬ν•œ ν˜„μƒμ„ κ°œμ„ ν•˜κΈ° μœ„ν•΄μ„œ 역색인이 ν•„μš”ν•˜λ‹€.

μ—­μƒ‰μΈμ΄λž€ 데이터 색인 μ‹œμ— 쑰금 더 μΈκ°„μ˜ 사고와 κ°€κΉκ²Œ 체계λ₯Ό κ΅¬μ„±ν•œ 것이닀.
μ–΄λ– ν•œ 데이터λ₯Ό 색인할 λ•Œ Term(단어) κΈ°μ€€μœΌλ‘œ 색인을 μˆ˜ν–‰ν•˜λŠ” 것이닀.
μœ„μ˜ 예제λ₯Ό 역색인 ν•œλ‹€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

λ‚˜ #1, 2
λŠ” #1, 2
홍길동 #1
μž…λ‹ˆλ‹€ #1
아버지 #2
λ₯Ό #2
λΆ€λ₯΄μ§€ #2
λͺ» #2
ν•©λ‹ˆλ‹€ #2

μ΄λ ‡κ²Œ μ—­μƒ‰μΈλœ 데이터가 κ΅¬μ„±λ˜μ–΄μžˆλ‹€λ©΄ ν™κΈΈλ™μ΄λΌλŠ” 단어λ₯Ό 보고 λ°”λ‘œ 1번 λ¬Έμ„œμ— μžˆλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.


ν˜•νƒœμ†Œ 뢄석

검색 μ‹œμ— 보톡 λ‹¨μ–΄λ§Œ μž…λ ₯ν•˜λŠ” κ²½μš°λŠ” μ—†λ‹€.
보톡 λ¬Έμž₯을 ν†΅μ§Έλ‘œ κ²€μƒ‰ν•˜λŠ”λ° 만일 κ·Έ λ¬Έμž₯이 ν†΅μ§Έλ‘œ 검색이 λœλ‹€λ©΄ μΌμΉ˜ν•˜λŠ” 검색결과λ₯Ό μ°ΎκΈ° 맀우 μ–΄λ €μšΈ 것이닀.

κ·Έλž˜μ„œ 단어에 ν˜•νƒœμ†Œλ₯Ό λΆ„μ„ν•œλ‹€. 검색 μž˜ν•˜λŠ” 방법을 μž…λ ₯ν•˜λ©΄ 밑에 처럼 λ‚˜λˆ μ§€κ²Œ λœλ‹€.

검색
μž˜ν•˜λŠ”
방법

검색, μž˜ν•˜λŠ”, 방법을 ν•˜λ‚˜μ”© 역색인을 보고 μ°Ύμ•„ λ¬Έμ„œκ°€ λͺ‡λ²ˆμ§Έμ— μžˆλŠ”μ§€ μ•Œλ €μ€€λ‹€.


검색기 ν’ˆμ§ˆ

μ—¬κΈ°μ„œ ν’ˆμ§ˆμ΄λž€ λ‚΄κ°€ μ›ν•˜λŠ” 검색결과가 λ‚˜μ™”λŠ”μ§€, μ—‰λš±ν•œ 것이 κ²€μƒ‰κ²°κ³Όλ‘œ λ‚˜νƒ€λ‚˜λŠ”μ§€ λ“±μœΌλ‘œ 평가할 수 μžˆλ‹€.

κ²€μƒ‰μ—”μ§„μ˜ ν’ˆμ§ˆμ„ 높이기 μœ„ν•œ λ°©λ²•μœΌλ‘œ μ—¬λŸ¬κ°€μ§€ 방법이 μžˆλ‹€.

  • μœ μ‚¬λ„ 기반 검색 : 검색어와 ν‚€μ›Œλ“œλ“€κ°„μ˜ μœ μ‚¬λ„λ₯Ό μΆ•μ •ν•˜μ—¬ μƒμœ„ λ…ΈμΆœ
  • 인기도 기반 검색 : 자주 κ²€μƒ‰ν•˜λŠ” κ²°κ³Όλ₯Ό μƒμœ„ λ…ΈμΆœ
  • μ˜€νƒ€ μˆ˜μ • : 검색어λ₯Ό λΆ„μ„ν•˜μ—¬ μ˜λ―ΈμžˆλŠ” λ‹¨μ–΄λ‘œ μˆ˜μ •ν•˜μ—¬ 검색 (λ˜λŠ” μΆ”μ²œ)
  • 신뒰도 기반 검색 : 신뒰도 μžˆλŠ” μ‚¬μ΄νŠΈ μƒμœ„ λ…ΈμΆœ (단어 κ²€μƒ‰μ‹œ 사전을 μƒμœ„ λ…ΈμΆœ)
  • 검색결과 λ‚΄ μž¬κ²€μƒ‰ : κ²€μƒ‰λœ κ²°κ³Ό λ²”μœ„ λ‚΄μ—μ„œ μž¬κ²€μƒ‰

등등이 μžˆλŠ”λ° μœ μ‚¬λ„ 기반 κ²€μƒ‰λ§Œ μ‚΄νŽ΄λ³΄κ² λ‹€.


μœ μ‚¬λ„ 기반 κ²€μƒ‰μ΄λž€ λ‹¨μˆœνžˆ 맀칭된 결과만 λ³΄μ—¬μ£ΌλŠ” 것이 μ•„λ‹Œ μœ μ‚¬μ„±μ„ 띈 κ²°κ³Όλ₯Ό 보여주어야 ν•œλ‹€.

TF-IDFκ°€ 높은 단어듀끼리 묢으면 μœ μ‚¬λ„κ°€ λ†’λ‹€κ³  νŒλ‹¨

  • TF(Term Frequency)
    νŠΉμ • 단어가 λ¬Έμ„œ 내에 μ–Όλ§ˆλ‚˜ 자주 λ“±μž₯ν•˜λŠ”μ§€, λ†’μ„μˆ˜λ‘ λ¬Έμ„œμ—μ„œ μ€‘μš”

  • IDF(Inverse Document Frequency)
    νŠΉμ • 단어가 전체 λ¬Έμ„œμ—μ„œ μ–Όλ§ˆλ‚˜ 자주 λ“±μž₯ν•˜λŠ”μ§€μ˜ μ—­μˆ˜

  • TF-IDF
    νŠΉμ • 단어가 ν•΄λ‹Ή λ¬Έμ„œμ— 자주 λ‚˜νƒ€λ‚˜κ³  전체 μ€‘μ—μ„œλŠ” 적게 λ‚˜νƒ€λ‚œλ‹€.
    => ν•΄λ‹Ή λ¬Έμ„œμ™€ 연관도가 λ†’λ‹€


κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ 차이점

검색엔진을 μ„€λͺ…ν•  λ•Œ 항상 λΉ„κ΅λ˜λŠ” 것이 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(RDBMS)λ‹€.
두 κ°€μ§€ λͺ¨λ‘ μ§ˆμ˜μ™€ μΌμΉ˜ν•˜λŠ” 데이터λ₯Ό μ°Ύμ•„ μ‚¬μš©μžμ—κ²Œ μ œκ³΅ν•œλ‹€λŠ” μ μ—μ„œ μœ μ‚¬μ μ΄ 많기 λ•Œλ¬Έμ΄λ‹€.

ν•˜μ§€λ§Œ RDBMS둜 검색기λŠ₯을 μ œκ³΅ν•˜λŠ”λ°λŠ” λ§Žμ€ 문제점이 μžˆλ‹€.
RDBMSλŠ” λͺ¨λ“  λ°μ΄ν„°λŠ” 쀑볡을 μ œκ±°ν•˜κ³  μ •ν˜• λ°μ΄ν„°λ‘œ ꡬ쑰화해 ν–‰κ³Ό μ—΄λ‘œ κ΅¬μ„±λœ ν…Œμ΄λΈ”μ— μ €μž₯λœλ‹€.

그리고 SQL문을 μ΄μš©ν•΄ μ›ν•˜λŠ” μ •λ³΄μ˜ 검색이 κ°€λŠ₯ν•œλ° ν…μŠ€νŠΈ 맀칭을 ν†΅ν•œ λ‹¨μˆœν•œ κ²€μƒ‰λ§Œ κ°€λŠ₯ν•˜λ‹€.
ν…μŠ€νŠΈλ₯Ό μ—¬λŸ¬ λ‹¨μ–΄λ‘œ λ³€ν˜•ν•˜κ±°λ‚˜ μ—¬λŸ¬ 개의 λ™μ˜μ–΄λ‚˜ μœ μ˜μ–΄λ₯Ό ν™œμš©ν•œ 검색은 λΆˆκ°€λŠ₯ν•˜λ‹€.

반면 검색엔진은 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œλŠ” λΆˆκ°€λŠ₯ν•œ λΉ„μ •ν˜• 데이터λ₯Ό μƒ‰μΈν•˜κ³  검색할 수 μžˆλ‹€.
ν˜•νƒœμ†Œ 뢄석을 톡해 μ‚¬λžŒμ΄ κ΅¬μ‚¬ν•˜λŠ” μžμ—°μ–΄μ˜ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•΄μ§€κ³  역색인 ꡬ쑰λ₯Ό λ°”νƒ•μœΌλ‘œ λΉ λ₯Έ 검색 속도λ₯Ό 보μž₯ν•œλ‹€.

  • μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ™€ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ 비ꡐ
μ—˜λΌμŠ€ν‹±μ„œμΉ˜ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€
인덱슀 λ°μ΄ν„°λ² μ΄μŠ€
μƒ€λ“œ νŒŒν‹°μ…˜
νƒ€μž… ν…Œμ΄λΈ”
λ¬Έμ„œ ν–‰
ν•„λ“œ μ—΄
λ§€ν•‘ μŠ€ν‚€λ§ˆ
Query DSL SQL

  • μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ™€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μΆ”κ°€,μˆ˜μ •,μ‚­μ œ 방식 차이
μ—˜λΌμŠ€ν‹±μ„œμΉ˜ HTTP λ©”μ„œλ“œ κΈ°λŠ₯ λ°μ΄ν„°λ² μ΄μŠ€ 질의 문법
GET 데이터 쑰회 SELECT
PUT 데이터 생성 INSERT
POST 인덱슀 μ—…λ°μ΄νŠΈ, 데이터 쑰회 UPDATE, SELECT
DELETE 데이터 μ‚­μ œ DELETE
HEAD 인덱슀의 정보 확인 -

μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ˜ μž₯점

μ˜€ν”ˆμ†ŒμŠ€ 검색엔진

루씬을 기반으둜 개발된 μ˜€ν”ˆμ†ŒμŠ€ 검색엔진이닀. λ”°λΌμ„œ μ „ μ„Έκ³„μ—μ„œ μˆ˜λ§Žμ€ μ‚¬λžŒλ“€μ΄ μ‚¬μš©ν•˜κ³  있으며, 버그가 λ°œμƒν•  경우 λŒ€λΆ€λΆ„ λΉ λ₯΄κ²Œ ν•΄κ²°λœλ‹€.

μ „λ¬Έ 검색

PostgreSQL, MongoDB같은 λŒ€λΆ€λΆ„μ˜ λ°μ΄ν„°λ² μ΄μŠ€λŠ” κΈ°λ³Έ 쿼리 및 색인 ꡬ쑰의 ν•œκ³„λ‘œ 인해 기본적인 ν…μŠ€νŠΈ 검색 κΈ°λŠ₯만 μ œκ³΅ν•œλ‹€.
ν•˜μ§€λ§Œ μ—˜λΌμŠ€ν‹±μ„œμΉ˜λŠ” μ’€ 더 고차원적인 전문검색(Full Text)이 κ°€λŠ₯ν•˜λ‹€.
μ „λ¬Έκ²€μƒ‰μ΄λž€ λ‚΄μš© 전체λ₯Ό μƒ‰μΈν•΄μ„œ νŠΉμ • 단어가 ν¬ν•¨λœ λ¬Έμ„œλ₯Ό κ²€μƒ‰ν•˜λŠ” 것을 λ§ν•œλ‹€. κΈ°μ‘΄ κ΄€κ³„ν˜•λ°μ΄ν„°λ² μ΄μŠ€λŠ” 전문검색에 μ ν•©ν•˜μ§€ μ•Šμ§€λ§Œ μ—˜λΌμŠ€ν‹±μ„œμΉ˜λŠ” λ‹€μ–‘ν•œ κΈ°λŠ₯별, 언어별 ν”ŒλŸ¬κ·ΈμΈμ„ μ‘°ν•©ν•΄ λΉ λ₯΄κ²Œ 검색할 수 μžˆλ‹€.

톡계뢄석

λΉ„μ •ν˜• 둜그 데이터λ₯Ό μˆ˜μ§‘ν•˜κ³  ν•œκ³³μ— λͺ¨μ•„ 톡계 뢄석을 ν•  수 μžˆλ‹€.
μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ™€ ν‚€λ°”λ‚˜λ₯Ό μ—°κ²°ν•˜λ©΄ μ‹€μ‹œκ°„μœΌλ‘œ μŒ“μ΄λŠ” 둜그λ₯Ό μ‹œκ°ν™”ν•˜κ³  뢄석할 수 μžˆλ‹€.

μŠ€ν‚€λ§ˆλ¦¬μŠ€

λ°μ΄ν„°λ² μ΄μŠ€λŠ” μŠ€ν‚€λ§ˆλΌλŠ” ꡬ쑰에 따라 데이터λ₯Ό μ ν•©ν•œ ν˜•νƒœλ‘œ λ³€κ²½ν•΄μ„œ μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•œλ‹€. 반면 μ—˜λΌμŠ€ν‹±μ„œμΉ˜λŠ” μ •ν˜•ν™”λ˜μ§€ μ•Šμ€ λ‹€μ–‘ν•œ ν˜•νƒœμ˜ λ¬Έμ„œλ„ μžλ™μœΌλ‘œ μƒ‰μΈν•˜κ³  검색할 수 μžˆλ‹€.

RESTful API

μ—˜λΌμŠ€ν‹±μ„œμΉ˜λŠ” HTTP 기반의 RESTful APIλ₯Ό μ§€μ›ν•˜κ³  μš”μ²­λΏ μ•„λ‹ˆλΌ 응닡에도 JSON ν˜•μ‹μ„ μ‚¬μš©ν•΄ μ‹œμŠ€ν…œμ— 관계없이 이기쒅 ν”Œλž«νΌμ—μ„œλ„ 이용 κ°€λŠ₯ν•˜λ‹€.

λ©€ν‹°ν…Œλ„Œμ‹œ (Multi-tenancy)

μ„œλ‘œ μƒμ΄ν•œ μΈλ±μŠ€μΌμ§€λΌλ„ 검색할 ν•„λ“œλͺ…λ§Œ κ°™μœΌλ©΄ μ—¬λŸ¬κ°œμ˜ 인덱슀λ₯Ό ν•œλ²ˆμ— μ‘°νšŒν•  수 μžˆλ‹€.
이λ₯Ό μ΄μš©ν•΄ λ©€ν‹°ν…Œλ„Œμ‹œ κΈ°λŠ₯을 μ œκ³΅ν•  수 μžˆλ‹€.

λ©€ν‹°ν…Œλ„Œμ‹œ
ν•˜λ‚˜μ˜ μ†Œν”„νŠΈμ›¨μ–΄λ‚˜ μΈμŠ€ν„΄μŠ€κ°€ μ—¬λŸ¬ μ‚¬μš©μž ν˜Ήμ€ μ‚¬μš©μž 그룹을 μœ„ν•΄ μž‘λ™ν•˜λŠ” μ•„ν‚€ν…μ²˜λΌκ³  ν•œλ‹€.
μ°Έκ³  : https://sdesigner.tistory.com/119

Document-Oriented

μ—¬λŸ¬ κ³„μΈ΅μ˜ 데이터λ₯Ό JSON ν˜•μ‹μ˜ κ΅¬μ‘°ν™”λœ λ¬Έμ„œλ‘œ μΈλ±μŠ€μ— μ €μž₯ κ°€λŠ₯ν•˜λ‹€. 계측 ꡬ쑰둜 λ¬Έμ„œλ„ ν•œλ²ˆμ˜ 쿼리둜 μ‰½κ²Œ 쑰회 κ°€λŠ₯ν•˜λ‹€.

역색인

MongoDB, μΉ΄μ‚°λ“œλΌ 같은 일반적인 NoSQL은 역색인을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.

ν™•μž₯μ„±κ³Ό κ°€μš©μ„±

λΆ„μ‚° μ‹œμŠ€ν…œ κ΅¬μ„±μœΌλ‘œ 병렬적인 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€. λΆ„μ‚° ν™˜κ²½μ—μ„œλŠ” 데이터가 μƒ€λ“œ(Shard) λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ μ œκ³΅λœλ‹€.
인덱슀 μƒμ„±μ‹œλ§ˆλ‹€ μƒ€λ“œμ˜ 수 쑰정이 κ°€λŠ₯ν•˜λ‹€. λ°μ΄ν„°μ˜ μ’…λ₯˜μ™€ 성격에 따라 데이터λ₯Ό λΆ„μ‚°ν•˜μ—¬ λΉ λ₯΄κ²Œ 처리 κ°€λŠ₯ν•˜λ‹€.


μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ˜ 단점

μ‹€μ‹œκ°„(Real Time) μ²˜λ¦¬λŠ” λΆˆκ°€λŠ₯ν•˜λ‹€.

μƒ‰μΈλœ λ°μ΄ν„°λŠ” 1초 λ’€μ—λ‚˜ 검색이 κ°€λŠ₯ν•˜λ‹€. μ™œλƒν•˜λ©΄ μƒ‰μΈλœ 데이터가 λ‚΄λΆ€μ μœΌλ‘œ 컀밋(Commit)κ³Ό ν”ŒλŸ¬μ‹œ(Flush)와 같은 과정을 거치기 λ•Œλ¬Έμ΄λ‹€.
κ·Έλž˜μ„œ μ—˜λΌμŠ€ν‹±μ„œμΉ˜ 곡식 ν™ˆνŽ˜μ΄μ§€μ—μ„œλ„ NRT(Near Real Time)λΌλŠ” ν‘œν˜„μ„ μ“΄λ‹€.

elasticsearch NRT, refresh
μ°Έκ³  : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=parkjy76&logNo=221062928230

νŠΈλžœμž­μ…˜(Transaction) λ‘€λ°±(Rollback) λ“±μ˜ κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.

λΆ„μ‚° μ‹œμŠ€ν…œ κ΅¬μ„±μ˜ νŠΉμ§• λ•Œλ¬Έμ—, μ‹œμŠ€ν…œμ μœΌλ‘œ λΉ„μš© μ†Œλͺ¨κ°€ 큰 λ‘€λ°±, νŠΈλžœμž­μ…˜μ„ μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. κ·Έλž˜μ„œ 데이터 관리에 μœ μ˜ν•΄μ•Ό ν•œλ‹€.
=> 보톡 전에 μ‚¬μš©ν•˜λ˜ 인덱슀λ₯Ό λ°±μ—…μš©μœΌλ‘œ μ €μž₯ν•˜κ³  μžˆλŠ”λ‹€.

μ§„μ •ν•œ 의미의 μ—…λ°μ΄νŠΈ(Update)λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ—λŠ” λ¬Όλ‘  μ—…λ°μ΄νŠΈ λͺ…령이 μžˆμŠ΅λ‹ˆλ‹€λ§Œ, μ‹€μ œλ‘œλŠ” 데이터λ₯Ό μ‚­μ œν–ˆλ‹€κ°€ λ‹€μ‹œ λ§Œλ“œλŠ” κ³Όμ •μœΌλ‘œ μ—…λ°μ΄νŠΈλœλ‹€.
μ΄λŸ¬ν•œ νŠΉμ„±μ€ λ‚˜μ€‘μ— λΆˆλ³€μ„±(Immutable)μ΄λΌλŠ” 이점을 μ œκ³΅ν•˜κΈ°λ„ ν•œλ‹€.


μ—˜λΌμŠ€ν‹±μ„œμΉ˜ μ£Όμš” μš©μ–΄

image

Cluster

ν΄λŸ¬μŠ€ν„°λž€ Elasticsearchμ—μ„œ κ°€μž₯ 큰 λ‹¨μœ„μ΄λ‹€. ν•˜λ‚˜ μ΄μƒμ˜ λ…Έλ“œλ‘œ 이루어진 λ…Έλ“œλ“€μ˜ 집합이닀. ν΄λŸ¬μŠ€ν„°λŠ” λ…λ¦½μ μœΌλ‘œ μ„œλ‘œ λ‹€λ₯Έ ν΄λŸ¬μŠ€ν„°μ— 접근을 ν•  수 μ—†λŠ” ꡬ쑰이닀.
μ—¬λŸ¬ λŒ€μ˜ μ„œλ²„κ°€ ν•˜λ‚˜μ˜ ν΄λŸ¬μŠ€ν„°λ₯Ό ꡬ성할 수 있고, ν•œ μ„œλ²„μ— μ—¬λŸ¬κ°œμ˜ ν΄λŸ¬μŠ€ν„°κ°€ μ‘΄μž¬ν•  수 μžˆμ–΄ μ‚¬μš©μžκ°€ ν™˜κ²½μ— 맞게 μ„€μ • ν•  수 μžˆλ‹€.

Node

λ…Έλ“œλŠ” ν΄λŸ¬μŠ€ν„°λ₯Ό μ΄λ£¨λŠ” μš”μ†Œμ΄λ‹€. λ…Έλ“œλŠ” μ—˜λΌμŠ€ν‹±μ„œμΉ˜λ₯Ό κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ™€λŠ” λ‹€λ₯΄κ²Œ λ§Œλ“€μ–΄μ€€λ‹€.
κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” ν•˜λ‚˜μ˜ μ„œλ²„μ—μ„œ 수직적으둜 데이터가 μ»€μ§€λŠ” 반면, μ—¬λŸ¬κ°œμ˜ λ…Έλ“œλ‘œ κ΅¬μ„±λœ μ—˜λΌμŠ€ν‹±μ„œμΉ˜ μ„œλ²„λŠ” μ–΄λŠμ •λ„ μˆ˜ν‰μ μœΌλ‘œ 데이터가 컀질 수 μžˆλ‹€. μ΄λ ‡κ²Œ μˆ˜ν‰μ μœΌλ‘œ 데이터가 μ»€μ§€λŠ” νŠΉμ„±μ€ μ—˜λΌμŠ€ν‹±μ„œμΉ˜κ°€ λŒ€μš©λŸ‰ 데이터 처리λ₯Ό ν•  수 있게 ν•΄μ€€λ‹€.

λ…Έλ“œμ— μ’…λ₯˜λŠ” μ—¬λŸ¬κ°€μ§€κ°€ μžˆλ‹€.

  • λ§ˆμŠ€ν„° λ…Έλ“œ (Master Node)
    ν΄λŸ¬μŠ€ν„° λ‚΄μ—μ„œ λ™μž‘ν•˜λŠ” λ…Έλ“œλ“€μ„ 관리, μƒ€λ“œ μœ„μΉ˜ 정보 등을 포함

  • 데이터 λ…Έλ“œ (Data Node)
    μ‹€μ œ 데이터가 μ €μž₯λ˜λŠ” λ…Έλ“œ CRUD, 검색, 집계 연산등이 μ§„ν–‰λ˜κΈ° λ•Œλ¬Έμ— μžμ›μ„ λ§Žμ΄μ‚¬μš©ν•œλ‹€. image

  • μ½”λ””λ„€μ΄νŒ… λ…Έλ“œ (Coordinating Node)
    κ²€μƒ‰μ‹œ 데이터 λ…Έλ“œμ—μ„œλŠ” search만 ν•˜κ³  Aggregation μž‘μ—…μ€ μ½”λ””λ„€μ΄νŒ… λ…Έλ“œμ—μ„œ ν•œλ‹€. image

  • 인제슀트 λ…Έλ“œ (Ingest Node)
    λ“€μ–΄μ˜€λŠ” 데이터λ₯Ό μ „μ²˜λ¦¬λ₯Ό 톡해 μ›ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” λ…Έλ“œ, 데이터가 λ§Žλ‹€λ©΄ μ„±λŠ₯ν–₯상에 도움 image

λ…Έλ“œ μ„€μ • 및 이해
μ°Έκ³  : https://esbook.kimjmin.net/03-cluster/3.3-master-and-data-nodes

Index (= λ°μ΄ν„°λ² μ΄μŠ€)

데이터 μ €μž₯ 곡간
ν•˜λ‚˜μ˜ λ¬Όλ¦¬λ…Έλ“œμ— μ—¬λŸ¬κ°œ 논리 인덱슀 생성
ν•˜λ‚˜μ˜ μΈλ±μŠ€κ°€ μ—¬λŸ¬ λ…Έλ“œμ— λΆ„μ‚° μ €μž₯

Shard (= νŒŒν‹°μ…˜)

인덱슀 λ‚΄λΆ€μ—λŠ” μƒ‰μΈλœ 데이터듀이 μžˆλ‹€. 이 μƒ‰μΈλœ 데이터듀은 ν•˜λ‚˜μ˜ λ­‰μΉ˜λ‘œ μ‘΄μž¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ,
물리적 곡간에 μ—¬λŸ¬κ°œμ˜ λΆ€λΆ„λ“€λ‘œ μ‘΄μž¬ν•œλ‹€. 이 뢀뢄듀을 μƒ€λ“œλΌκ³  ν•œλ‹€.
프라이머리 μƒ€λ“œμ™€ λ ˆν”Œλ¦¬μΉ΄ μƒ€λ“œλ‘œ κ΅¬λΆ„λ˜λŠ”λ°, 프라이머리 μƒ€λ“œλŠ” 말 κ·ΈλŒ€λ‘œ λ°μ΄ν„°μ˜ 원본과 같이 보면되고, λ ˆν”Œλ¦¬μΉ΄ μƒ€λ“œλŠ” 프라이머리 μƒ€λ“œμ˜ 볡제본으둜 λ³΄λ©΄λœλ‹€.

image

2개 λ…Έλ“œ, 4개 프라이머리 μƒ€λ“œ, 1개 Replica μƒ€λ“œ

Type (= ν…Œμ΄λΈ”)

인덱슀 ν•˜λ‚˜ λ‹Ή ν•˜λ‚˜μ˜ νƒ€μž…μ„ κ°–κ²Œλœ μ§€κΈˆ, νƒ€μž…μ€ ν˜„μž¬ μ»€λ‹€λž€ μ˜λ―Έκ°€ μ—†λ‹€.
μ—˜λΌμŠ€ν‹±μ„œμΉ˜ 7.0μ—μ„œλŠ” νƒ€μž…μ€ μ™„μ „νžˆ μ‚¬λΌμ‘Œλ‹€.

Document (= ν–‰)

λ¬Έμ„œλŠ” μ—˜λΌμŠ€ν‹± λ°μ΄ν„°μ˜ μ΅œμ†Œ λ‹¨μœ„μ΄λ©°, JSON Object ν•˜λ‚˜μ΄λ‹€.
κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ ν…Œμ΄λΈ”μ˜ 행에 ν•΄λ‹Ήν•œλ‹€.

Field (= μ—΄)

λ¬Έμ„œμ— λ“€μ–΄κ°€λŠ” λ°μ΄ν„°μ˜ νƒ€μž…μ„ μ •μ˜ν•œλ‹€.
κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ—΄κ³Ό λΉ„μŠ·ν•˜μ§€λ§Œ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ˜ 열은 μ’€ 더 정적인 반면 μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ˜ ν•„λ“œλŠ” 쑰금 더 동적이닀.

Mapping (= μŠ€ν‚€λ§ˆ)

맀핑은 λ¬Έμ„œμ™€ 데이터λ₯Ό κ°€μ§€κ³  μžˆλŠ” ν•„λ“œκ°€ μ–΄λ–»κ²Œ μ €μž₯되고 색인될지에 λŒ€ν•œ ν”„λ‘œμ„ΈμŠ€μ΄λ‹€. ν•„λ“œμ™€ ν•„λ“œμ˜ 속성을 μ •μ˜ν•˜κ³  색인 방법을 μ •μ˜ν•œλ‹€. 맀핑정보에 μ—¬λŸ¬κ°€μ§€ 데이터 νƒ€μž… 지정이 κ°€λŠ₯ν•˜μ§€λ§Œ, ν•„λ“œλͺ… μžμ²΄λŠ” 쀑볡이 λΆˆκ°€λŠ₯ν•˜λ‹€.


μ—˜λΌμŠ€ν‹±μ„œμΉ˜ μ£Όμš” API

λŒ€ν‘œμ μœΌλ‘œ 4κ°€μ§€ APIκ°€ μ‘΄μž¬ν•œλ‹€.

  1. 인덱슀 관리 API (Indices API)
  2. λ¬Έμ„œ 관리 API (Document API)
  3. 검색 API (Search API)
  4. 집계 API (Aggregation API)

λͺ¨λ“  APIλŠ” HTTP 톡신을 μ΄μš©ν•˜μ—¬ RESTfulν•˜κ²Œ μ‚¬μš©κ°€λŠ₯ν•˜λ‹€.

인덱슀 관리 API

인덱슀 생성

인덱슀λ₯Ό 생성할 λ•ŒλŠ” λ§€ν•‘(Mapping)을 μ΄μš©ν•˜μ—¬ λ¬Έμ„œμ— ν¬ν•¨λœ ν•„λ“œ 및 ν•„λ“œ νƒ€μž…λ“±μ„ μ„€μ • κ°€λŠ₯ν•˜λ‹€.

단, 주의 ν•  점은 일단 맀핑정보가 ν•œλ²ˆ μƒμ„±λ˜λ©΄, 변경이 λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 점이닀. 잘λͺ» μƒμ„±ν–ˆκ±°λ‚˜ λ³€κ²½ν•΄μ•Ό ν•  κ²½μš°μ—λŠ” 데이터λ₯Ό μ‚­μ œν•˜κ³  μž¬μƒ‰μΈ 과정을 거쳐야 ν•œλ‹€.

인덱슀 생성은 μ•„λž˜μ™€ 같이 PUT λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•œλ‹€.

image

인덱슀 μ‚­μ œ

인덱슀 μ‚­μ œλŠ” DELETE λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜κ³  μ·¨μ†Œκ°€ λΆˆκ°€λŠ₯ν•˜λ‹€.

image

λ¬Έμ„œ 관리 API

λ¬Έμ„œ 생성

POST λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜κ³ , /μΈλ±μŠ€μ΄λ¦„/_doc/λ¬Έμ„œid 순으둜 μž…λ ₯ν•˜λ©΄ λœλ‹€.
뒀에 λ¬Έμ„œid 뢀뢄을 μž…λ ₯ν•˜μ§€ μ•Šμ„ κ²½μš°μ—λŠ” λ¬΄μž‘μœ„ 값이 λ“€μ–΄κ°„λ‹€.

image

λ¬Έμ„œ 쑰회

λ¬Έμ„œ μ‘°νšŒλŠ” GET λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜κ³  λ¬Έμ„œ 생성 ν˜•μ‹κ³Ό λ™μΌν•˜λ‹€.

image

λ¬Έμ„œ μ‚­μ œ

λ¬Έμ„œ μ‚­μ œλŠ” DELETE λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜κ³  λ¬Έμ„œ 생성 ν˜•μ‹κ³Ό λ™μΌν•˜λ‹€.

image

검색 API

검색 API의 μž‘λ™μ—λŠ” 두 κ°€μ§€ 방식이 μ‘΄μž¬ν•œλ‹€.

  1. URI ν˜•νƒœμ˜ 방식
  2. RESTful API 방식인 QueryDSL을 μ‚¬μš©ν•˜μ—¬ Request Body에 λ‚΄μš©μ„ μΆ”κ°€ν•˜μ—¬ κ²€μƒ‰ν•˜λŠ” 방식

일반적으둜 2번 방식을 더 많이 μ‚¬μš©ν•˜λŠ”λ°, λ‘˜μ„ μ„žμ–΄μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

image

QueryDSL
μ°Έκ³  : https://victorydntmd.tistory.com/314

집계 API

데이터 집계 νƒ€μž…

  1. 버킷 집계 (Bucket Aggregation)
    • λ¬Έμ„œμ˜ ν•„λ“œ κΈ°μ€€μœΌλ‘œ 버킷을 μ§‘κ³„ν•œλ‹€.
  2. 맀트릭 집계 (Metric Aggregation)
    • λ¬Έμ„œμ—μ„œ μΆ”μΆœλœ 값을 μ΄μš©ν•˜μ—¬ 합계, μ΅œλŒ€κ°’, μ΅œμ†Œκ°’, 평균값 등을 κ³„μ‚°ν•œλ‹€.
  3. 맀트릭슀 집계 (Metrix Aggregation)
    • ν–‰λ ¬ 값을 ν•©ν•˜κ±°λ‚˜ κ³±ν•œλ‹€.
  4. νŒŒμ΄ν”„λΌμΈ 집계 (Pipeline Aggregation)
    • 일반적 νŒŒμ΄ν”„ 라인의 κ°œλ…μœΌλ‘œ 집계에 μ˜ν•΄ μƒμ„±λœ 집계 κ²°κ³Όλ₯Ό μ΄μš©ν•΄ 또 λ‹€μ‹œ μ§‘κ³„ν•œλ‹€.

λ‚΄μš©μ΄ 많고 μ–΄λ €μ›Œ μžμ„Έν•œ λ‚΄μš©μ€ 닀루지 μ•Šκ² μŠ΅λ‹ˆλ‹€.
μ°Έκ³  : https://coding-start.tistory.com/289



Reference

μ—˜λΌμŠ€ν‹±μ„œμΉ˜ μ‹€λ¬΄κ°€μ΄λ“œ

μ—˜λΌμŠ€ν‹±μ„œμΉ˜ μ•Œμ•„λ³΄κΈ°1

μ—˜λΌμŠ€ν‹±μ„œμΉ˜ μ•Œμ•„λ³΄κΈ°2

μ—˜λΌμŠ€ν‹±μ„œμΉ˜ μ•Œμ•„λ³΄κΈ°3

μ—˜λΌμŠ€ν‹±μ„œμΉ˜ μ•Œμ•„λ³΄κΈ°4

https://jaemunbro.medium.com/elastic-search-%EA%B8%B0%EC%B4%88-%EC%8A%A4%ED%84%B0%EB%94%94-ff01870094f0

https://velog.io/@dhjung/2.-Elasticsearch-%EA%B5%AC%EC%A1%B0