본문 바로가기
프로그래밍/홈페이지 제작기

[엘라스틱서치(elastic Search)]엘라스틱서치가 뭔데?

by Mr.noobiest 2022. 6. 13.

 

 

보통 DB를 구성할때 특정 인덱스 or ID를 지정하여 DB를 구성하고 각각의 PK를 사용하여 연관지어서 DB를 구성한다

 

예를 들어 "People"테이블에는 아래와  같이 구성하고

ID Name Client_ID
20220606_00001 이인호 sdjklajsdklajs
20220606_00002 강영철 qwlkjkalsn2
20220606_00003 심영래 glkjvjz2
20220606_00004 김송해 llgjejfnkl
20220606_00005 민호진 ovmpmq2
20220606_00006 최중열 ymtmot2
20220606_00007 서지수 mqkwln

각 ID에 해당하는 "People Detail 상세 정보" 테이블을 별도로 구성 관리한다.

ID 구매 내역 가입일
20220606_00001 B_20220702133302 2022-06-06-12:31
20220606_00002 S_20220403123201 2022-06-06-12:43
20220606_00003 B_20220615061202 2022-06-06-14:39
20220606_00004 S_20220403123232 2022-06-06-14:42
20220606_00005 B_20220802133302 2022-06-06-15:22
20220606_00006 S_20220403123201 2022-06-06-18:44
20220606_00007 B_20220702133302 2022-06-06-20:13

 

이러한 데이터 베이스를 관계형 데이터 베이스라고 하는데(SQL / RDB) 거의 모든 DB의 표준이라고 보면된다.

 

그런데 최근에는 이러한 관계형 데이터베이스가  아닌 JSON형태의 DB의 사용이 증가하는 추세인데 이를  비관계형 데이터 베이스

NoSQL이라고 한다.

 

관계형과 비관계형의 가장 큰 차이점이라면

관계형 데이터베이스는  각각의 정보를 분리 관리하며, 해당 정보를 조회/수정할때 JOIN을 사용하여 "분리되어 있는 각각의 테이블"에서 데이터를 조합하여 사용한다는 것이고,

 

비관계형 데이터베이스는 1개의 JSON에 모든 정보를 일괄 기입하여  관리한다는 점이 다르다.

NoSQL 예시

{

    "ID" : "20220606_00001",

    "Name": "이인호",

    "Client_ID":"sdjklajsdklajs",

    "구매 내역" : "B_20220702133302",

    "가입일":"2022-06-06-12:31"

}

 

왜 제목은 엘라스틱서치인데 갑자기 SQL vs NoSQL이냐면,

 

기존의 검색엔진은 SQL문을 사용하여 Where 혹은 Join을 적절히 활요하여 정보를 조회하는 방법이였는데

이  방법의 최대 단점은 검색하고자하는 값의 테이블의 정보를 모두 검색하고 그중 원하는 정보를 찾는것이라

리소스  낭비가 많다는  점이다.

ex) where People.Name=="이인호"(이름이 이인호인 사람의 정보를 찾고자  한다면)

id Name Client_ID Where Name=="이인호"
20220606_00001 이인호 sdjklajsdklajs TRUE
20220606_00002 강영철 qwlkjkalsn2 FALSE
20220606_00003 심영래 glkjvjz2 FALSE
20220606_00004 김송해 llgjejfnkl FALSE
20220606_00005 민호진 ovmpmq2 FALSE
20220606_00006 최중열 ymtmot2 FALSE
20220606_00007 서지수 mqkwln FALSE

 

이렇게 모든 Name을 검색해야한다  == 모든 테이블의 데이터를 조회해야한다. == 리소스 낭비 심함

만약 위의 데이터베이스가 엄청난 크기의 빅데이터라면 속도가 매우 느려질 것이다.

 

 

이러한 불필요한 정보 조회를 최소화하기 위해서 인덱싱을 사용하는데 이러한 작업을 엘라스틱서치에서는 기본적으로 지원해준다

위와 동일한 검색을 실행할때 엘라스틱서치에서는 "역색인"을 사용한다.

ex)

doc_name:People_1

{

    "ID" : "20220606_00001",

    "Name": "이인호",

    "Client_ID":"sdjklajsdklajs",

    "구매 내역" : "B_20220702133302",

    "가입일":"2022-06-06-12:31"

}

 

1) "Name"=="이인호"   

2) 엘라스틱 서치  : "이인호는 doc_name이 People_1에만 있음"

3) People_1의 정보만 보면 되겠구나?!

4) People_1의 데이터만 조회

 

이런식이다. 즉, 기존의 인덱싱 DB의 장점만을 가지고 온 검색 엔진인것이다.

 

근데 왜 관계형 데이터베이스를 사용하느냐?

 

엘라스틱서치에도 단점이 있는데, 각 doc간의 Join이 불가능하다.

SQL는 JOIN을 통해 1개의  SQL문으로 각 테이블의  정보를 빠르게 검색이 가능하지만,

엘라스틱서치는 JOIN이 불가능하여 여러개의  검색문이 필요하다.

 

즉, DB의 구성은 RDB로 구성하고 엘라스틱서치는  검색 엔진으로 사용하는게 가장 적절하다고 생각된다.

 

 

 

 

 

 

라고 나는 이해했다.

728x90
반응형