ES的使用和Kibana的基本操作

2020-08-13 20:06:46

Kibana的基本操作

Kibanadang

就是一個發送http請求的工具

 

索引(Index)的基本操作

PUT /dangdang/              建立索引
DELETE /dangdang            刪除索引
DELETE /*                   刪除所有索引
GET /_cat/indices?v         檢視索引資訊
​
_cat 一組命令 可以查詢es一些狀態

 

型別(type)的基本操作

建立型別

1.建立/dangdang索引並建立(product)型別
PUT /dangdang             
{
  "mappings": {
    "product": {
      "properties": {
            "title":    { "type": "text"  },
            "name":     { "type": "text"  },
            "age":      { "type": "integer" },
            "created":  {
                 "type":   "date",
                 "format": "strict_date_optional_time||epoch_millis"
                }
            }
        }
    }
}
注意: 這種方式建立型別要求索引不能存在

text:字串 會被分詞

keyword:字串 不分詞

少年的魯迅 如果是text 型別 會被處理爲 少年 魯迅

如果是 keyword型別 少年的魯迅 整體是一個詞語

integer:整數

double:小數

date:日期

boolean:可用值true+false

檢視型別

GET /dangdang/_mapping/product # 語法:GET /索引名/_mapping/型別名
​
GET /dangdang/_mapping

 

文件(document)的基本操作

新增文件

PUT /ems/emp/1   #/索引/型別/id
{
  "name":"趙小六",
  "age":23,
  "bir":"2012-12-12",
  "content":"這是一個好一點的員工"
}

PUT和POST都可以

  • POST 新增。如果不指定id,會自動生成id。 指定id就會修改這個數據,並新增版本號

  • PUT 可以新增可以修改。PUT必須指定id;由於PUT需要指定id,我們一般都用來做修改操作,不指定id會報錯。

 

{
  "_index": "ems",  //索引名稱
  "_type": "emp",  // 型別名稱
  "_id": "1", // id 如果新增會採用你新增的 如果不寫會預設生成(POST會生成 PUT必須給id)
  "_version": 1, //版本號
  "result": "created", 
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0, 
  "_primary_term": 1
}

 

查詢文件

GET /ems/emp/1 
​
返回結果:
{
  "_index": "ems",
  "_type": "emp",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {  // 查詢結果
    "name": "趙小六",
    "age": 23,
    "bir": "2012-12-12",
    "content": "這是一個好一點的員工"
  }
}

刪除文件

DELETE /ems/emp/1
{
  "_index": "ems",
  "_type": "emp",
  "_id": "1",
  "_version": 2,
  "result": "deleted", #刪除成功
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 1,
  "_primary_term": 1
}

更新文件

1.第一種方式  更新原有的數據
 POST /ems/emp/1/_update
{
  "doc": {
    "name": "趙六",
    "age":45
  }
}
​
2.第二種方式  新增新的數據  增加一個新的欄位
   POST /ems/emp/1/_update
{
  "doc": {
    "name": "趙六",
    "age":45,
    "dpet":"你好部門"
  }
} 
3.第三種方式 在原來數據基礎上更新  在修改的時候通過指令碼做運算
POST /ems/emp/1/_update
{
"script": "ctx._source.age += 5"
}
​
ctx._source 獲取 _source 中的數據

 

批次操作

 

1. 批次索引兩個文件
    PUT /ems/emp/_bulk
    {"index":{"_id":"1"}} 
        {"name": "John Doe","age":23,"bir":"2012-12-12"}
    {"index":{"_id":"2"}}  
        {"name": "Jane Doe","age":23,"bir":"2012-12-12"}
    
2. 更新文件同時刪除文件
    POST /dangdang/emp/_bulk
        {"update":{"_id":"1"}}
            {"doc":{"name":"lisi"}}
        {"delete":{"_id":2}}
        {"index":{}}
            {"name":"xxx","age":23}
 
注意:批次時不會因爲一個失敗而全部失敗,而是繼續執行後續操作,批次在返回時按照執行的狀態開始返回

 

ES中高階檢索

https://www.elastic.co/guide/en/elasticsearch/reference/6.4/search.html

測試數據

1.刪除索引
DELETE /ems
​
2.建立索引並指定型別
PUT /ems
{
  "mappings":{
    "emp":{
      "properties":{
        "name":{
          "type":"text"
        },
        "age":{
          "type":"integer"
        },
        "bir":{
          "type":"date"
        },
        "content":{
          "type":"text"
        },
        "address":{
          "type":"keyword"
        }
      }
    }
  }
}
​
3.插入測試數據
PUT /ems/emp/_bulk
  {"index":{}}
  {"name":"小黑","age":23,"bir":"2012-12-12","content":"爲開發團隊選擇一款優秀的MVC框架是件難事兒,在衆多可行的方案中決擇需要很高的經驗和水平","address":"北京"}
  {"index":{}}
  {"name":"王小黑","age":24,"bir":"2012-12-12","content":"Spring 框架是一個分層架構,由 7 個定義良好的模組組成。Spring 模組構建在覈心容器之上,核心容器定義了建立、設定和管理 bean 的方式","address":"上海"}
  {"index":{}}
  {"name":"張小五","age":8,"bir":"2012-12-12","content":"Spring Cloud 作爲Java 語言的微服務架構,它依賴於Spring Boot,有快速開發、持續交付和容易部署等特點。Spring Cloud 的元件非常多,涉及微服務的方方面面,井在開源社羣Spring 和Netflix 、Pivotal 兩大公司的推動下越來越完善","address":"無錫"}
  {"index":{}}
  {"name":"win7","age":9,"bir":"2012-12-12","content":"Spring的目標是致力於全方位的簡化Java開發。 這勢必引出更多的解釋, Spring是如何簡化Java開發的?","address":"南京"}
  {"index":{}}
  {"name":"梅超風","age":43,"bir":"2012-12-12","content":"Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API","address":"杭州"}
  {"index":{}}
  {"name":"張無忌","age":59,"bir":"2012-12-12","content":"ElasticSearch是一個基於Lucene的搜尋伺服器。它提供了一個分佈式多使用者能力的全文搜尋引擎,基於RESTful web介面","address":"北京"}

 

檢索方式

ES官方提供了兩中檢索方式:一種是通過 URL 參數進行搜尋,另一種是通過 DSL(Domain Specified Language) 進行搜尋官方更推薦使用第二種方式第二種方式是基於傳遞JSON作爲請求體(request body)格式與ES進行互動,這種方式更強大,更簡潔

ES支援兩種基本方式檢索

  • 一個是通過使用 REST requestURI發送搜尋參數(uri+檢索參數)

     

  • 另一個是通過使用REST request body來發送它們(uri+請求體)【推薦使用】

     

     

     

URL檢索

GET /ems/emp/_search?q=*&sort=age:asc

_search 搜尋的API ​ q=* 匹配所有文件 ​ sort 以結果中的指定欄位排序

DSL檢索

 

 

在 es 中,DSL 是通過 json 的方式表達請求主體

 

演示 查詢所有

 

 

響應結果解釋:

took Elasticsearch 執行搜尋的時間(毫秒) time_out 告訴我們搜尋是否超時 _shards 告訴我們多少個分片被搜尋了,以及統計了成功/失敗的搜尋分片 hits 搜尋結果 hits.total 搜尋結果 hits.hits 實際的搜尋結果陣列(預設爲前10的文件) sort 結果的排序key (鍵) (沒有則按 score 排序) score 和 max_score 相關性得分和最高得分(全文檢索用)

GET /ems/emp/_search
{
    "query": {"match_all": {}},
    "sort": [
        {
            "age": {
                "order": "desc"
            }
        }
    ]
}
​

query 定義查詢型別

 

sort 排序

size from 分頁

 

查詢所有(match_all)

match_all關鍵字: 返回索引中的全部文件

GET /ems/emp/_search
{
    "query": { "match_all": {} }
}   

 

查詢結果中返回指定條數(size)

size 關鍵字: 指定查詢結果中返回指定條數。 預設返回值10條

GET /ems/emp/_search
{
    "query": { "match_all": {} },
    "size": 1
}   

 

分頁查詢(from)

from 關鍵字: 用來指定起始返回位置,和size關鍵字連用可實現分頁效果

GET /ems/emp/_search
{
      "query": {"match_all": {}},
      "sort": [
        {
          "age": {
            "order": "desc"
          }
        }
      ],
      "size": 2, 
      "from": 1
}

 

查詢結果中返回指定欄位(_source)

_source 關鍵字: 是一個數組,在陣列中用來指定展示那些欄位

GET /ems/emp/_search
{
      "query": { "match_all": {} },
      "_source": ["account_number", "balance"]
}

 

關鍵詞查詢(term)

term 關鍵字: 用來使用關鍵詞查詢

GET /ems/emp/_search
{
  "query": {
    "term": {
      "address": {
        "value": "北京"
      }
    }
  }
}
​
es 預設使用分詞器是單個分詞 一個字兒是一個詞 
​
term 查詢 搜尋關鍵詞不分詞 開發 當做一個詞兒  

NOTE1: 通過使用term查詢得知ES中預設使用分詞器爲標準分詞器(StandardAnalyzer),標準分詞器對於英文單詞分詞,對於中文 單字分詞

NOTE2: 通過使用term查詢得知,在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 這些型別不分詞只有text型別分詞

match 全文檢索

搜尋關鍵詞也會被分詞處理

GET /ems/emp/_search
{
  "query": {
    "match": {
      "content": "開發公司有哪些"
    }
  }
}

 

範圍查詢(range)

range 關鍵字: 用來指定查詢指定範圍內的文件

GET /ems/emp/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 8,
        "lte": 30
      }
    }
  }
}

字首查詢(prefix)

prefix 關鍵字: 用來檢索含有指定字首的關鍵詞的相關文件

GET /ems/emp/_search
{
  "query": {
    "prefix": {
      "content": {
        "value": "redis"
      }
    }
  }
}

萬用字元查詢(wildcard)

wildcard 關鍵字: 萬用字元查詢 ? 用來匹配一個任意字元 * 用來匹配多個任意字元

GET /ems/emp/_search
{
  "query": {
    "wildcard": {
      "content": {
        "value": "re*"
      }
    }
  }
}

多id查詢(ids)

ids 關鍵字 : 值爲陣列型別,用來根據一組id獲取多個對應的文件

GET  /ems/emp/_search
{
  "query": {
    "ids": {
      "values": ["lg5HwWkBxH7z6xax7W3_","lQ5HwWkBxH7z6xax7W3_"]
    }
  }
}

模糊查詢(fuzzy)

fuzzy 關鍵字: 用來模糊查詢含有指定關鍵字的文件

GET /ems/emp/_search
{
  "query": {
    "fuzzy": {
      "content":"spring"
    }
  }
}

布爾查詢(bool)

bool 關鍵字: 用來組合多個條件實現複雜查詢

must: 相當於&& 同時成立 &

should: 相當於|| 成立一個就行 |

must_not: 相當於! 不能滿足任何一個

GET /ems/emp/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "age": {
              "gte": 0,
              "lte": 30
            }
          }
        }
      ],
      "must_not": [
        {"wildcard": {
          "content": {
            "value": "redi?"
          }
        }}
      ]
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

高亮查詢(highlight)

 

highlight 關鍵字: 可以讓符合條件的文件中的關鍵詞高亮

GET /ems/emp/_search
{
  "query":{
    "match": {
      "content":"框架"
    }
  },
  "highlight": {
    "fields": {
      "*":{}
    }
  }
}

自定義高亮html標籤: 可以在highlight中使用pre_tagspost_tags

GET /ems/emp/_search
{
  "query":{
    "match": {
      "content":"框架"
    }
  },
  "highlight": {
    "pre_tags": ["<span style='color:red'>"],
    "post_tags": ["</span>"],
    "fields": {
      "*":{}
    }
  }
}

多欄位高亮 使用require_field_match開啓多個欄位高亮

 GET /ems/emp/_search
{
  "query":{
    "term":{
      "content":"框架"
    }
  },
  "highlight": {
    "pre_tags": ["<span style='color:red'>"],
    "post_tags": ["</span>"],
    "require_field_match":false,
    "fields": {
      "*":{}
    }
  }
}

多欄位查詢(multi_match)

GET /ems/emp/_search
{
  "query": {
    "multi_match": {
      "query": "中國",
      "fields": ["name","content"] #這裏寫要檢索的指定欄位
    }
  }
}

過濾查詢

其實準確來說,ES中的查詢操作分爲2種: 查詢(query)和過濾(filter)。

  • 查詢就是之前講的query查詢,它 (查詢)預設會計算每個返迴文件的得分,然後根據得分排序。

  • 過濾(filter)只會篩選出符合的文件,並不計算得分,且它可以快取文件 。所以,單從效能考慮,過濾比查詢更快。

換句話說,過濾適合在大範圍篩選數據,而查詢則適合精確匹配數據。一般應用時, 應先使用過濾操作過濾數據, 然後使用查詢匹配數據。

在執行filter和query時,先執行filter再執行query

ElasticSearch會自動快取經常使用的過濾器,以加快效能

先使用 過濾操作 可以篩選掉一部分不需要參與計算的數據

再執行 query 操作進行查詢

常用過濾器型別:term/terms/range/exists/ids

 

 

 

 

聚合分析 aggregation 【瞭解】

類似於mysql的分組函數和函數(最大值 最小值 平均值)

https://www.elastic.co/guide/en/elasticsearch/reference/6.4/search-aggregations-metrics-max-aggregation.html

語法結構

"aggregations" : {
    "<aggregation_name>" : {
        "<aggregation_type>" : {
            <aggregation_body>
        }
        [,"meta" : {  [<meta_data_body>] } ]?
        [,"aggregations" : { [<sub_aggregation>]+ } ]?
    }
    [,"<aggregation_name_2>" : { ... } ]*
}

 

計算年齡的平均值

 

 

GET /ems/emp/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageAvg": {
      "avg": {
        "field": "age"
      }
    }
  },
  "size": 0
}

 

按照年齡統計個數

terms 分組

GET /ems/emp/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageAvg": {
      "avg": {
        "field": "age"
      }
    },
    "ageCount":{
      "terms": {
        "field": "age",
        "size": 10
      }
    }
  },
  "size": 0
}

 

按照地區分組,再分組的基礎上計算年齡最大值

GET ems/emp/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "age_count": {
      "terms": {
        "field": "address",
        "size": 10
      },
      "aggs": {
        "age_max2": {
          "max": {
            "field": "age"
          }
        }
      }
    }
  },
  "size": 0
}