天天看點

ElasticSearch:Rest API操作

Rest

一種軟體架構風格,而不是标準,隻是提供了一組設計原則和限制條件。它主要用于用戶端和伺服器互動類的軟體。基于這個風格設計的軟體可以更簡潔,更有層次,更易于實作緩存等機制。

也是PUT,POST,DELETE,GET這些操作。

method url位址 描述
PUT(建立,修改) IP:9200/索引名稱/類型名稱/文檔id 建立文檔(指定文檔id)
POST(建立) IP:9200/索引名稱/類型名稱 建立文檔(随機文檔id)
POST(修改) IP:9200/索引名稱/類型名稱/文檔id/_update 修改文檔
DELETE(删除) IP:9200/索引名稱/類型名稱/文檔id 删除文檔
GET(查詢) IP:9200/索引名稱/類型名稱/文檔id 查詢文檔通過文檔ID
POST(查詢) IP:9200/索引名稱/類型名稱/文檔id/_search 查詢所有資料

ES Rest API 思維導圖

ElasticSearch:Rest API操作

叢集API

關于叢集的一些Rest API

# 查詢叢集健康狀态
GET _cluster/health      
ElasticSearch:Rest API操作
# 查詢所有節點
GET _cat/nodes      
ElasticSearch:Rest API操作
# 查詢索引及分片的分布
GET _cat/shards      

因為我沒有建立索引,這些索引應該都是elasticsearch内部和kibana的一些索引

ElasticSearch:Rest API操作
# 查詢指定索引分片的分布  後面跟着索引名稱就行
GET _cat/shards/.kibana_7.16.2_001      
# 查詢所有插件
GET _cat/plugins      
ElasticSearch:Rest API操作

索引相關資訊查詢

不一個一個試了

# 查詢所有索引及容量
GET _cat/indices      
# 查詢索引映射結構
GET my_index/_mapping      
# 查詢所有索引映射結構    
GET _all      
# 查詢所有的相同字首索引
GET my-*/_search      
# 查詢所有索引模闆   
GET _template      
# 查詢具體索引模闆
GET _template/my_template      

建立索引以及文檔

也可以使用POST ,POST 指令新增資料時, 如果不傳id, 則系統自動生成一個UUID,類似于資料庫的主鍵,是資料的唯一辨別

//依次為索引,類型,文檔
PUT /testxt/typext/1
{
  "name" : "xt",
  "age" : 24
}      
ElasticSearch:Rest API操作

使用 ElasticSearch Head 插件也可以檢視

ElasticSearch:Rest API操作
ElasticSearch:Rest API操作

按指定字段類型建立索引

mappings 就是建立規則,指定那個屬性是什麼類型的字段,就和資料庫一樣

PUT /testxt2
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
        "index": true   //可以被索引,false 為不能被索引,預設為true
      },
      "age":{
        "type": "long"
      },
      "birthday":{
        "type": "date"
      }
    }
  }
}      
ElasticSearch:Rest API操作

擷取索引的詳細資訊

GET testxt2      
ElasticSearch:Rest API操作

如果我們的索引沒有像上面一樣建立規則mappings,ElasticSearch 也會自動幫助我們比對合适的類型。_doc 預設類型(default type),type 在未來的版本中會逐漸棄用,是以産生一個預設類型進行代替。如下圖所示

ElasticSearch:Rest API操作

我們這裡顯示建立指定_doc

PUT /testxt3/_doc/1
{
  "name": "xt",
  "age": 24,
  "birth": "1998-02-08"
}
GET testxt3      
ElasticSearch:Rest API操作

通過get _cat/ 可以擷取ElasticSearch的目前的很多資訊!

GET _cat/indices
GET _cat/aliases
GET _cat/allocation
GET _cat/count
GET _cat/fielddata
GET _cat/health
GET _cat/indices
GET _cat/master
GET _cat/nodeattrs
GET _cat/nodes
GET _cat/pending_tasks
GET _cat/plugins
GET _cat/recovery
GET _cat/repositories
GET _cat/segments
GET _cat/shards
GET _cat/snapshots
GET _cat/tasks
GET _cat/templates
GET _cat/thread_pool      

後面加個?v可以顯示每個屬性的名稱

ElasticSearch:Rest API操作

修改文檔資料

PUT修改(全局覆寫)

會覆寫原來的值

  • 版本+1(_version)
  • 但是如果漏掉某個字段沒有寫,那麼更新是沒有寫的字段 ,會消失
//版本号會增加,無論資料有沒有變動,版本号都會加一,因為是覆寫
PUT /testxt3/_doc/1
{
  "name" : "I am xt",
  "age" : 23,
  "birth" : "2000-07-26"
}
GET /testxt3/_doc/1      
ElasticSearch:Rest API操作
// 修改會有字段丢失
PUT /testxt3/_doc/1
{
  "name" : "xt",
  "age"  : 24
}
GET /testxt3/_doc/1      
ElasticSearch:Rest API操作

POST修改(局部更新)

  • 不會丢失字段
  • 如果資料一緻,多次請求,版本号不會增加,與PUT覆寫不同
POST /testxt3/_doc/1/_update
{
  "doc":{
    "name" : "post修改,version不會加一",
    "age" : 100
  }
}
GET /testxt3/_doc/1      
ElasticSearch:Rest API操作

删除索引

隻是邏輯删除, 将其标記為delete, 當資料越來越多時, ES會自動實體删除.

GET /testxt
DELETE /testxt
GET /testxt      

查詢資料

GET /testxt3/_doc/_search?q=name:xt      
ElasticSearch:Rest API操作

查詢工具使用

也可以使用多種工具

  • match:比對(會使用分詞器解析(先分析文檔,然後進行模糊查詢))
  • _source:過濾字段(隻保留這部分字段)
  • sort:排序(來控制查詢結果的展示)
  • from、size 來控制分頁
