저번 포스팅중에 엘라스틱서치를 설치 해봤다.
여기
설치는 해봤으니 사용해보자.
관계형 데이터베이스 |
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라는 플러그인을 사용해서 한번씩 해보자!