ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ES - 기본 API
    🔍 elastic search 2022. 9. 21. 19:42

    Index, Type, Document에 대한 CRUD API

    • Index - RDBMS의 database 같은 개념
    • Type - RDBMS의 table 개념
    • Document - RDMBS의 ROW 같은 개념

    입력 (PUT)

    • 데이터 입력시 PUT 메서드를 이용

    조회 (GET)

    • GET 메서드로 가져올 도큐먼트의 URL을 입력시 도큐먼트의 내용을 가져온다.

    삭제 (DELETE)

    • DELETE 메서드를 이용해서 도큐먼트 또는 인덱스 단위의 삭제가 가능

    수정 (POST)

    • POST 메서드는 PUT 메서드와 유사하게 데이터 입력에 사용 가능
    • 도큐먼트 id 의 자동 생성은 PUT 메서드로는 동작하지 않는다.

    ES API 구조

    💡 http://<호스트>:<포트>/<인덱스>/_doc/<도큐먼트 id>

     

    인덱스


    클러스터에 존재하는 모든 index 조회

    curl -XGET 'localhost:9200/_cat/indices?v'
    

    인덱스 만들기

    • user라는 인덱스 만들기
    curl -XPUT 'localhost:9200/user?pretty'
    
    • 다시 조회

    ⇒ user 인덱스 조회됨.

    인덱스의 health

    총 3가지의 상태

     

    상태 설명
    green 모든 샤드가 정상적인 상태
    yellow 일부 혹은 모든 샤드의 래플리카 샤드가 정상적으로 동작하지 않고 있는 상태
    red 일부 혹은 모든 샤드의 primary & replica 샤드가 모두 정상적으로 동작하지 않고 있는 상태

    green / yellow는 쓰기, 읽기에는 문제가 없는 상태이다.

    • 현재는 노드가 하나 뿐이라 replica 샤드의 상태가 UNASSIGNED 되었기 때문
      • primary, replica 샤드는 하나의 노드에 있을 수 없음.

    Document


    인덱스에 document 추가하기

    POST를 사용

    curl -XPOST '[IP]:[PORT]/[index명]/_doc/[아이디]' -H 'Content-type:application/json' -d '[데이터]'
    

    아이디를 적지 않으면 ES에서 임의적으로 아이디가 들어가게 된다.

    아이디를 적어주면 해당 아이디로 Document 생성

     

    Document 조회

    모든 document 조회하기

    curl -XGET '[IP]:[PORT]/[index명]/_search?pretty
    

    특정 document 조회하기

    curl -XGET '[IP]:[PORT]/[index명]/_doc/[아이디]?pretty
    

    Document 수정

    수정은 생성과 동일  

    • 변경될 내용을 명시해 주면 된다.
    • 버전이 더 높아진다.

    벌크 API - _bulk API


    여러 명령을 배치로 수행하기 위해서 _bulk API 사용 가능

    • index
    • create
    • update
    • delete

    동작이 가능하다.

    delete를 제외하고는 명령문과 데이터문을 한 줄씩 순서대로 입력해야 한다.

    POST _bulk
    {"index":{"_index":"test", "_id":"1"}}
    {"field":"value one"}
    {"index":{"_index":"test", "_id":"2"}}
    {"field":"value two"}
    {"delete":{"_index":"test", "_id":"2"}}
    {"create":{"_index":"test", "_id":"3"}}
    {"field":"value three"}
    {"update":{"_index":"test", "_id":"1"}}
    {"doc":{"field":"value two"}}
    

    파일에 저장 내용을 저장후 실행

    벌크 명령을 파일로 저장하고 curl 명령으로 실행 가능

    저장한 명령 파일을 —data-binary 로 지정하면 저장된 파일로 부터 입력할 명령과 데이터를 읽어올 수 있다.

    • 아래 예제에서는 명령을 bulk.json이라는 이름의 파일로 저장함.
    $ curl -XPOST "<http://localhost:9200/_bulk>" -H 'Content-Type: application/json' --data-binary @bulk.json
    
    • 파일 이름 앞에는 @ 문자를 입력해야 한다.

    ❗ 벌크 동작은 따로따로 수행하는 것보다 속도가 훨씬 빠르다.

    특히 대량의 데이터를 입력할 때 반드시 _bulk API를 사용해야 불필요한 오버헤드가 없다.

    LogstahBeats 그리고 Elastic 웹페이지에서 제공하는 대부분의 언어별 클라이언트에서는 데이터 입력시 _bulk를 사용하도록 개발되어 있다.

    검색 API - _search API


    검색은 인덱스 단위로 이루어진다.

    GET <인덱스명> /_search 
    

    형식으로 사용하며 쿼리를 입력하지 않으면 전체 도큐먼트를 찾는 match_all 검색을 한다.

    URI 검색

    _search 뒤에 q 파라미터를 사용해 검색어를 입력할 수 있다.

    • 이렇게 요청 주소에 검색어를 넣어 검색하는 방식 = URI 검색
    GET test/_search?q=value
    
    // - test 인덱스에서 "value"라는 값을 검색하기 위함.
    
    // 결과
    {
      "took" : 3,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 2,
          "relation" : "eq"
        },
        "max_score" : 0.105360515,
        "hits" : [
          {
            "_index" : "test",
            "_type" : "_doc",
            "_id" : "3",
            "_score" : 0.105360515,
            "_source" : {
              "field" : "value three"
            }
          },
          {
            "_index" : "test",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 0.105360515,
            "_source" : {
              "field" : "value two"
            }
          }
        ]
      }
    }
    
    • hits.total.value
      • 검색 결과 전체에 해당되는 문서의 개수
      • hits:[] 구문 안에 배열로 가장 정확도가 높은 문서 10개가 나타남.

    AND 조건 사용

    // 검색어 "value AND three" 검색
    GET test/_search?q=value AND three
    

    검색어를 field 필드에서 찾고 싶을 때

    • <필드명> : <검색어> 형태로 입력
    // "field" 필드에서 검색어 "value" 검색
    GET test/_search?q=field:value
    

    데이터 본문 검색 (Data body)

    데이터 본문(data body) 검색은 검색 쿼리를 데이터 본문으로 입력하는 방식

    • ES의 QueryDSL을 사용
    • 쿼리 또한 JSON 형식

    가장 많이 사용되는 것 - match 쿼리

    // 데이터 본문 검색으로 "field" 필드에서 검색어 "value" 검색
    GET test/_search
    {
      "query": {
        "match": {
          "field": "value"
        }
      }
    }
    
    • 쿼리 입력은 항상 query 지정자로 시작한다.
    • 그 다음 레벨에서 쿼리의 종류를 지정
    • 그 후는 사용할 쿼리 별로 문법이 상이하다.

    멀티 테넌시 (Multitenancy)

    Elasticsearch는 여러 개의 인덱스를 한꺼번에 묶어서 검색할 수 있는 멀티테넌시를 지원

    ex) logs-2022-09, logs-2022-10 … 와 같이 날짜별로 저장된 인덱스들이 있다면 이 인덱스들을 모두 logs-*/_search 명령으로 한꺼번에 검색이 가능

     

    특히 시간순으로 따라 쌓이는 로그 데이터를 다룰 때는 인덱스를 일단위 등으로 구분하는 것이 좋다.

    필드 구조가 변경되거나 크기가 커져서 샤드 설정을 변경하거나 할 때 용이

     

    여러 인덱스를 검색할 땐 쉼표 , 로 나열하거나 와일드카드 * 문자로 묶을 수 있다.

    참고 자료

    https://esbook.kimjmin.net/04-data/4.3-_bulk

    https://esbook.kimjmin.net/04-data/4.4-_search

    https://velog.io/@soyeon207/ES-3.-인덱스-설정과-document-CRUD-API

     

    '🔍 elastic search' 카테고리의 다른 글

    ES - Aggregations  (0) 2022.09.22
    ES - 텍스트 분석  (0) 2022.09.22
    ES - 데이터 검색  (1) 2022.09.21
    Docker로 ES 설치하기  (1) 2022.09.21
    ElasticSearch  (0) 2022.09.20

    댓글

Designed by Tistory.