3.3 배열과 다중 필드
3.3.1 배열
curl -XPUT 'localhost:9200/blog/posts/1' -d ' {
"tags" : ["first", "initial"]
}'
# 배열 필드는 mapping에서 정의하지 않아도 된다. (알아서 해준다)
3.3.2 다중 필드
curl -XPUT 'localhost:9200/blog/_mapping/posts' -d '{
"posts" : {
"properties" : {
"tags" : {
"type" : "string",
"index" : "analyzed",
"filed" : {
"verbatim" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
}
}
}'
# 문자열을 위한 다중 필드: 한 번은 analyzed, 다은 한 번은 not_analyzed를 사용
# 정확하게 일치하는 것을 가져오기 위해 not_analyzed 버전에서 검색하려면 tags.verbatim이라는 전체 경로를 지정해서 검색하면 된다.
3.4.1 도큐먼트를 저장하고 검색하는 방식 제어하기
curl -XGET 'localhost:9200/get-together/group/1?pretty&field=name'
# 특정 필드만 조회가 가능하다.
include_in_all 옵션을 사용해서 _all에 무엇이 포함되고 무엇이 그렇지 않을지 제어할 수 있다.
curl -XPUT 'localhost:9200/get-together/_mapping/custom-all' -d ' {
"custom-all" : {
"properties" ; {
"organizer" : {
"type" : "string",
"include_in_all" : false
}
}
}
}'
3.4.2 도큐먼트 식별하기
curl 'localhost:9200/get-together/group/1?fields&pretty'
{
"_index" : "get-together",
"_type" : "group",
"_id" : "1"
"_version" : 1,
"found" : true
}'
3.5.1 변경 (update) API 사용하기
curl 'localhost:9200/get-together/group/2?pretty'
curl -XPOST 'localhost:9200/get-together/group/2/_update' -d ' {
"doc" : {
"organizer" : "Roy"
}
}'
--> {"_index":"get-together","_type":"group","_id":"2","_version":2,"_shards":{"total":2,"successful":2,"failed":0}}
# 기존에 데이터가 있는지 확인 -> 새로 데이터를 색인 -> 기존 데이터 제거 과정을 거친다.
UPSERT로 존재하지 않는 도큐먼트 생성하기
curl -XPOST 'localhost:9200/get-together/group/2/_update' -d '{
"doc" : {
"organizer" : "Kim"
},
"upsert" : {
"name" : "Elasticsearch Denver",
"organizer" : "Roy"
}
}'
# "doc" 필드에 변경(혹은 새로)할 내용을 넣고 "upsert" 부분에 쿼리를 넣는다.
#스크립트로 도큐먼트 변경하기
curl -XPUT 'localhost:9200/online-shop/shirts/1' -d '
{
"caption" : "Learning Elasticsearch",
"price" : 15
}'
curl -XPOST 'localhost:9200/online-shop/shirts/1/_update' -d ' {
"script" : "ctx._source.price += price_diff",
"params" : {
"price_diff" : 10
}
}'
# Elasticsearch 버전 2.4 기준으로 elasticsearch.yml 에 다음 두 줄을 추가한다.
script.inline: true
script.indexed: true
3.6 데이터 삭제하기
3.6.1 도큐먼트 삭제하기
단일 도큐먼트 삭제하기
curl -XDELETE 'localhost:9200/online-shop/shirts/1'
색인 삭제하기
curl -XDELETE 'localhost:9200/get-together/'
3.6.3 색인 닫기
curl -XPOST 'localhost:9200/online-shop/_close'
# 읽기, 쓰기가 불가하고 메모리에 로드(Load)하지도 않는다.
다시 열고싶다면
curl -XPOST 'localhost:9200/online-shop/_open'
4. 데이터 검색
curl 'localhost:9200/get-together/_search?from=10&size=10'
------------------------------------------------------------------------------------------------
curl 'localhost:9200/get-together/_search?sort=date:asc&_source=title,date&pretty'
------------------------------------------------------------------------------------------------
curl 'localhost:9200/get-together/_search?sort=date:asc&q=title:elasticsearch&pretty'
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
4.1.4 응답 구조 이해하기
curl 'localhost:9200/_search?q=title:elasticsearch&_source=title,date&pretty&size=1'
{
"took" : 10, // 쿼리 실행 소요 시간 (milisecond)
"timed_out" : false, // 샤드 중 하나가 타임아웃이 발생하면 일부 결과만 보여줌을 명시
"_shards" : { // 요청에 응답한 성공 또는 실패한 샤드의 개수
"total" : 22,
"successful" : 22,
"failed" : 0
},
"hits" : {
"total" : 7, // 검색으로 일치한 결과 전체 개수
"max_score" : 1.049306, // 이 검색에서 전체 도큐먼트의 최고 점수
"hits" : [ {
"_index" : "get-together", // 결과 도큐먼트의 색인
"_type" : "event", // 결과 도큐먼트의 엘라스틱서치 타입
"_id" : "103", // 결과 도큐먼트의 id
"_score" : 1.049306, // 이 결과의 적합성 점수
"_routing" : "2",
"_parent" : "2",
"_source" : {
"date" : "2013-04-17T19:00",
"title" : "Introduction to Elasticsearch"
}
} ]
}
4.2 쿼리와 필터 DSL 소개
#match 쿼리
curl 'localhost:9200/get-together/event/_search?pretty' -d '
{
"query" : {
"match" : {
"title" : "hadoop"
}
}
}'
# 필터를 사용한 쿼리
curl 'localhost:9200/get-together/_search?pretty' -d '{
"query" : {
"filtered" : {
"query" : {
"match" : {
"title" : "hadoop"
}
},
"filter" : {
"term" : {
"host" : "andy"
}
}
}
}
}'
#filter 쿼리는 캐싱이 가능하고 일치를 하느냐 안하느냐 yes or no 만 따지기 때문에 스코어를 계산하는 "query"에 비해 속도가 빠르다.
#위 예제에서 "host"가 "andy"이냐 아니냐가 결과 소팅에 영향을 미치지 않으므로 filter 쿼리에 넣는것이 유리하다.
4.2.2 가장 많이 사용되는 기본 검색과 필터
#MATCH_ALL 쿼리 : 쿼리 대신 필터 사용이 필요할 때 상당히 유용하다.
#QUERY_STRING 쿼리
curl -XPOST 'localhost:9200/get-together/_search?pretty' -d '{
"query" : {
"query_string" : {
"query" : "nosql"
}
}
}'
#기본적으로 query_string쿼리는 "_all" 필드(모든 필드 결합)를 검색한다.
#아래와같이 특정 필드를 지정할 수도 있다.
curl -XPOST 'localhost:9200/get-together/_search?pretty' -d '{
"query" : {
"query_string" : {
"default_field" : "description",
"query" : "nosql"
}
}
}'
#도큐먼트의 필드와 필드 내에 있는 문자열 검색을 허용하는 term,terms,match,multi_match 쿼리를 포함하는 query_string쿼리는 다른 대체체로 교환하는 것을 추천한다.
#텀 쿼리와 텀 필터
curl 'localhost:9200/get-together/group/_search?pretty' -d ' {
"query" : {
"term" : {
"tags" : "elasticsearch"
}
},
"_source" : ["name", "tags"]
}'
curl 'localhost:9200/get-together/_search?pretty' -d ' {
"query" : {
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"term" : {
"tags" : "elasticsearch"
}
}
}
},
"_source" : ["name","tags"]
}'
#텀즈 쿼리
curl 'localhost:9200/get-together/group/_search?pretty' -d ' {
"query" : {
"terms" : {
"tags" : ["jvm", "hadoop"]
}
},
"_source" : ["name","tags"]
}'
#최소 개수의 텀 일치를 강제하려면 "minimum_should_match" 파라미터를 지정한다.
#[terms] query does not support [minimum_should_match]
curl 'localhost:9200/get-together/group/_search?pretty' -d ' {
"query" : {
"terms" : {
"tags" : ["jvm", "hadoop", "lucene"],
"minimum_should_match": 2
}
}
}'
4.2.3 매치 쿼리와 텀 필터
curl 'localhost:9200/get-together/group/_search?pretty' -d '{
"query" : {
"match" : {
"name" : "elasticsearch"
}
}
}'
#매치 쿼리는 몇몇 서로 다른 방식으로 동작할 수 있다. 가장 주요한 두 가지의 기능은 boolean과 phrase다.
#BOOLEAN 쿼리 기능
#기본적인 쿼리 연산은 "OR"연산이다. (ex. "name" : "Elasticsearch Denver" => "Elasticsearch" OR "Denver")
curl 'localhost:9200/get-together/_search?pretty' -d '{
"query" : {
"match" : {
"name" : {
"query" : "Elasticsearch Denver",
"operator" : "and"
}
}
}
}'
#PHRASE 쿼리 기능
curl 'localhost:9200/get-together/group/_search?pretty' -d '{
"query" : {
"match" : {
"name" : {
"type" : "phrase",
"query" : "enterprise london",
"slop" : 1
}
}
}
}'
#phrase는 말 그대로 문장으로 찾는것인데, 토큰 사이의 거리를 어느정도까지는 허용하는 옵션으로 "slop"을 쓸 수 있다. (default : 0)
4.2.4 Phrase_prefix 쿼리
curl 'localhost:9200/get-together/group/_search?pretty' -d '{
"query" : {
"match" : {
"name" : {
"type" : "phrase_prefix",
"query" : "Elasticsearch den", // Elasticsearch"를 포함하는 필드와 "den"으로 시작하는 텀으로 필드 일치
"max_expansions" : 1 // 시도할 프리픽스 확장의 최댓값을 지정
}
}
}
}'
#MULTI_MATCH로 다중 필드 일치
curl 'localhost:9200/get-together/_search?pretty' -d '{
"query" : {
"multi_match" : {
"query" : "elasticsearch hadoop",
"fields" : [ "name", "description" ]
}
}
}'
4.3.1 bool 쿼리
#must 매치 : 쿼리가 반환하는 오직 일치하는 결과만 받는다.
#should 매치 : 도큐먼트가 반환하는 특정 개수의 구문이 일치해야 한다는 의미다.
#must_not : 일치하는 도큐먼트가 결과셋에서 제외하는데 사용한다.
#ex) David가 참석한 이벤트를 검색하는데, Clint나 Andy중 하나는 참석해야하고 June 30, 2013보다 오래되지 않아야 한다.
curl 'localhost:9200/get-together/_search?pretty' -d '{
"query" : {
"bool" : {
"must" : [
{
"term" : {
"attendees" : "david"
}
}
],
"should" : [
{
"term" : {
"attendees" : "clint"
}
},
{
"term" : {
"attendees" : "andy"
}
}
],
"must_not" : [
{
"range" : {
"date" : {
"lt" : "2013-06-30T00:00"
}
}
}
],
"minimum_should_match" : 1
}
}
}
}'
4.4 매치와 필터 쿼리를 넘어서서
curl 'localhost:9200/get-together/_search?pretty' -d '{
"query" : {
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"range" : {
"created_on" : {
"gt" : "2012-01-01",
"lt" : "2016-12-31"
}
}
}
}
}
}'
#범위 쿼리는 문자열 범위까지 지원한다. (p178)
4.4.2 프리픽스 쿼리와 필터
curl 'localhost:9200/get-together/event/_search?pretty' -d '{
"query" : {
"prefix" : {
"title" : "liber"
}
}
}'
curl 'localhost:9200/get-together/event/_search?pretty' -d '{
"query" : {
"filtered" : {
"query" : { "match_all" : {} },
"filter" : {
"prefix" : {
"title" : "liber"
}
}
}
}
}'
4.4.3 와일드카드 쿼리
curl -XPOST 'localhost:9200/wildcard-test/doc/1' -d '
{ "title" : "The Best Bacon Ever" }'
curl -XPOST 'localhost:9200/wildcard-test/doc/2' -d '
{ "title" : "How to raise a barn" }'
curl 'localhost:9200/wildcard-test/_search?pretty' -d ' {
"query" : {
"wildcard" : {
"title" : {
"wildcard" : "ba*n"
}
}
}
}'
curl 'localhost:9200/wildcard-test/_search?pretty' -d ' {
"query" : {
"wildcard" : {
"title" : {
"wildcard" : "ba?n"
}
}
}
}'
4.5 존재하는 필드에 필터로 쿼리 #exists #missing
curl 'localhost:9200/get-together/_search?pretty' -d '{
"query" : {
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"exists" : {
"field" : "location_event.geolocation"
}
}
}
}
}'
'IT > Elasticsearch' 카테고리의 다른 글
[Elasticsearch] Monitoring Rest Api (0) | 2016.12.01 |
---|---|
[Elasticsearch] Elasticsearch In Action - 5 (0) | 2016.11.30 |
[config 설정] (0) | 2016.09.18 |
[ElasticSearch-1 start stop] (0) | 2016.09.12 |
[Elasticsearch] head plugin 설치 (0) | 2016.04.19 |