Elastic Search 란 ?

ES

ElastciSearch 는 Lucene 기반의 Java 오픈 소스 분산 검색 엔진

→ 자체적으로 검색 엔진이라고 하긴 좀 그렇고 프로그램으로 검색엔진 !

→ 실질적으로 작동하는 검색 엔진은 Lucene

모든 데이터를 색인하여 저장하고 검색, 집계 등을 수행하며 결과를 클라이언트 또는 다른 프로그램으로 전달하여 동작하도록 함

검색을 위해 단독으로 사용하기도 하지만 ELK 스택으로 사용되기도 함

ELK

  • LogStash : 다양한 소스( DB, csv파일 등 )의 로그 또는 트랜잭션 데이터를 수집, 집계, 파싱하여 Elasticsearch로 전달 → 수집
  • Elasticsearch : Logstash로부터 받은 데이터를 검색 및 집계를 하여 필요한 관심 있는 정보를 획득 → 분석 , 저장
  • Kibana : Elasticsearch의 빠른 검색을 통해 데이터를 시각화 및 모니터링 → 시각화

img

ElasitcSearch vs RDBMS

RDBMS ES
schema mapping
Database index
table type
row document
Column Field

ElasticSearch 아키텍쳐 / 용어 정리

img

1) 클러스터( cluseter )

클러스터란 Elasticsearch에서 가장 큰 시스템 단위를 의미하며, 최소 하나 이상의 노드로 이루어진 노드들의 집합

서로 다른 클러스터는 데이터의 접근, 교환을 할 수 없는 독립적인 시스템으로 유지

여러 대의 서버가 하나의 클러스터를 구성할 수 있고, 한 서버에 여러 개의 클러스터가 존재 할 수 있음

2) 노드( node )

Elasticsearch를 구성하는 하나의 단위 프로세스를 의미

shard 로 구성됨

그 역할에 따라 Master-eligible, Data, Ingest, Tribe 노드로 구분

**3) 인덱스( index ) **

Elasticsearch에서 index는 RDBMS에서 database와 대응하는 개념

4) 샤드( Shard ) / 복제( Replica )

샤딩( sharding )은 데이터를 분산해서 저장하는 방법을 의미합니다.

즉, Elasticsearch에서 스케일 아웃을 위해 index를 여러 shard로 쪼갠 것입니다.

기본적으로 1개가 존재하며, 검색 성능 향상을 위해 클러스터의 샤드 갯수를 조정하는 튜닝을 하기도 함

replica는 또 다른 형태의 shard라고 할 수 있음

노드를 손실했을 경우 데이터의 신뢰성을 위해 샤드들을 복제하는 것 따라서 replica는 서로 다른 노드에 존재할 것을 권장합니다.

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=http%3A%2F%2Fcfile29.uf.tistory.com%2Fimage%2F991563425C98CB341A49D4

=> Cluster 은 node 들의 집합, node 들은 shard 로 구성, 데이터는 shard로 분산되어 저장

Elasticsearch 특징

  • Scale out

    • 샤드를 통해 규모가 수평적으로 늘어날 수 있음
  • 고가용성

    • Replica를 통해 데이터의 안정성을 보장
  • Schema Free

    • Json 문서를 통해 데이터 검색을 수행하므로 스키마 개념이 없음
  • Restful

역색인(inverted index)

책에서 맨 앞에 볼 수 있는 목차가 index

책 맨뒤에 키워드마다 찾아보기가 inverted index

RDBMS

ID Text
1 I have a pen
2 I am pen

ES

Term ID
I 1,2
have 1
am 2
a 1
pen 1,2

Query DSL

Query Context vs Filter Context

Query

이 문서가 이 쿼리절과 얼마나 잘 일치합니까 ? 라는 질문에 대답

얼마나 잘 일치하는 지를 _score 로 표현

Filter

이 문서가 이 쿼리절과 일치합니까? 라는 질문에 대답

score 을 계산하지 않고 간단하게 true/false 로 리턴

자동으로 캐싱되어 성능을 높임

풀 텍스트 쿼리

match_all

별다른 조건 없이 해당 인덱스의 모든 도큐먼트를 검색하는 쿼리

GET index명/_search
{
  "query":{
    "match_all":{ }
  }
}
match

풀 텍스트 검색에 사용되는 가장 일반적인 쿼리

여러 개의 검색어를 집어넣게 되면 디폴트로 OR 조건으로 검색

검색어가 여럿일 때 검색 조건을 OR 가 아닌 AND 로 바꾸려면 operator 옵션을 사용

GET index명/_search
{
  "query": {
    "match": {
      "message": {
        "query": "quick dog",
        "operator": "and"
      }
    }
  }
}
match_phrase

공백을 포함해 정확히 일치하는 내용을 검색

GET index명/_search
{
  "query": {
    "match_phrase": {
      "message": "lazy dog"
    }
  }
}
term

색인이 나눠지면서 형태소로 나눠지는 토큰등을 term 이라고 함

주어진 내용과 정확히 일치하는 내용을 검색

GET index명/_search
{
  "query": {
    "term": {
      "message": "lazy dog"
    }
  }
}
terms

여러개 토큰을 검색할 수 있음

GET index명/_search
{
  "query": {
    "term": {
      "message": ["lazy", "dog"]
    }
  }
}

match vs term

여러 개의 물건들 - (형태소 분석기) -> 여러 / 개 / 물건 / 물건들

term : 형태소 분석에 의해 쪼개진 토큰을 기반으로 작동

EX ) 여러 -> 검색 O , 여러개 -> 검색 X

match : 형태소 분석에 의해 쪼개진 토큰들을 기반으로 작동하지만 주어진 질의로 형태소 분기를 거쳐 쪼갠 다음 조회

EX ) 여러개 -> 여러 / 개 -> or 로 조회 -> 검색 O

Bool 복합 쿼리

: bool(true/false) 로직을 사용하는 쿼리

GET index명/_search
{
  "query": {
    "bool": {
      "must": [
        { <쿼리> }, …
      ],
      "must_not": [
        { <쿼리> }, …
      ],
      "should": [
        { <쿼리> }, …
      ],
      "filter": [
        { <쿼리> }, …
      ]
    }
  }
}
must

쿼리가 참인 도큐먼트들을 검색

must_not

쿼리가 거짓인 도큐먼트들을 검색

should

검색 결과 중 이 쿼리에 해당하는 도큐먼트의 점수를 높임

filter

쿼리가 참인 도큐먼트를 검색하지만 스코어를 계산하지 않음

must 보다 검색 속도가 빠르고 캐싱이 가능

레퍼런스

🙈[Elasticsearch] 기본 개념잡기🐵

6.1 역 인덱스 - Inverted Index

Elasticsearch 질의 DSL 정리

🙈Elasticsearch] 입문하기(4) - 다양한 검색 방법 ( Query DSL )🐵

[Elasticsearch] DSL 살펴보기