// 查詢比對
  GET /index/type/_search
  {
    "query":{
      "match":{  //match_phrase 不會拆分的模糊查詢,會将xt當成一整個詞
        "name":"xt"  // 查找name 為xt的資料   可以寫多個,用空格分割開,表示多個條件,類似于or表達式
      }
    }
    ,
    "_source": ["name","desc"] //保留這些字段
    ,
    "sort": [
      {
        "age": {
          "order": "asc"  //将查詢到的結果按照升序排列
        }
      }
    ]
    ,
    "from": 0  //從第一條查詢到的資料開始分頁
    ,
    "size": 2    //每一頁設定有多少條資料
  }      

多條件查詢

(bool裡面加入多種限制條件)

  • must 相當于 and
  • should 相當于 or
  • must_not 相當于 not (… and …)
  • filter 資料過濾

利用filter過濾來對指定字段進行一個range範圍控制的時候要用到的

  • gt 大于
  • gte 大于等于
  • lt 小于
  • lte 小于等于
GET /index/type/_search
{
  "query":{
    "bool": {
      "must": [
        {
          "match":{
            "age":24
          }
        },    // 比對年級為24同時姓名為xt的
        {
          "match": {
            "name": "xt"
          }
        }
      ],
      "filter": {
        "range": {    
          "age": {   //對age 字段做一個範圍控制
            "gte": 1,   
            "lte": 100
          }
        }
      }
    }
  }
}      

插入多條資料做測試使用

PUT /testxt3/_doc/2
{
  "name" : "elasticsearch",
  "age" : 67,
  "desc" : "I am elasticsearch"
}

PUT /testxt3/_doc/3
{
  "name" : "kafka",
  "age" : -3,
  "desc" : "I am kafka"
}      
GET /testxt3/_doc/_search
{
  "query":{
    "bool": {
      "must": [
        {
          "match":{
            "age":67
          }
        },    
        {
          "match": {
            "name": "elasticsearch"
          }
        }
      ],
      "filter": {
        "range": {    
          "age": {
            "gte": 1,
            "lte": 100
          }
        }
      }
    }
  }
}      
ElasticSearch:Rest API操作

其他情況大家自行嘗試

精确查詢

term 直接通過 反向索引 指定詞條查詢,精确查詢,而上面的match會預先使用分詞器解析,然後再查詢,是以前一種速度要更快

适合查詢 number、date、keyword ,不适合text

// 精确查詢(必須全部都有,而且不可分,即按一個完整的詞查詢)
// term 直接通過 反向索引 指定的詞條 進行精确查找的
GET /testxt3/_doc/_search
{
  "query":{
    "term":{
      "name":" xt"  //會連着前面的空格一起查詢,當成一個詞,是以查不到
    }
  }
}      

text和keyword

text:

支援分詞,全文檢索、支援模糊、精确查詢,不支援聚合,排序操作; text類型的最大支援的字元長度無限制,适合大字段存儲;

keyword:

不進行分詞,直接索引、支援模糊、支援精确比對,支援聚合、排序操作。

keyword類型的最大支援的長度為——32766個UTF-8類型的字元,可以通過設定ignore_above指定自持字元長度,超過給定長度後的資料将不被索引,無法通過term精确比對檢索傳回結果。

// 測試keyword和text是否支援分詞
// 設定索引類型
PUT /test
{
  "mappings": {
    "properties": {
      "text":{
        "type":"text"
      },
      "keyword":{
        "type":"keyword"
      }
    }
  }
}
// 設定字段資料
PUT /test/_doc/1
{
  "text":"測試keyword和text是否支援分詞",
  "keyword":"測試keyword和text是否支援分詞"
}
// text 支援分詞
// keyword 不支援分詞
GET /test/_doc/_search
{
  "query":{
   "match":{
      "text":"測試"
   }
  }
}// 查的到
GET /test/_doc/_search
{
  "query":{
   "match":{
      "keyword":"測試"
   }
  }
}// 查不到,必須是 "測試keyword和text是否支援分詞" 才能查到
GET _analyze
{
  "analyzer": "keyword",
  "text": ["測試liu"]
}// 不會分詞,即 測試liu
GET _analyze
{
  "analyzer": "standard",
  "text": ["測試liu"]
}// 分為 測 試 liu
GET _analyze
{
  "analyzer":"ik_max_word",
  "text": ["測試liu"]
}// 分為 測試 liu      

高亮查詢

百度搜尋會對關鍵詞進行高亮顯示

ElasticSearch:Rest API操作

檢視頁面代碼可以看見,關鍵詞被em 标簽對包裹

ElasticSearch:Rest API操作
/// 高亮查詢
GET testxt3/_doc/_search
{
  "query": {
    "match": {
      "name":"xt"
    }
  }
  ,
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}      
ElasticSearch:Rest API操作

通過修改字首和字尾也可以自定義高亮樣式

// 自定義字首和字尾
GET testxt3/_doc/_search
{
  "query": {
    "match": {
      "name":"xt"
    }
  }
  ,
  "highlight": {
    "pre_tags": "<p class='key' style='color:red'>",
    "post_tags": "</p>", 
    "fields": {
      "name": {}
    }
  }
}      
ElasticSearch:Rest API操作

聚合查詢

{
  "aggs":{//聚合操作
    "price_group":{//名稱,随意起名
      "terms":{//分組  avg 平均值  max 最大值
        "field":"age"//分組字段
      }
    }
  },
  "size":0  //查詢到的結果不攜帶原始資料,隻傳回聚合統計分析的結果
}      

References:

  • ​​https://www.kuangstudy.com/bbs/1354069127022583809​​

繼續閱讀