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 思維導圖
叢集API
關于叢集的一些Rest API
# 查詢叢集健康狀态
GET _cluster/health
# 查詢所有節點
GET _cat/nodes
# 查詢索引及分片的分布
GET _cat/shards
因為我沒有建立索引,這些索引應該都是elasticsearch内部和kibana的一些索引
# 查詢指定索引分片的分布 後面跟着索引名稱就行
GET _cat/shards/.kibana_7.16.2_001
# 查詢所有插件
GET _cat/plugins
索引相關資訊查詢
不一個一個試了
# 查詢所有索引及容量
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 Head 插件也可以檢視
按指定字段類型建立索引
mappings 就是建立規則,指定那個屬性是什麼類型的字段,就和資料庫一樣
PUT /testxt2
{
"mappings": {
"properties": {
"name": {
"type": "text"
"index": true //可以被索引,false 為不能被索引,預設為true
},
"age":{
"type": "long"
},
"birthday":{
"type": "date"
}
}
}
}
擷取索引的詳細資訊
GET testxt2
如果我們的索引沒有像上面一樣建立規則mappings,ElasticSearch 也會自動幫助我們比對合适的類型。_doc 預設類型(default type),type 在未來的版本中會逐漸棄用,是以産生一個預設類型進行代替。如下圖所示
我們這裡顯示建立指定_doc
PUT /testxt3/_doc/1
{
"name": "xt",
"age": 24,
"birth": "1998-02-08"
}
GET testxt3
通過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可以顯示每個屬性的名稱
修改文檔資料
PUT修改(全局覆寫)
會覆寫原來的值
- 版本+1(_version)
- 但是如果漏掉某個字段沒有寫,那麼更新是沒有寫的字段 ,會消失
//版本号會增加,無論資料有沒有變動,版本号都會加一,因為是覆寫
PUT /testxt3/_doc/1
{
"name" : "I am xt",
"age" : 23,
"birth" : "2000-07-26"
}
GET /testxt3/_doc/1
// 修改會有字段丢失
PUT /testxt3/_doc/1
{
"name" : "xt",
"age" : 24
}
GET /testxt3/_doc/1
POST修改(局部更新)
- 不會丢失字段
- 如果資料一緻,多次請求,版本号不會增加,與PUT覆寫不同
POST /testxt3/_doc/1/_update
{
"doc":{
"name" : "post修改,version不會加一",
"age" : 100
}
}
GET /testxt3/_doc/1
删除索引
隻是邏輯删除, 将其标記為delete, 當資料越來越多時, ES會自動實體删除.
GET /testxt
DELETE /testxt
GET /testxt
查詢資料
GET /testxt3/_doc/_search?q=name:xt
查詢工具使用
也可以使用多種工具
- 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
}
}
}
}
}
}
其他情況大家自行嘗試
精确查詢
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
高亮查詢
百度搜尋會對關鍵詞進行高亮顯示
檢視頁面代碼可以看見,關鍵詞被em 标簽對包裹
/// 高亮查詢
GET testxt3/_doc/_search
{
"query": {
"match": {
"name":"xt"
}
}
,
"highlight": {
"fields": {
"name": {}
}
}
}
通過修改字首和字尾也可以自定義高亮樣式
// 自定義字首和字尾
GET testxt3/_doc/_search
{
"query": {
"match": {
"name":"xt"
}
}
,
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}
聚合查詢
{
"aggs":{//聚合操作
"price_group":{//名稱,随意起名
"terms":{//分組 avg 平均值 max 最大值
"field":"age"//分組字段
}
}
},
"size":0 //查詢到的結果不攜帶原始資料,隻傳回聚合統計分析的結果
}
References:
- https://www.kuangstudy.com/bbs/1354069127022583809