Elasticsearch Search APIs
Routing
엘라스틱에서 서치를 할때는 보통 여러개의 사드에서 검색이 이루어진다. 때문에 데이터가 많아지거나 샤드가 많을 수록 다소 지연될 수 있다. 이럴 때 Routing을 사용하면 특정 사드에 인덱싱이 되기 때문에 검색시 특정 샤드에서 검색만 되기 때문에 보다 빠르게 검색이 될 수 있다.
POST /test/_doc?routing=kim
{
"user" : "kim1",
"message" : "test kim1"
}
POST /test/_doc
{
"user" : "kim2",
"message" : "test kim2"
}
kim1
에는 routing=kim
을 넣었고 kim2
에는 일반적인 방법으로 등록했다. 검색을 수행해보자.
GET /test/_search
{
"query": {
"term": {
"user": "kim1"
}
}
}
routing없이 검색을 하면 검색결과는 아래와 같다.
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "test",
"_type": "_doc",
"_id": "3nMC92kBVE5-ScJ0hJ7_",
"_score": 0.2876821,
"_routing": "kim",
"_source": {
"user": "kim1",
"message": "test kim1"
}
}
]
}
}
_shards.total 부분을 보면 총 5개의 사드에서 검색됨을 알 수 있다. 이번에는 라우팅을 통해 검색해보자.
GET /test/_search?routing=kim
{
"query": {
"term": {
"user": "kim1"
}
}
}
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "test",
"_type": "_doc",
"_id": "3nMC92kBVE5-ScJ0hJ7_",
"_score": 0.2876821,
"_routing": "kim",
"_source": {
"user": "kim1",
"message": "test kim1"
}
}
]
}
}
_shards에 total를 보면 하나의 샤드에서 검색이 이루어진다. 이처럼 routing을 통해서 자주 검색되는 것을 하나의 샤드에 넣어서 관리할 수 있다.
URI Search & Body Search
user 값이 kim5 인 것 검색하기
#한 개의 인덱스에서 검색
GET /test/_search?q=user:kim5
#여러 개의 인덱스에서 검색
GET /test,test2,test3/_search?q=user:kim5
#전체 인덱스에서 검색
GET /_all/_search?q=user:kim5
GET /test/_search
{
"query": {
"term": {
"user":"kim5"
}
}
}
Script Fields
아래와 같은 책에 대한 인덱스가 있다고 여기자, 그런데 price 에 세금을 포함한 가격으로 출력하고 싶을 때가 있다. 이렇게 특정피드에 어떤 스크립트 로직이 필요한 경우에 script fields
를 사용하면 된다.
POST /books/_doc
{
"type": "novel",
"title": "book1",
"author" : "kim1",
"price": 1000,
"publisher": "YK"
}
POST /books/_doc
{
"type": "novel",
"title": "book2",
"author" : "kim2",
"price": 1100,
"publisher": "YK"
}
GET /books/_search
{
"query": {
"match_all": {}
},
"script_fields": {
"test1": {
"script": {
"lang": "painless",
"source": "doc['price'].value + (doc['price'].value * params.tax)",
"params": {
"tax": 0.3
}
}
}
}
}
Search Template
GET /products/_search/template
{
"source": {
"query": {
"match": {
"": ""
}
},
"size": ""
},
"params": {
"my_field":"name",
"my_value":"Scampi",
"my_size": 10
}
}
Mustache templating 를 사용할 수 있다. 자주 사용되는 검색조건을 만든후에 파라미터만 변경되는 경우 사용하면 유용하다.
Suggester
POST /products/_search
{
"query" : {
"match": {
"name": "tring out Elasticsearch"
}
},
"suggest" : {
"my-suggestion" : {
"text" : "Tail",
"term" : {
"field" : "name"
}
}
}
}
해당 검색어에 대한 유사어가 나타난다. 네이버나 구글검색을 떠오르면 된다. Tail
로 검색시 score 기준으로 표시해준다.
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
},
"suggest": {
"my-suggestion": [
{
"text": "tail",
"offset": 0,
"length": 4,
"options": [
{
"text": "trail",
"score": 0.75,
"freq": 2
},
{
"text": "thai",
"score": 0.5,
"freq": 2
},
{
"text": "table",
"score": 0.5,
"freq": 1
},
{
"text": "taro",
"score": 0.5,
"freq": 1
},
{
"text": "tart",
"score": 0.5,
"freq": 1
}
]
}
]
}
}