저번 포스팅중에 엘라스틱서치를 설치 해봤다. 여기

설치는 해봤으니 사용해보자.

관계형 데이터베이스 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라는 플러그인을 사용해서 한번씩 해보자!