Elaticsearch REST API常用技巧


在Elasticsearch的REST API中,有很多使用技巧,這里針對官方文檔給出的介紹,總結了幾個常用的例子。

更多內容參考:Elastisearch文檔總結

多索引

ES支持在一次請求中指定多個索引,可以使用通配符或者日期表達式的方式:

例如,foo*索引會匹配foo1,foo2,foo3等索引。_all則會匹配所有的索引。

同時也可以針對不可用的索引進行限制。

 

日期表達式支持如下的格式:

<static_name{date_math_expr{date_format|time_zone}}>

static_name是索引的靜態部分

date_math_expr是日期表達式

后面跟着date_format是日期的格式;time_zone為時區

舉個例子,如果想要查詢logstash前兩天的日期,可以寫成:

curl -XGET 'localhost:9200/<logstash-{now/d-2d}>/_search' {
  "query" : {
    ...
  }
}

再比如,當前的時間是2014年3月22日,那么:

<logstash-{now/d}> 會匹配 logstash-2024.03.22
<logstash-{now/M}> 會匹配 logstash-2024.03.01
<logstash-{now/M{YYYY.MM}}> 會匹配 logstash-2024.03
<logstash-{now/M-1M{YYYY.MM}}> 會匹配 logstash-2024.02
<logstash-{now/d{YYYY.MM.dd|+12:00}} 會匹配 logstash-2024.03.23

過去三天的索引可以表示為:

curl -XGET 'localhost:9200/<logstash-{now/d-2d}>,<logstash-{now/d-1d}>,<logstash-{now/d}>/_search' {
  "query" : {
    ...
  }
}

過濾

所有的API都可以接受一個參數,filter_path,這個參數指定了過濾后的字段,返回的結果只會顯示過濾指定的內容:

curl -XGET 'localhost:9200/_search?pretty&filter_path=took,hits.hits._id,hits.hits._score'
{
  "took" : 3,
  "hits" : {
    "hits" : [
      {
        "_id" : "3640",
        "_score" : 1.0
      },
      {
        "_id" : "3642",
        "_score" : 1.0
      }
    ]
  }
}

支持使用通配符,進行匹配

curl -XGET 'localhost:9200/_nodes/stats?filter_path=nodes.*.ho*'
{
  "nodes" : {
    "lvJHed8uQQu4brS-SXKsNA" : {
      "host" : "portable"
    }
  }
}

如果使用了兩個**則會匹配所有的內容

curl 'localhost:9200/_segments?pretty&filter_path=indices.**.version'
{
  "indices" : {
    "movies" : {
      "shards" : {
        "0" : [ {
          "segments" : {
            "_0" : {
              "version" : "5.2.0"
            }
          }
        } ],
        "2" : [ {
          "segments" : {
            "_0" : {
              "version" : "5.2.0"
            }
          }
        } ]
      }
    },
    "books" : {
      "shards" : {
        "0" : [ {
          "segments" : {
            "_0" : {
              "version" : "5.2.0"
            }
          }
        } ]
      }
    }
  }
}

如果要過濾_source,那么需要重新指定_source中的字段:

curl -XGET 'localhost:9200/_search?pretty&filter_path=hits.hits._source&_source=title'
{
  "hits" : {
    "hits" : [ {
      "_source":{"title":"Book #2"}
    }, {
      "_source":{"title":"Book #1"}
    }, {
      "_source":{"title":"Book #3"}
    } ]
  }
}

結果內容扁平化

使用flat_settings參數,它只會影響到返回的內容顯示,例如設置為true后返回的內容是下面這種:

{
  "persistent" : { },
  "transient" : {
    "discovery.zen.minimum_master_nodes" : "1"
  }
}

而設置為false,則為:

{
  "persistent" : { },
  "transient" : {
    "discovery" : {
      "zen" : {
        "minimum_master_nodes" : "1"
      }
    }
  }
}

返回內容格式化

正常返回的數據,可能是混雜在一行的,人的肉眼很難分別其中的信息,這時,可以再請求的末尾添加?pretty=true,或者?format-yaml設置成可讀的形式。

pretty是以JSON的形式返回結果。直接寫?pretty與?pretty=true作用一樣

yaml則是使用橫向縮進的方式展現結果。

返回結果可讀

返回的結果設置為可讀,對於我們肉眼去觀察結果也很重要,比如:

"exists_time": "1h"
"size": "1kb"

要比

"exists_time_in_millis": 3600000
"size_in_bytes": 1024

容易理解的多

參考

【1】YAML格式

【2】ElastICsearch APIs


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM