elasticsearch에 /를 포함하는 id를 저장하고 싶을때..

/를 사용하면 path 구분자에 걸린다. 


따라서 url에 / 대신 %2F를 사용하면 정상적으로 작동한다.




curl -X PUT "es.google.io:9200/google-host-staging/host/service.dos%2F0" -H 'Content-Type: application/json' -d'

{

   "service":"0",

   "host":"service.dos"

}

'






Posted by 김용환 '김용환'


elasticsearch5.4에서 _id만 저장하는 테스트를 진행했다.


 testcase 시나리오는 다음과 같다.


index를 생성한다.

_id만 저장한다.

_id를 읽는다. 정상적이면 성공, 그러나 실패



성공한 것처럼 보인다... 그러나, 실제 curl로 _id를 document를 요청하면 데이터는 없다고 나온다!!


(사실 문법 에러는 아니지만,, 저장은 안해.. 라는 것으로 보인다)



따라서 아무리 간단한 데이터를 저장하더라도 _id와 field 데이터 하나 정도는 저장해야 디스크에 저장하길 바란다.

(당연하지만..)






Posted by 김용환 '김용환'


curl을 이용하다가 다음과 같은 es 에러가 발생할 수 있다.


{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406} 



curl 다음에 다음 매개 변수를 주면 에러가 발생하지 않을 것이다. 5에 비해 많이 strict 해졌다.


--header 'content-type: application/json'

 -H 'Content-Type: application/json'


Posted by 김용환 '김용환'



https://www.elastic.co/blog/elasticsearch-6-3-0-released


1. SQL을 지원한다.


SELECT * FROM my-type WHERE (demodata LIKE '%ell%' OR demodata LIKE '%orld%') AND (field1 LIKE '%red%' OR demodata LIKE '%yellow%')


2. java 10을 지원한다.



3.job 생성 가능하다.

https://www.elastic.co/guide/en/elasticsearch/reference/current/rollup-put-job.html

Posted by 김용환 '김용환'



일래스틱서치(elasticsearch) 6에서 템플릿 목록 보기


$ curl -s "http://es-server:9200/_cat/templates?v&s=order:desc,template"


name                                         template                                order version

slowlog                                      *                                                    0

template_name                            google_api-*                              0



특정 템플릿을 살펴보기


$ curl -s http://es-server:9200/_template/템플릿_이름 | python -mjson.tool


자세한 정보 나옴.




특정 템플릿 저장하기


$ curl -XPUT -H "Content-type:application/json" http://es-server:9200/_template/템플릿_이름 -d @파일이름



Posted by 김용환 '김용환'

일래스틱서치 6.x부터 APM XPACK을 사용할 수 있다고 한다. 


https://www.elastic.co/blog/elastic-apm-ga-released?elektra=home&storm=banner



 



Posted by 김용환 '김용환'



elasticsearch에서 pagination을 하고 싶다면, search_after를 사용한다.


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


위 url에서 제공하는 간단한 예제는 다음과 같다. 


GET twitter/tweet/_search

{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "search_after": [1463538857, "654323"],
    "sort": [
        {"date": "asc"},
        {"_id": "desc"}
    ]
}






여러 날짜별로 분리된 인덱스에서도 search_after를 사용할 수 있다.  


다음 예제는 search_after를 활용할 수 있도록 2개의 필드로 소팅하고 2개의 특정 값으로 pagination하는 예제이다. 




curl -XGET 'http://search.google.io:9200/plus.-*/_search?pretty' -H 'Content-Type: application/json' -d'

{  

   "version":true,

   "query":{  

      "bool":{  

         "must":[  

            {  

               "match_all":{        }

            },

            {  

               "range":{  

                  "@timestamp":{  

                     "gte":"2018-01-31T16:52:07+09:00",

                     "lte":"2018-01-31T17:52:07+09:00"

                  }

               }

            }

         ]

      }

   },

   "size":11,

   "sort":[  

      {  

         "@timestamp":{  

            "order":"desc"

         }

      },

      {  

         "_uuid.keyword":{  

            "order":"asc"

         }

      }

   ]

}

'



