Elasticsearch (ES)+Kibana簡單使用

前言

es是一個強大的搜索引擎,目前知名公司內部都在使用!
因爲Elasticsearch 是一個基於 Apache Lucene™ 的開源搜索引擎。無論在開源還是專有領域,Lucene 可以被認爲是迄今爲止最先進、性能最好的、功能最全的搜索引擎庫。
首先我們要知道,es雖然強大,但是不方便操作,所以我們需要藉助於kibana工具來進行開發!

kibana

本篇不講kibana和es的安裝,後面會專門寫安裝過程。這裏先知道kibana工具是提供了一個可視化的界面。
我們的es需要以基於 HTTP 協議,以 JSON 爲數據交互格式的 RESTful API來進行交互!
Kibana 可以看出是一個操作 ElasticSeach 的客戶端.
由於Kibana是用nodejs寫的一個web項目。所以進程查詢使用ps來進行查詢區別es用jps查詢!
什麼是RESTful

一張圖演示什麼是restful

在這裏插入圖片描述

ES

ElasticSearch 交互方式

  • 基於 HTTP 協議,以 JSON 爲數據交互格式的 RESTful API GET POST PUT DELETE HEAD

es與其他數據存儲產品比較

在這裏插入圖片描述

關於es幾個重要概念

概念 解釋
cluster 整個elasticsearch 默認就是集羣狀態,整個集羣是一份完整、互備的數據。
node 集羣中的一個節點,一般只一個進程就是一個node
shard 分片,即使是一個節點中的數據也會通過 hash 算法,分成多個片存放,默認是 5 片。(7.0 默認是 1 片)
index 相當於EDBMS 的 database, 對於用戶來說是一個邏輯數據庫,雖然物理上會被分多個 shard 存放,也可能存放在多個 node 中。
type 類似於 rdbms 的 table,但是與其說像 table,其實更像面向對象中的 class , 同一Json 的格式的數據集合。((6.x只允許建一個,7.0被廢棄,造成index實際相當於table級))
document 類似於 rdbms 的 row、面向對象裏的object
field 相當於字段、屬性

小總結

  • cluster 整個elasticsearch 默認就是集羣狀態
  • 一個節點一個node
  • 一個index可以類比成一個database!一個ndoe可以擁有多個index!
  • 一個index(6.x)對應唯一的type,類比table!(5.x之前是對應多個type,7.x以後 type被捨棄!)
  • shard爲其切片!在6.x默認是5片。7.x默認是1片
  • document類比row
  • field類比 column
  • 注意:ES是自帶索引,且爲倒排索引!

可參考內容

學習文檔

Kibana上操作數據

插入數據

在這裏插入圖片描述
當沒有在type後面跟上id的話,那麼會自動生成一個uuid。id是不能重複的,這裏的id要區別於_source中自己定義的id!
注意:此id爲document的id!

在這裏插入圖片描述

覆蓋

在這裏插入圖片描述沒有在put裏面聲明_update,這裏將自定義內容修改
在這裏插入圖片描述

修改

在這裏插入圖片描述修改指定位置時,必須使用post請求!這裏區別於HTTP裏的PUT(create,update)請求!!
在這裏插入圖片描述

刪除

在這裏插入圖片描述

查詢

GET movie_index/_search
{
  "query": {
    "term": {
      "id": {
        "value": "2"
      }
    }
  }
}


GET movie_index/_search
{
  "query": {
    "bool": {
      "should": [
        {"term": {
          "actorList.name": {
            "value": "zhang"
          }
        }},{
          "term": {
            "name": {
              "value": "red"
            }
          }
        }
      ]
    }
  }
}

GET movie_index/_search
{
 "query": {
   "bool": {
     "must_not": [
       {"term": {
         "name": {
           "value": "red"
         }
       }}
     ]
   }
 } 
}

GET movie_index/_search
{
  "query": {
    "range": {
      "doubanScore": {
        "gt": 8
      
      }
    }
  }
}


GET movie_index/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "doubanScore": {
            "gte": 5,
            "lte": 8
          }
        }
      }
    }
  }
}



