[The Search API]
이제 간단한 검색을 시작해 보자. 검색을 실행하는 기본적인 2가지 방법이 있다. 하나는 REST Request URI에 검색 파라미터를 보내는 것이고, 다른 하나는 REST Request Body에 검색 파라미터를 보내는 것이다. Request Body에 보내는 방법은 더 표현적이고 readable한 JSON 포맷으로 검색에 대한 정의를 할 수 있다. 우리는 Request URI에 파라미터를 보내는 방법을 예제로 해보겠지만, 이 tutorial의 나머지 부분에서는 전부 Request Body에 파라미터를 보내는 방법을 사용할 것이다.
검색에 대한 REST API는 _search
endpoint를 통해 접속할 수 있다. 다음 예제는 bank index의 모든 document를 리턴한다.
curl 'localhost:9200/bank/_search?q=*&pretty'
먼저 Search Call을 해부해 보자. 우리는 _search endpoint를 사용하여 bank index를 검색 중이다. 그리고 q=* 파라미터는 index내의 모든 document를 매칭하도록 Elasticsearch에 지시한다. Pretty 파라미터는, 다시 말하지만, Elasticsearch에게 pretty-printed JSON 결과를 리턴하라고 말하는 것이다.
응답 결과의 일부분은 다음과 같다.
curl 'localhost:9200/bank/_search?q=*&pretty'
{
"took" : 63,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1000,
"max_score" : 1.0,
"hits" : [ {
"_index" : "bank",
"_type" : "account",
"_id" : "1",
"_score" : 1.0, "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
}, {
"_index" : "bank",
"_type" : "account",
"_id" : "6",
"_score" : 1.0, "_source" : {"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}
}, {
"_index" : "bank",
"_type" : "account",
응답 결과에서 우리는 다음 항목을 볼 수 있다.
- took :
Elasticsearch가 검색 실행에 걸린 시간 (ms)
- timed_out
: 검색 타임 아웃 발생 여부
- _shards : 얼마나 많은 shard를 검색했는지. 성공한 shard 수, 실패한 shard 수
- hits.total
: 검색된 전체 document 수
- hits.hits
: 검색된 실제 Array (기본적으로는 처음 10개)
- _score,
max_score : 불필요한 필드 (무시)
Request Body를 이용하여 동일한 검색을 수행하는 경우는 다음과 같다.
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": {
"match_all": {} }
}'
차이점은 URI에 q=*를 전달하는 대신에 POST를 사용하여 _search API의 Request Body에 JSON 스타일의 쿼리를 보낸 것이다. 다음 섹션에서 JSON query에 대해서 논의할 것이다.
응답 결과는 다음과 같다.
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": {
"match_all": {} }
}'
{
"took" : 26,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1000,
"max_score" : 1.0,
"hits" : [ {
"_index" : "bank",
"_type" : "account",
"_id" : "1",
"_score" : 1.0, "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
}, {
"_index" : "bank",
"_type" : "account",
"_id" : "6",
"_score" : 1.0, "_source" : {"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}
}, {
"_index" : "bank",
"_type" : "account",
"_id" : "13",
여러분이 검색 결과를 받았을 때, Elasticsearch는
request를 완벽하게 수행하고, 어떤 종류의 server-side resource 정보를 가지고 있지 않고, 결과에 대한 커서도 오픈하고 있지 않다. 이것은 SQL like한 다른 플랫폼에서 대용량의 결과를 조회할 경우, 부분적으로 data subset을 유지하거나 server-side의 stateful cursor를 open하고 있어서 서버로 다음 결과를 fetch하는 요청을 보내면 continuous하게 다음 결과를 가져오는 경우와 다른 점이다.
트랙백 주소 :: http://www.yongbi.net/trackback/700
트랙백 RSS :: http://www.yongbi.net/rss/trackback/700
댓글을 달아 주세요
댓글 RSS 주소 : http://www.yongbi.net/rss/comment/701