curl -XGET 'http://search.google.io:9200/plus-*/_search?pretty' -H 'Content-Type: application/json' -d'

{  

   "version":true,

   "query":{  

      "bool":{  

         "must":[  

            {  

               "match_all":{  


               }

            },

            {  

               "range":{  

                  "@timestamp":{  

                     "gte":"2018-01-31T16:52:07+09:00",

                     "lte":"2018-01-31T17:52:07+09:00"

                  }

               }

            }

         ]

      }

   },

   "size":11,

   "search_after":[  

      "1517388213000",

      "f938251211a3"

   ],

   "sort":[  

      {  

         "@timestamp":{  

            "order":"desc"

         }

      },

      {  

         "_uuid.keyword":{  

            "order":"asc"

         }

      }

   ]

}

'




Posted by 김용환 '김용환'

일래스틱서치에 uuid로 소팅하고 싶은데, 에러가 발생했다. 


(쿼리)

 curl -XGET 'localhost:9200/google_plus_data/_search?pretty' -H 'Content-Type: application/json' -d'

{

  "query": { "match_all": {} },

  "size": 10,

  "sort": [ 

            { "@timestamp": "desc" } ,

            { "_uuid": "asc" } 

          ]

}'




(에러)


"reason" : "Fielddata is disabled on text fields by default. Set fielddata=true on [_uuid] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."




에러 관련해서 문서를 보면 먼가 작업을 해야 할 것 같지만..

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/fielddata.html


uuid는 keyword라는 필드가 있어서.. 사용하면 작 동작한다.



 curl -XGET 'localhost:9200/google_plus_data/_search?pretty' -H 'Content-Type: application/json' -d'

{

  "query": { "match_all": {} },

  "size": 10,

  "sort": [ 

            { "@timestamp": "desc" } ,

            { "_uuid.keyword": "asc" } 

          ]

}'





Posted by 김용환 '김용환'


elasticsearch의 5.x에는 기존의 무거웠던 from+size와 scroll api를 대체하는 search_after가 있다. 

전에 scroll을 써보면서 얼마나 무겁고,메모리가 이슈였다.(state기반)

search_after는 live cursor를 제공하면서 stateless이기 때문에 성능을 최적화할 수 있는 것 같다.


https://www.elastic.co/guide/en/elasticsearch/reference/5.6/search-request-search-after.html#search-request-search-after


Pagination of results can be done by using the from and size but the cost becomes prohibitive when the deep pagination is reached. The index.max_result_window which defaults to 10,000 is a safeguard, search requests take heap memory and time proportional to from + size. The Scroll api is recommended for efficient deep scrolling but scroll contexts are costly and it is not recommended to use it for real time user requests. The search_after parameter circumvents this problem by providing a live cursor. The idea is to use the results from the previous page to help the retrieval of the next page.





search_after를 사용해 특정 시간 범위의 HTTP라는 값을 찾고 pagination을 하고 싶은 때의 예제이다.


처음 시도할 때는 search_after를 시도하지 않고 ordering을 잘해야 한다. 동일 시간대에 uid를 기준으로 진행한다.



$ curl log.google.io
:9200/log-2017.11.14/logstash/_search?pretty=true -d '{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "_all": "*HTTP*"
          }
        },
        {
          "range": {
            "@timestamp": {
              "gte": "2017-11-14T11:00:00+09:00",
              "lte": "2017-11-14T12:00:00+09:00"
            }
          }
        }
      ]
    }
  },
  "size":3,
  "sort":[
      {
          "@timestamp":{"order":"asc"},
          "_uid": { "order": "desc" }
      }
   ]

}'





확인하면 다음과 같은 결과가 나올 것이다. 



