1. Elasticsearch 용어
1) index
- collection of different types of document under on logical namespace
(rdb에서 schema와 같은 역할)
- shard의 수 및 replica를 설정
- multitenant 지원 하고 자유로이 생성 및 삭제가능
2) type
- logical collection of documents like the same entity
(rdb에서 table와 같은 역할)
- table과 같은 domain objects 표현 (client, company, user...)
3) document
- logical unit that represents the instance of an entity
(rdb에서 row와 같은 역할)
- json object
4) field
- multiple fields that are organized as JSON key / value pairs.
(rdb에서 columns와 같은 역할)
2. Elasticsearch Rest API
CRUD (create, update, retrieve, delete)을 API로 지원
1) document 생성
curl -XPUT http://localhost:9200/test/users/1?pretty -d '{
"id" : "test1",
"firstname" : "first",
"lastname" : "name",
"roles" : [ "admin", "guest"]
}'
http://<es-host>:<port>/<index_name>/<type_name>/<id>
2) document 읽기
curl -XGET http://localhost:9200/test/users/1?pretty
document metadata와 document 내용을 return
3) document update
curl -XPOST http://localhost:9200/test/users/1/_update?pretty -d {
"doc": {
"age" : 20
}
}'
document은 변경되지 않기 때문에 get-modify-update 과정이 발생함
4) document mapping
curl -XPOST http://localhost:9200/test/users/_mapping?pretty
type mapping에 대한 정보
{
"test" : {
"mappings" : {
"users" : {
"properties" {
"id" : {
"type": "long"
},
- mapping 정보 수정
curl -XPUT http://localhost:9200/test/users/_mapping?pretty -d '{
"properties" {
"first": {
"type" : "string"
"index" : "not_analyzed" --> disable the analysis
}
"address" : {
"type" : "object",
"properties": {
"city" : {
"type" : "string"
}
"region" : {
"type" : "string"
}
}
}
}
}'
* 들어오는 데이터에 따라 date type을 자동으로 맵핑 설정
curl -XPUT http://localhost:9200/test1/type1/_mapping -d '{
"dynamic_date_format" : ["MM/dd/yy HH:mm"]
}'
- mapping templates
template를 생성하여 같은 이름 패턴을 사용하는 index에 자동 적용
curl -XPUT http://localhost:9200/_template/test-template?pretty -d '{
"template" : "test*",
"mappings" : {
"users" : {
}
}
}
5) document delete
-- 전체 지우기
curl -XDELETE 'http://localhost:9200/_all' or 'http://localhost:9200/*'
-- index 삭제
curl -XDELETE 'http://localhost:9200/test'
-- 특정 type document 삭제
curl -XDELETE 'http://localhost:9200/test/cup/_query -d
'{
"query" : {
"bool" : {
"must" : [
{ "match_all" : {} }
]
}
}
}'
3. Date types
1) string
2) byte, short, int, long
3) float, double
4) boolean
5) date
6) array, nested loops, ipv4, geo points, geo shape
* 1~ 5 core types
4. index processing
1) custom analyzer 생성 및 적용
index가 생성될때 custom analyzer 생성하여 적용할수 있음
(whitespace, keyword. lowercase, standard, n-gram etc)
curl -XPUT http://localhost:9200/test?pretty -d '{
"settings" : {
"analysis" : {
"analyzer": {
"test_analyzer": {
"tokenizer" : "whitespace",
"filter": [ "simple", "stop", "lowercase", "snowball"]
}
}
}
}
}
5. elasticsearch searching 방식
1) uri search
curl -XGET http://localhost:9200/test/users/_search?pretty=true&q=first:park
2) match all
curl -XPOST http://localhost:9200/test/users/_search?pretty -d '{
"query" : {
"match_all" : {}
}
}'
3) term
search term에 정확히 매치되는 document만 search
curl -XPOST http://localhost:9200/test/users/_search?pretty -d '{
"query" : {
"term" : {
"role" : {
"value" : "guest"
}
}
},
"size" : 10
}'
4) Boolean
must, must_not, should 사용하여 and와 or 연산을 구현하여 search
curl -XPOST http://localhost:9200/test/users/_search?pretty -d '{
"query" : {
"bool": {
"must" : [
{
"term" : {
"city" : {
"value" : "seoul"
}
}
}
],
"should": [
"terms": {
"role": ["guest"]
}
]
}
}"
}'
5) match
or 연산자처럼 동작하는 boolean type
curl -XPOST http://localhost:9200/test/users/_search?pretty -d '{
"query": {
"match" : {
"last" : {
"query" : "test data"
}
}
}
}'
curl -XPOST http://localhost:9200/test/users/_search?pretty -d '{
"query": {
"match" : {
"last" : {
"query" : "test data",
"type" : "phrase"
}
}
}
}'
6) range
gt, gte, lt, lte를 사용하여 range 검색
curl -XPOST http://localhost:9200/test/users/_search?pretty -d '{
"query": {
"range" : {
"age" : {
"gte" : 15,
"lte" : 30
}
}
}
}'
10) geo distance
특정 위치(지역)안에 document 검색
curl -XPOST http://localhost:9200/test/users/_search?petty -d '{
"query" : {
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "50km",
"region" : {
"lat" : 33.10,
"lon" : 55.23
}
}
}
}
}
}'
5. aggregations
[표기법]
"aggregations" : {
"<aggregation_name>" : {
"<aggregation_type>" : {
<aggregation_body>
}
[,"meta" : { [<meta_data_body>] } ]?
[,"aggregations" : { [<sub_aggregation>]+ } ]?
}
[,"<aggregation_name_2>" : { ... } ]*
}
3가지 형태에 aggregation 지원
1) Bucketing : SQL의 Group by와 같으며, 특정 기준으로 buckets에 수행
- terms aggregation
top n 결과를 가져오기 위해 size 사용
curl -XPOST http://localhost:9200/test/users/_search?pretty -d '{
"aggs" : {
"cand_by_region" : {
"field" : "region",
"size" : 3
}
}'
* 하위 N 결과 (count로 ascending..)
"terms" : {
"field" : "region",
"size" : 3,
"order": {
"_count" : "asc"
}
}
*terms aggregation 사용시 해당 필드를 not_analyzed로 설정
- histograms
consistent interval를 가지고 aggreation 수행
curl -XPOST http://localhost:9200/test/users/_search?pretty -d '{
"aggs" : {
"cand_exp" : {
"histogram" : {
"field" : "work time",
"interval" : 5,
"min_doc_count" : 0
}
}
}
'}
- range
numeric or date type으로 정확한 ranges aggreation 수행
curl -XPOST http://localhost:9200/test/users/_search?pretty -d '{
"aggs" : {
"cand_exp" : {
"range" : {
"field" : "work time",
"ranges" : [
{
"from" : 1,
"to" : 4
},
{
}
}
}
}
}'
- geo distance
curl -XPOST http://localhost:9200/test/users/_search?pretty -d '{
"query" : {
"term" {
"role" : {
"value" : "admin"
}
}
},
"aggs" : {
"test_agg" : {
"geo_distance" : {
"field" : "geo",
"origin" : "34 23",
"unit" : "km",
"ranges" : [
{
"from" : 10,
"to" : 20
},
{
"from" : 20,
"to" : 50
}
]
}
}
}
}
2) Metrics : SQL의 aggregate 함수와 유사 (simple, count, average, sum..)
- sub-aggregations
select city, role, avg(work_time)
from users c left join work on id = cid
group by city, role;
위에 rdb select문을 elasticsearch로 구성
curl -XPOST http://localhost:9200/test/users/_search?pretty -d '{
"aggs" : {
"groupby_city" : {
"terms" : {
"field" : "city",
"size" : 5
},
"aggs" : {
"groupby_role" : {
"terms" : {
"field" : "role",
"size" : 5
}
}
},
"aggs" : {
"average" : {
"avg" : {
"field" : "work_time"
}
}
}
}
},
"size" : 1
}'
3) Pipeline
다른 aggregations 작업에 추가적으로 aggeraton을 적용하여 결과 생성
the_sum 적용후 추가적으로 the_movavq 적용후 결과생성
{
"my_date_histo":{
"date_histogram":{
"field":"timestamp",
"interval":"day"
},
"aggs":{
"the_sum":{
"sum":{ "field": "lemmings" }
},
"the_movavg":{
"moving_avg":{ "buckets_path": "the_sum" }
}
}
}
}
기타) value 스크립트 사용법
{
"aggs" : {
...
"aggs" : {
"avg_corrected_grade" : {
"avg" : {
"field" : "grade",
"script" : {
"inline": "_value * correction",
"params" : {
"correction" : 1.2
}
}
}
}
}
}
}
6. index
1) index 생성
curl -XPUT 'http://localhost:9200/twitter/' -d '{
"settings" : {
"index" : {
"number_of_shards" : 3,
"number_of_replicas" : 2
}
}
}'
2) index 맵핑
curl -XPOST localhost:9200/test -d '{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"type1" : {
"properties" : {
"field1" : { "type" : "string", "index" : "not_analyzed" }
}
}
}
}'
3) index Alias
curl -XPUT localhost:9200/test -d '{
"aliases" : {
"alias_1" : {},
"alias_2" : {
"filter" : {
"term" : {"user" : "kimchy" }
},
"routing" : "kimchy"
}
}
}'
4) index create date
index 생성시 create_date가 자동으로 생성되나 아래와 같이 수동으로 설정가능
curl -XPUT localhost:9200/test -d '{
"creation_date" : 1407751337000
}'
5) index delete
twitter 인덱스 삭제.
curl -XDELETE 'http://localhost:9200/twitter/'
6) index get
curl -XGET 'http://localhost:9200/twitter/'
curl -XGET 'http://localhost:9200/twitter/_settings,_mappings' -- filter, meta 정보 get
7) index exists
curl -XHEAD -i 'http://localhost:9200/twitter' -- 인덱스
curl -XHEAD -i 'http://localhost:9200/twitter/tweet' -- type 존재체크
8) index open/close
curl -XPOST 'localhost:9200/my_index/_close'
curl -XPOST 'localhost:9200/my_index/_open'
9) index put mapping
-- 신규 tweet type과 message 필드 추가
PUT twitter
{
"mappings": {
"tweet": {
"properties": {
"message": {
"type": "string"
}
}
}
}
}
-- user 타입에 name 필드 추가
PUT twitter/_mapping/user
{
"properties": {
"name": {
"type": "string"
}
}
}
10) index template
PUT /_template/template_1
{
"template": "te*",
"settings": {
"number_of_shards": 1
},
"mappings": {
"type1": {
"_source": {
"enabled": false
},
"properties": {
"host_name": {
"type": "string",
"index": "not_analyzed"
},
"created_at": {
"type": "date",
"format": "EEE MMM dd HH:mm:ss Z YYYY"
}
}
}
}
}
인덱스 생성시 적용
curl -XDELETE localhost:9200/_template/template_1 -- 삭제
curl -XGET localhost:9200/_template/template_1 -- 정보get
11) index 기타
- index stats
curl localhost:9200/index1,index2/_stats
- index segments
curl -XGET 'http://localhost:9200/test1,test2/_segments'
- index recovery
index recovery 정보 표시
curl -XGET http://localhost:9200/index1,index2/_recovery?pretty&human
- index shard 정보 표시
curl -XGET 'http://localhost:9200/test1,test2/_shard_stores'
- index clear cache
curl -XPOST 'http://localhost:9200/kimchy,elasticsearch/_cache/clear'
- index flush
메모리에 완료된 트랜잭션 데이터를 디스크로 이동
curl -XPOST 'http://localhost:9200/twitter/_flush'
- index merge
curl -XPOST 'http://localhost:9200/kimchy,elasticsearch/_forcemerge'
- index cat
verbose형태로 master 인덱스 내용 cat
curl 'localhost:9200/_cat/master?v'
'NoSQL > Elasticsearch' 카테고리의 다른 글
elasticsearch optimize api (0) | 2016.06.15 |
---|---|
elasticsearch warmers (0) | 2016.06.15 |
elasticsearch cluster 상태확인 (0) | 2016.06.14 |
elasticsearch 구성 (0) | 2016.06.13 |
es-hadoop (0) | 2016.06.07 |