ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • elasticsearch 사용해보자.
    카테고리 없음 2023. 4. 20. 09:52
    저번 포스팅중에 엘라스틱서치를 설치 해봤다. 여기 설치는 해봤으니 사용해보자.
    관계형 데이터베이스 elasticsearch
    Database Index
    Table Type
    Row Document
    Column Field
    Schema Mapping
    Index Everything is indexed
    SQL Query DSL
    출처 : http://d2.naver.com/helloworld/273788 관계형 데이터베이스와 엘라스틱 서치에 관한비교를 해봤다. 네이버 개발자블로그에서 찾았다. 우리는 예전에 엘라스틱서치의 플러그인도 설치를 해봤으니 거기서 해도 되고 curl로 해도 상관없다. 엘라스틱과 키바나를 실행 시키고 http://localhost:5601 다음과 같이 접속해보자! 엘라스틱 서치는 Rest Api를 지원한다.
    http://host:port/(index)/(type)/(action|id) 
    
    실습을 한번 해보자.
    curl -XPUT "http://localhost:9200/movie/users/1" -d
    {
      "name": "wonwoo",
      "email": "wonwoo@test.com"
    }
    
    위와 같이 요청을 했을 경우 아래와 같이 응답을 받을 것이다.
    {
      "_index": "movie",
      "_type": "users",
      "_id": "1",
      "_version": 1,
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      },
      "created": true
    }
    
    index는 movie 이고 type은 users다 id는 1로 지정하였다. 그럼 이제 get을 해보자
    curl -XGET "http://localhost:9200/movie/users/1"
    
    위와 같이 해당 id를 get하면 된다.
    {
      "_index": "movie",
      "_type": "users",
      "_id": "1",
      "_version": 1,
      "found": true,
      "_source": {
        "name": "wonwoo",
        "email": "wonwoo@test.com"
      }
    }
    
    그럼 우리가 위에서 넣어두었던 데이터들이 나올 것이다. 만약 id를 지정 하고 싶지 않다면 POST로 요청하면 된다.
    curl -XPOST "http://localhost:9200/movie/users/" -d
    {
      "name": "kevin",
      "email": "kevin@test.com"
    }
    
    
    위와 같이 요청을 하였을 경우에는 id가 자동 생성된다.
    {
      "_index": "movie",
      "_type": "users",
      "_id": "AVSBOFuDW3yAedZaY19R",
      "_version": 1,
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      },
      "created": true
    }
    
    그리고 확인을 해보자
    curl -XGET "http://localhost:9200/movie/users/_search"
    
    위는 전체를 서치 하는 것이다.
    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 2,
        "max_score": 1,
        "hits": [
          {
            "_index": "movie",
            "_type": "users",
            "_id": "AVSBOFuDW3yAedZaY19R",
            "_score": 1,
            "_source": {
              "name": "kevin",
              "email": "kevin@test.com"
            }
          },
          {
            "_index": "movie",
            "_type": "users",
            "_id": "1",
            "_score": 1,
            "_source": {
              "name": "wonwoo",
              "email": "wonwoo@test.com"
            }
          }
        ]
      }
    }
    
    제대로 동작한다. 두번째 id는 자동으로 생성 된것을 확인 할 수 있다. 만약 컬럼(필드)중 name이라는 필드만 보이고 싶다면 아래와 같이 하면 된다.
    curl -XGET "http://localhost:9200/movie/users/1?_source=name"
    
    그럼 아래와 같이 출력 될것이다. 전체로 검색 하였을 경우에도 가능하다.
    {
      "_index": "movie",
      "_type": "users",
      "_id": "1",
      "_version": 1,
      "found": true,
      "_source": {
        "name": "wonwoo"
      }
    }
    
    특정 필드를 검색 하고 싶다면 아래와 같이 하자.
    curl -XGET "http://localhost:9200/movie/users/_search?q=name:wonwoo"
    
    {
      "took": 2,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 0.30685282,
        "hits": [
          {
            "_index": "movie",
            "_type": "users",
            "_id": "1",
            "_score": 0.30685282,
            "_source": {
              "name": "wonwoo",
              "email": "wonwoo@test.com"
            }
          }
        ]
      }
    }
    
    like로 검색을 하고 싶다면 아래와 같이 하면 된다.
    curl -XGET "http://localhost:9200/movie/users/_search?q=name:*woo*"
    
    앞뒤로 * 붙여도 되고 앞뒤 한곳에만 붙어도 상관없다. 원하는 것을 검색하고 싶을때 마음 대로 하면 된다.
    {
      "took": 15,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 2,
        "max_score": 1,
        "hits": [
          {
            "_index": "movie",
            "_type": "users",
            "_id": "AVSBUBdyW3yAedZaY2gz",
            "_score": 1,
            "_source": {
              "name": "wonwoo123",
              "email": "test@test.com"
            }
          },
          {
            "_index": "movie",
            "_type": "users",
            "_id": "1",
            "_score": 1,
            "_source": {
              "name": "wonwoo",
              "email": "wonwoo@test.com"
            }
          }
        ]
      }
    }
    
    마지막으로 삭제를 해보자
    curl -XDELETE "http://localhost:9200/movie/users/1"
    
    그럼 성공 했다고 아래와 같이 출력 될 것이다.
    {
      "found": true,
      "_index": "movie",
      "_type": "users",
      "_id": "1",
      "_version": 2,
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      }
    }
    
    그리고 다시 확인해보면 삭제된 것을 알 수 있다. 몇가지만 더 보자
    curl -XGET "http://localhost:9200/movie/users/_search?q=wonwoo"
    
    어떤 필드이던 간에 wonwoo라는 값이 있으면 다 출력 된다.
    curl -XGET "http://localhost:9200/movie/users/_search?q=-kevin"
    
    kevin이라는 값이 있는걸 제외하고 출력한다.
    curl -XGET "http://localhost:9200/movie/users/_search?_source=false"
    
    source를 제외하고 meta 정보만 출력한다.
    curl -XGET "http://localhost:9200/movie/users/_search?sort=name:desc"
    
    name이라는 필드 기준으로 정렬을 해준다. 기본은 asc이다.
    curl -XGET "http://localhost:9200/movie/users/_search?q=name:(wonwoo%20AND%20test)"
    
    name이라는 필드에 wonwoo와 test가 있으면 출력한다.
    curl -XGET "http://localhost:9200/movie/users/_search?q=email:test%20kevin"
    
    email이라는 필드에 test나 kevin이 있으면 출력한다. 기본으로 or조건이듯 하다.
    curl -XGET "http://localhost:9200/movie/users/_search?q=(name:(wonwoo%20AND%20test)%20AND%20email:wonwoo)"
    
    name이라는 필드에는 wonwoo와 test가 있어야 하고 email이라는 필드에는 wonwoo가 있으면 출력한다. 물론 curl로 요청 하는 것도 괜찮지만 우리가 설치 했던 플러그인 중 sense라는 플러그인을 사용해서 하면 UI도 이쁘게 나오고 훨씬 편하다 sense라는 플러그인을 사용해서 한번씩 해보자!

    댓글

Designed by Tistory.