IT/Elasticsearch

Elastic Search 기본 개념 및 차이점

준나이 2021. 4. 19. 13:06

검색엔진

  • ES는 기본적으로검색엔진이다.
  • 기본 DB와 가장 다른점은 쿼리이후 결과값이(document = row)마다 쿼리의 조건문과 얼마나 적합한지를 나타내는 score를 얻을 수 있다.
  • 즉 단순히 조건절에 의해 True(1)/False(0)에 해당하는 결과값만 취하는게 아니라 각 결과값마다 유사한 정도(relevance score, 0.9 / 0.2)를 뽑아낼 수 있다.
  • 참고 : 검색엔진은 주로 텍스트를 많이 담고 있어서 “검색어“가 document와 비슷한지 보여주는 것은 매우 중요한 ㅣㄹ이다.

(참고) 분산 저장 및 처리 방식

score vs. filter

  • query를 날리다 보면 score를 항상 필요로 하지 않는 경우도 존재한다.
    • score는 필요하지 않고 filter만 필요한 경우 :고객의 성별과 연령대(filter)를 가져오는 경우
    • score와 filter가 동시에 필요한 경우 :고객의 성별과 연령대가 선호하는 아이템 중(filter)에서가장 적합한 상품(score)을 가져오는 경우
    • 참고 : 또한, score를 요구하는 연산은 기본적으로 complexity가 높고, 캐싱을 지원하지 않는다. 그렇기 때문에 하나의 query 상에서 query와 filter를 적절히 나눠서 뽑는게 중요하다.
  • 이 부분이 굉장히 헷갈리는데 보통score를 뽑는 부분을 query 부분이라고 하고filter를 뽑는 부분을 filter 부분이라고 한다. es query안에 query부분, filter부분이 존재한다고 생각하면 된다.
    • GET ai_centre/_search
      {
      "query": {
       # query 부분 (여기에 쓰는 조건문은 score에 반영된다)
       "bool": {
         "filter": {  
           # filter 부분 (여기에 쓰는 조건문은 score에 반영되지 않는다. but 빠름)
         }
       }
      }
      }

score

  • score는 쿼리 내 필드에 부여된 조건과 도큐먼트 내 필드값이 얼마나 유사한지 score 나타내고, 각 필드 score의 곱 또는 합으로 document의 score가 결정된다.
  • 참고:
    • categorical 데이터 (단순 키워드 포함)는 bm25(tf_idf 라고 생각하면 됨)로 나타내고 있다.
    • numeric 데이터는 0, 1로 표현된다.
    • scrpit_score : 사용자에 목적에 맞게 산출식을 script(painless)로 표현할 수 있고 왠만하면 다되는것 같긴한데.. 코드가 복잡해진다. 하지만 이것만 잘 쓰면 단순한 리랭킹도 가능하다.

역색인

NoSQL

  • ES는 NoSQL 데이터라서 비정형 형태의 데이터를 저장한다.
  • 안되는것:
    • JOIN을 지원하지 않는다. JOIN 쿼리가 있으면 나눠서 2번 날려야한다.
    • WHERE 절에 IN 쿼리도 안된다는 소문이 있던데 한번더 확인필요
    • case문 + 쿼리 중 파생변수 생성 안된다. (참고 : script를 쿼리중에 쓰면 가능하다. 또한, scripted fields라고 있긴한데 시각화하는데서 주로 사용하는 것 같아서 사용하지 말라고 되어있다.)

용어차이

ES**SQL**

field

column

document

row

index

table

type(deprecated)

table

mapping

schema

_id

pk

ELK stack

  • E(elasticsearch) : 검색엔진
  • L(logstash) : ETL (참고 : 꼭 es 데이터만 etl 할 수 있는게 아님)
  • K(kibana) : console +GUI setting + 시각화

ES기능 이용하기 (es rest api)

  • 기본적으로 es를 setting하거나 데이터를 es에 CRUD하는 동작 모두 ES REST api를 이용한다.
  • API에 주로 json 형태로 명령문을 만들어서 보내고 json 형태로 데이터를 받는다. (위의 query문 참조)
  • ai_centre에서 unit이 tf2인 docs를 보고싶을때 명령어를 보내는 명령어는 다음과 같다.
    • LINUX(curl 명령어)
      curl -XGET "http://elassandra-elasticsearch:9200/ai_centre/_search" \
        -H 'Content-Type: application/json' \
        -d'
      {
        "query": {
          "term": {
            "unit": "tf2"   
          }
        }
      }'
    • 저걸 shell 상에서 json 형태로 만드는건 너무 힘들다.
    • KIBANA(console 상에서 실행)
    • GET ai_centre/_search
      {
        "query": {
          "term": {
            "unit": "tf2"   
          }
        }
      }
  • 참고 : python에 elasticsearch라는 패키지를 통해 es에 접속하여 수행할 수 있는데 내부적으로는 모두 curl 기반의 api 호출로 이루어진다.

data type

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html