ElasticSearch 索引查詢使用指南——詳細版

  1. 咱們一般用用_cat API檢測集羣是否健康。 確保9200端口號可用:

  curl 'localhost:9200/_cat/health?v'html

 

  綠色表示一切正常, 黃色表示全部的數據可用可是部分副本尚未分配,紅色表示部分數據由於某些緣由不可用.node

 

  2.經過以下語句,咱們能夠獲取集羣的節點列表:git

  curl 'localhost:9200/_cat/nodes?v'

 

  3。經過以下語句,列出全部索引:github

  curl 'localhost:9200/_cat/indices?v'

  返回結果:json

     

 

 

  4.建立索引curl

  如今咱們建立一個名爲「customer」的索引,而後再查看全部的索引:elasticsearch

 curl -XPUT 'localhost:9200/customer?pretty'
 curl 'localhost:9200/_cat/indices?v'

 

  結果以下:ide

   

 

   

 

  上圖中紅框所表示的是:咱們有一個叫customer的索引,它有五個私有的分片以及一個副本,在它裏面有0個文檔。學習

 

  5.插入和獲取ui

  如今我麼插入一些數據到集羣索引。咱們必須給ES指定因此的類型。以下語句:"external" type, ID:1:

  主體爲JSON格式的語句: { "name": "John Doe" }

  curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
  {
           "name": "John Doe"
  }'

 

  返回結果爲:create:true 表示插入成功。

   

 

  獲取GET,語句以下:

   curl -XGET 'localhost:9200/customer/external/1?pretty'

  其中含義爲:獲取customer索引下類型爲external,id爲1的數據,pretty參數表示返回結果格式美觀。

   

 

  6.刪除索引 DELETE

  curl -XDELETE 'localhost:9200/customer?pretty'
  curl 'localhost:9200/_cat/indices?v'

   

  表示索引刪除成功。

 

  7.經過以上命令語句的學習,咱們發現索引的增刪改查有一個相似的格式,總結以下:

  curl -X<REST Verb> <Node>:<Port>/<Index>/<Type>/<ID>

  <REST Verb>:REST風格的語法謂詞

  <Node>:節點ip

  <port>:節點端口號,默認9200

  <Index>:索引名

  <Type>:索引類型

  <ID>:操做對象的ID號

  8 修改數據

  curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
  {
    "name": "John Doe"
  }'
  curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
  {
    "name": "Jane Doe"
  }'

  上述命令語句是:先新增id爲1,name爲John Doe的數據,而後將id爲1的name修改成Jane Doe。

  9.更新數據

  9.1 這個例子展現如何將id爲1文檔的name字段更新爲Jane Doe:

  curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
  {
    "doc": { "name": "Jane Doe" }
  }'

 

  9.2 這個例子展現如何將id爲1數據的name字段更新爲Jane Doe同時增長字段age爲20:

  curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
  {
    "doc": { "name": "Jane Doe", "age": 20 }
  }'

  9.3  也能夠經過一些簡單的scripts來執行更新。一下語句經過使用script將年齡增長5:

  curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
  {
    "script" : "ctx._source.age += 5"
  }'

  10 刪除數據

  刪除數據那是至關的直接. 下面的語句將執行刪除Customer中ID爲2的數據:

  curl -XDELETE 'localhost:9200/customer/external/2?pretty'

  11 批處理

  舉例:

  下面語句將在一個批量操做中執行建立索引:

  curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
  {"index":{"_id":"1"}}
  {"name": "John Doe" }
  {"index":{"_id":"2"}}
  {"name": "Jane Doe" }
  '

  下面語句批處理執行更新id爲1的數據而後執行刪除id爲2的數據

  curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
  {"update":{"_id":"1"}}
  {"doc": { "name": "John Doe becomes Jane Doe" } }
  {"delete":{"_id":"2"}}
  '

 

  12.導入數據集

  你能夠點擊這裏下載示例數據集:accounts.json

  其中每一個數據都是以下格式:

 

  {
         "index":{"_id":"1"}
  }
  {
      "account_number": 0,
      "balance": 16623,
      "firstname": "Bradshaw",
      "lastname": "Mckenzie",
      "age": 29,
      "gender": "F",
      "address": "244 Columbus Place",
      "employer": "Euron",
      "email": "bradshawmckenzie@euron.com",
      "city": "Hobucken",
      "state": "CO"
  }

 

  導入示例數據集:

 

  curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary "@accounts.json"
  curl 'localhost:9200/_cat/indices?v'

   

 

  上圖紅框表示咱們已經成功批量導入1000條數據索引到bank索引中。

  13.查詢

  Sample:

 

  curl 'localhost:9200/bank/_search?q=*&pretty'
  {
      "took" : 63,
      "timed_out" : false,
      "_shards" : {
      "total" : 5,
      "successful" : 5,
      "failed" : 0
    },
  "hits" : {
    "total" : 1000,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "1",
      "_score" : 1.0, "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
    }, {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "6",
      "_score" : 1.0, "_source" : {"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}
    }, {
      "_index" : "bank",
      "_type" : "account",

 

 

  上面示例返回全部bank中的索引數據。其中 q=*  表示匹配索引中全部的數據。

 

  等價於:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match_all": {} }
  }'

 

 

  14 查詢語言

 

  匹配全部數據,但只返回1個:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

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

    "size": 1

  }'

  注意:若是siez不指定,則默認返回10條數據。

 

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

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

    "from": 10,

    "size": 10

  }'

 

  返回從11到20的數據。(索引下標從0開始)

 

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

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

    "sort": { "balance": { "order": "desc" } }

  }'

 

  上述示例匹配全部的索引中的數據,按照balance字段降序排序,而且返回前10條(若是不指定size,默認最多返回10條)。

 

  15.執行搜索

 

  下面例子展現如何返回兩個字段(account_number balance)

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

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

    "_source": ["account_number", "balance"]

  }'

   

 

 

  返回account_number 爲20 的數據:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match": { "account_number": 20 } }
  }'

 

  返回address中包含mill的全部數據::

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match": { "address": "mill" } }
  }'

  返回地址中包含mill或者lane的全部數據:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match": { "address": "mill lane" } }
  }'

 

 

  和上面匹配單個詞語不一樣,下面這個例子是多匹配(match_phrase短語匹配),返回地址中包含短語 「mill lane」的全部數據:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match_phrase": { "address": "mill lane" } }
  }'

 

  如下是布爾查詢,布爾查詢容許咱們將多個簡單的查詢組合成一個更復雜的布爾邏輯查詢。

  這個例子將兩個查詢組合,返回地址中含有mill和lane的全部記錄數據:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": {
      "bool": {
        "must": [
          { "match": { "address": "mill" } },
          { "match": { "address": "lane" } }
        ]
      }
    }
  }'

  上述例子中,must表示全部查詢必須都爲真才被認爲匹配。

 

  相反, 這個例子組合兩個查詢,返回地址中含有mill或者lane的全部記錄數據:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": {
      "bool": {
        "should": [
          { "match": { "address": "mill" } },
          { "match": { "address": "lane" } }
        ]
      }
    }
  }'

 

  上述例子中,bool表示查詢列表中只要有任何一個爲真則認爲匹配。

 

  下面例子組合兩個查詢,返回地址中既沒有mill也沒有lane的全部數據:

 

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": {
      "bool": {
        "must_not": [
          { "match": { "address": "mill" } },
          { "match": { "address": "lane" } }
        ]
      }
    }
  }'

  上述例子中,must_not表示查詢列表中沒有爲真的(也就是全爲假)時則認爲匹配。

 

  咱們能夠組合must、should、must_not來實現更加複雜的多級邏輯查詢。

 

  下面這個例子返回年齡大於40歲、不居住在ID的全部數據:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": {
      "bool": {
        "must": [
          { "match": { "age": "40" } }
        ],
        "must_not": [
          { "match": { "state": "ID" } }
        ]
      }
    }
  }'

 

 

  16.過濾filter(查詢條件設置)

 

  下面這個例子使用了布爾查詢返回balance在20000到30000之間的全部數據。

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

      "query": {

        "bool": {

          "must": { "match_all": {} },

          "filter": {

            "range": {

            "balance": {

              "gte": 20000,

              "lte": 30000

            }

          }

        }

      }

    }

  }'

 

 

  17 聚合 Aggregations

  下面這個例子: 將全部的數據按照state分組(group),而後按照分組記錄數從大到小排序,返回前十條(默認):

 

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

    "size": 0,

    "aggs": {

      "group_by_state": {

        "terms": {

           "field": "state"

        }

      }

    }

  }'

 

  注意:咱們設置size=0,不顯示查詢hits,由於咱們只想看返回的聚合結果。

   

 

 

   

 

  上述語句相似於如下SQL語句:

  SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC

 

 

 

  下面這個實例按照state分組,降序排序,返回balance的平均值:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

    "size": 0,

    "aggs": {

      "group_by_state": {

        "terms": {

          "field": "state"

        },

        "aggs": {

          "average_balance": {

            "avg": {

              "field": "balance"

            }

          }

        }

      }

    }

  }'

   

相關文章
相關標籤/搜索