GET movie_index/_search
{
 "from": 2
 , "size": 1
}




GET movie_index/_search
{
  "aggs": {
    "a": {
      "sum": {
        "field": "doubanScore"
      }
    }
  }
}


GET movie_index/_search
{
  "aggs": {
    " ": {
      "terms": {
        "field": "actorList.id",
        "size": 10
      }
    }
  }
}



GET  movie_index/_search
{
  "aggs": {
    "a": {
      "value_count": {
        "field": "doubanScore"
      }
    }
  }
}

GET movie_index/_search
{
  "aggs": {
    "b": {
      "terms": {
        "field": "actorList.name",
        "size": 10
      }
      , "aggs": {
        "sum": {
          "sum": {
            "field": "doubanScore"
          }
        }
      }
    }
  }
}


PUT movie_index/_mapping/movie
{
  "properties": {
    "actorList.name": { 
      "type":     "text",
      "fielddata": true
    }
  }
}



GET movie_index/_search
{
  "aggs": {
    "group": {
      "terms": {
        "field": "actorList.id",
        "size": 10
     
      }
      , "aggs": {
        "maxScore": {
          "max": {
            "field": "doubanScore"
          
          }
        }
      , 
        "minscore": {
          "min": {
            "field": "doubanScore"
          }
        }
      }
    }
  }
}

GET movie_index/_search
{
  "aggs": {
    "group": {
      "terms": {
        "field": "actorList.id",
        "size": 1
        , "order": {
          "_term": "desc"
        }
      }
      
    }
  }
}


GET zhengkw/_analyze
{
  "analyzer": "ik_smart"
  , "text": "第一節課"
}


GET zhengkw/_analyze
{
  "analyzer": "ik_max_word"
  , "text": "第一節課"
}

關於Mapping

之前說 type 可以理解爲table,那每個字段的數據類型是如何定義的呢?

  • 默認情況下, 是由插入的第一條數據的類型來自動推斷來設定的!
  • 可以通過 Mapping 來設置和查看每個字段的數據類型.

在這裏插入圖片描述
簡單類型中除了text會進行分詞,分詞後建立索引,其他簡單類型則不會分詞!但是也會建立索引!
也支持一些JSON對象,還有地圖類型的信息,比如地理位置的座標,或者地理位置的圖形!

關於使用

手動建立索引

PUT /movie_chn
{
  "mappings": {
    "movie":{
      "properties": {
        "id":{
          "type": "long"
        },
        "name":{
          "type": "text"
          , "analyzer": "ik_smart"
        },
        "doubanScore":{
          "type": "double"
        },
        "actorList":{
          "properties": {
            "id":{
              "type":"long"
            },
            "name":{
              "type":"keyword"
            }
          }
        }
      }
    }
  }
}

建立的時候 type指定爲movie document指定 id,name等 ,聲明用properties將doc括起來。properties後面的v並不是json數組!而是一個json字符串!指定text的name的時候也聲明分詞器

插入數據

PUT /movie_chn/movie/1
{ "id":1,
  "name":"紅海行動",
  "doubanScore":8.5,
  "actorList":[  
    {"id":1,"name":"張譯"},
    {"id":2,"name":"海清"},
    {"id":3,"name":"張涵予"}
   ]
}
PUT /movie_chn/movie/2
{
  "id":2,
  "name":"湄公河行動",
  "doubanScore":8.0,
  "actorList":[  
    {"id":3,"name":"張涵予"}
  ]
}

PUT /movie_chn/movie/3
{
  "id":3,
  "name":"紅海事件",
  "doubanScore":5.0,
  "actorList":[  
    {"id":4,"name":"張晨"}
  ]
}

查詢

GET /movie_chn/movie/_search
{
  "query": {
    "match": {
      "name": "紅海"
    }
  }
}

GET /movie_chn/movie/_search
{
  "query": {
    "term": {
      "actorList.name": "張"
    }
  }
}

注意事項(不斷更新ing)

1.創建index的時候可以包含空格!但是不能包含大寫字母!只能小寫字母!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章