{
  "took" : 94,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "failed" : 0
  },
  "hits" : {
    "total" : 488876,
    "max_score" : null,
    "hits" : [
      {
        "_index" : "log-2017.11.14",
        "_type" : "logstash",
        "_id" : "log-1d8a4f45-a15f-41bf-95f2-399c88844b60",
        "_score" : null,
        "_source" : {
          "pid" : "13434",
          "severity" : "INFO",
          "ident" : "nova.metadata.wsgi.server",
          "message" : "[-] 1.1.1.1 \"GET /latest/meta-data/ami-id HTTP/1.1\" status: 200 len: 129 time: 0.0031130",
          "hostname" : "eastzone-pg1-api001",
          "node" : "openstack_control",
          "type" : "nova_api",
          "phase" : "pg1",
          "@timestamp" : "2017-11-14T11:00:00+09:00",
          "_uuid" : "log-1d8a4f45-a15f-41bf-95f2-399c88844b60",
        },
        "sort" : [
          1510624800000,
          "logstash#log-1d8a4f45-a15f-41bf-95f2-399c88844b60"
        ]
      },
      {
        "_index" : "log-2017.11.14",
        "_type" : "logstash",
        "_id" : "log-ae067d5d-0d90-4414-ad6c-1c7cf286f95c",
        "_score" : null,
        "_source" : {
          "pid" : "4386",
          "severity" : "INFO",
          "ident" : "nova.osapi_compute.wsgi.server",
          "message" : "[-] 10.197.12.118,10.60.19.248 \"GET /v2/1ba72e3bdbe8491ba851f2f9fb4eb6f1/servers/a6c14368-1816-4908-8cab-0b97fed31f40/ips HTTP/1.1\" status: 401 len: 297 time: 0.0048220",
          "hostname" : "eastzone-pg1-api004",
          "node" : "openstack_control",
          "type" : "nova_api",
          "phase" : "pg1",
          "@timestamp" : "2017-11-14T11:00:00+09:00",
          "_uuid" : "log-ae067d5d-0d90-4414-ad6c-1c7cf286f95c",
        },
        "sort" : [
          1510624800000,
          "logstash#log-ae067d5d-0d90-4414-ad6c-1c7cf286f95c"
        ]
      },
      {
        "_index" : "log-2017.11.14",
        "_type" : "logstash",
        "_id" : "log-9ddf30a2-cfc1-4b76-b50b-5f4bcae02a94",
        "_score" : null,
        "_source" : {
          "pid" : "4431",
          "severity" : "INFO",
          "ident" : "nova.metadata.wsgi.server",
          "message" : "[-] 10.60.34.9,10.60.19.248 \"GET /latest/meta-data/public-ipv4 HTTP/1.1\" status: 200 len: 116 time: 0.0032690",
          "hostname" : "eastzone-pg1-api004",
          "node" : "openstack_control",
          "type" : "nova_api",
          "phase" : "pg1",
          "@timestamp" : "2017-11-14T11:00:00+09:00",
          "_uuid" : "log-9ddf30a2-cfc1-4b76-b50b-5f4bcae02a94",
        },
        "sort" : [
          1510624800000,
          "logstash#log-9ddf30a2-cfc1-4b76-b50b-5f4bcae02a94"
        ]
      }
    ]
  }




맨 마지막 uuid를 기반으로 uid를 생성한다. uid는 type과 uuid를 합친 것이다. (디폴트로 uuid는 사용할 수 없다. 검색안되고, 인덱스도 안됨)



$ curl log.google.io:9200/log-2017.11.14/logstash/_search?pretty=true -d '{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "_all": "*HTTP*"
          }
        },
        {
          "range": {
            "@timestamp": {
              "gte": "2017-11-14T11:00:00+09:00",
              "lte": "2017-11-14T12:00:00+09:00"
            }
          }
        }
      ]
    }
  },
  "search_after": ["1510624800000", "logstash#log-9ddf30a2-cfc1-4b76-b50b-5f4bcae02a94"],
  "size":3,
  "sort":[
      {
          "@timestamp":{"order":"asc"},
          "_uid": { "order": "desc" }
      }
   ]

}'





결과 잘 나옴.. 







Posted by 김용환 '김용환'


elasticsearch에서 _id로 검색 하지만 실패한다. 

_id 필드는 기본적으로 인덱스도 저장도 하지 않는다.  따라서 _uid를 대신 사용해야 한다.



  "error" : {

    "root_cause" : [

      {

        "type" : "illegal_argument_exception",

        "reason" : "Fielddata is not supported on field [_id] of type [_id]"

      }

    ],

Posted by 김용환 '김용환'