Kita boleh guna antaramuka Kibana untuk membuat carian keatas index dalam Elasticsearch. Tetapi Elasticsearch mempunyai banyak API yang kita boleh gunakan untuk membuat carian. Dalam hal ini saya gunakan Search API dan curl untuk dapatkan hasil carian dalam format json.

Dalam contoh dibawah saya mahu senarai URL (url adalah kekunci) dalam index untuk tempoh 24 jam yang lalu.

curl   -H 'Authorization: ApiKey kekunci_API_nama_akaun_base64_disini ' -XGET 'https://URL_ELASTICSEARCH/namaindex-*/_search/' -H 'Content-Type: application/json' -d '{"size": 10000,  "_source": ["url","timestamp","src_ip"], "query":{ "bool":{ "must": [{"match":{"url":"http"}}], "filter": {"range": {"@timestamp": {"gte": "now-1d/d", "lte": "now/d" }} }  }}}' | jq ' .hits.hits[] | {timestamp: ._source.timestamp, url: ._source.url, src_ip: ._source.src_ip  }' 

Ada beberapa perkara yang perlu perhatian di sini:

  1. Perlu guna kekunci API untuk pengesahan.
  2. Nama index bergantung kepada setup elasticsearch masing-masing
  3. Kita akan gunakan ElasticSearch DSL Query
  4. Dalam contoh diatas DSL Query adalah seperti berikut. Biasanya saya akan guankan developer console kibana untuk membuat & menguji pertanyaan:
GET _search
{
 "size": 10000, 
 "_source": ["@timestamp","url","src_ip"], 
  "query": {
    "bool": {
      "must": {
        "match" : {"url": "http"}
        
      }, 
    "filter": [
      {"range": {
        "@timestamp": {
          "gte": "now-1d/d",
          "lte": "now/d"
        }
      }}
    ]
    }
  }
}

  1. Kita gunakan pertanyaan boolean must dan filter. Dalam kata lain, hasil yang kita hendak adalah “mesti ada http dalam kekunci url”. Kemudia kita saring hasil carian dengan tempoh (range) 24 jam berdasarkan kekunci timestamp
  2. _source mengandui susunan kekunci yang kita perlu (timestamp, url, dan src_ip sahaja). Jadi Elasticsearch tidak perlu membalas dengan json dokumen penuh.
  3. Saya guna jq untuk format output json

Adli @ rumah