본문 바로가기

IT/Elasticsearch

[Elasticsearch] Elasticsearch In Action - 3,4

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'
------------------------------------------------------------------------------------------------

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'

------------------------------------------------------------------------------------------------

curl 'localhost:9200/get-together/_search?pretty' -d ' {
    "query" : {
        "match_all" : {}
    },
    "from" : 10,
    "size" : 10
}'
------------------------------------------------------------------------------------------------
curl 'localhost:9200/get-together/_search?pretty' -d ' {
    "query" : {
        "match_all" : {}
    },
    "_source" : {
        "include" : ["location_event", "name"]
    }
}'
------------------------------------------------------------------------------------------------
curl 'localhost:9200/get-together/_search?pretty' -d ' {
    "query" : {
        "match_all" : {}
    },
    "sort" : [
        {"created_on" : "asc"},
        {"name" : "desc"},
        "_score"
    ]
}'
# sort 순서는 위에서부터 아래로. 결과의 "sort" 필드 확인.

------------------------------------------------------------------------------------------------


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