Architecture/ELK

Elastic Stack 아주 조금만 알아보자 - ElasticSearch Mapping/Search

KOOCCI 2019. 11. 27. 23:30

Mapping 이란

MappingRDB에서 Schema와 비슷한 역할을 한다.

그러나, 항상 Mapping이 필요한가를 묻는다면, 앞선 포스트에서 진행했듯, 딱히 신경쓰지 않아도 Document 생성/삭제/수정 등이 자유롭다.

 

그러나, Mapping이 정확하지 않으면 우리가 원하는 데이터의 정합성이 떨어지게 된다. (숫자가 String 으로 저장되는 등)

 

따라서, Kibana를 이용한다는 등 분석 및 Visualize를 해야할 때 제대로 사용하기 위해서는 꼭 넣어주는 것이 좋다.

{
	"class" : {
		"properties" : {
			"title" : { "type" : "text" },
			"professor" : { "type" : "text" },
			"major" : { "type" : "text" },
			"semester" : { "type" : "text" },
			"student_count" : { "type" : "integer" },
			"unit" : { "type" : "integer" },
			"rating" : { "type" : "integer" },
			"submit_date" : { "type" : "date", "format" : "yyyy-MM-dd"
			},
			"school_location" : { "type" : "geo_point" }
		}
	}
}

위 내용을 보면, class라는 Type이 있고 (RDB의 Table에 해당), properties 안에 각각 type들이 들어 있다.

 

그럼 간단히 실습해보자.

PUT & GET

위에서 보면, PUT으로 index 먼저 만들어 주었고, GET으로 확인하였다.

여기서 주의깊게 볼 내용은 mappings값이 비어 있다는 것이다.

curl -H 'Content-Type:application/json' -XPUT 'http://localhost:9200/classes/class/_mapping?include_type_name=true&pretty' -d @classesRating_mapping.json

파라미터가 조금 늘어 났는데, 이는 아래 링크를 확인하자.

https://www.inflearn.com/questions/12385

Mapping

그럼 내가 등록하고자 했던 내용들이, Mappings에 등록되었다는 것을 알 수 있다.

그럼 앞선 포스팅에서 진행했던 bulk 데이터를 넣고 확인해보자.

Bulk

Search

Search 기능에 대해 알아보자.

먼저 데이터를 가져와 삽입해보자.

{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "1" } }
{"team" : "Chicago Bulls","name" : "Michael Jordan", "points" : 30,"rebounds" : 3,"assists" : 4, "submit_date" : "1996-10-11"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "2" } }
{"team" : "Chicago Bulls","name" : "Michael Jordan","points" : 20,"rebounds" : 5,"assists" : 8, "submit_date" : "1996-10-11"}

simple_basketball.json

그리고 위 데이터를 bulk로 넣어준다.

curl -XPOST http://localhost:9200/_bulk?pretty -H'Content-Type: application/json' --data-binary @simple_basketball.json

bulk POST

그럼 간단히 Search를 해보자.

curl -XGET localhost:9200/basketball/record/_search?pretty
{
  "took" : 27,        
  "timed_out" : false,
  "_shards" : {       
    "total" : 1,      
    "successful" : 1, 
    "skipped" : 0,    
    "failed" : 0      
  },
  "hits" : {
    "total" : {       
      "value" : 2,    
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "basketball",
        "_type" : "record",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "team" : "Chicago Bulls",
          "name" : "Michael Jordan",
          "points" : 30,
          "rebounds" : 3,
          "assists" : 4,
          "submit_date" : "1996-10-11"
        }
      },
      {
        "_index" : "basketball",
        "_type" : "record",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "team" : "Chicago Bulls",
          "name" : "Michael Jordan",
          "points" : 20,
          "rebounds" : 5,
          "assists" : 8,
          "submit_date" : "1996-10-11"
        }
      }
    ]
  }
}

search

위와 같이, 2개의 Document가 찾아지는 것을 볼 수 있다.

 

그럼, 이중 points가 30인 것만 찾아보자.

curl -XGET 'localhost:9200/basketball/record/_search?q=points:30&pretty'
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "basketball",
        "_type" : "record",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "team" : "Chicago Bulls",
          "name" : "Michael Jordan",
          "points" : 30,
          "rebounds" : 3,
          "assists" : 4,
          "submit_date" : "1996-10-11"
        }
      }
    ]
  }
}

search 30

위와 같은 방법도 있지만, Request Body를 사용하는 방법이 있다.

curl -XGET  -H'Content-Type: application/json' localhost:9200/basketball/record/_search?pretty -d'
{
"query" : {
"term": { "points" : 30}
 }
}'
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "basketball",
        "_type" : "record",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "team" : "Chicago Bulls",
          "name" : "Michael Jordan",
          "points" : 30,
          "rebounds" : 3,
          "assists" : 4,
          "submit_date" : "1996-10-11"
        }
      }
    ]
  }
}

request body

위와 같이 request body의 경우 더 여러가지 옵션들이 있다.

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html

 

Request Body Search | Elasticsearch Reference [7.4] | Elastic

Highlighters don’t reflect the boolean logic of a query when extracting terms to highlight. Thus, for some complex boolean queries (e.g nested boolean queries, queries using minimum_should_match etc.), parts of documents may be highlighted that don’t corre

www.elastic.co

위 URL에 다양한 방법이 있다는 것이 나온다.

다만, 위 API를 이해할 때 Shard, Node등의 단어들이 나온다.

 

다음 포스팅에서는 위 API를 이해하기 위해 새로운 단어들을 학습해 보도록 하자.


※ Inflearn 강의, Naver D2 블로그 등을 참고해 정리한 내용입니다.

 

1편 > Elastic Stack 아주 조금만 알아보자 - Elastic Stack 이란?

2편 > Elastic Stack 아주 조금만 알아보자 - ElasticSearch 기본 실습

3편 > 현재 Post

4편 > Elastic Stack 아주 조금만 알아보자 - ElasticSearch 구조

5편 > Elastic Stack 아주 조금만 알아보자 - Aggregation

6편 > Elastic Stack 아주 조금만 알아보자 - Kibana

7편 > Elastic Stack 아주 조금만 알아보자 - LogStash

8편 > Elastic Stack 아주 조금만 알아보자 - LogStash 실습 1