Elasticsearch 基礎概念

原文:chenmingyu.top/es-basics/html

elasticsearch

​ elasticsearch是一個近實時分佈式搜索和分析引擎,它用於全文搜索、結構化搜索、分析以及將這三者混合使用,使用java編寫,基於Lucene 實現java

優點mysql

  1. 分佈式的實時文件存儲,每一個字段都被索引並可被搜索sql

  2. 實時分析的分佈式搜索引擎json

  3. 橫向可擴展:支持上百臺服務節點的擴展,集羣增長機器簡單,支持處理PB級數據api

  4. 分片機制:數組

    容許水平分割擴展數據,容許分片和並行操做從而提升性能和吞吐量數據結構

    提供高性能:同一個索引能夠分多個主分片(primary shard),每一個主分片擁有本身的副本分片(replica shard),每一個副本分片均可以提供服務,提高系統搜索請求的吞吐量和性能併發

    提供高可用性:同一個索引能夠分多個主分片,每一個主分片擁有零個或者多個副本,若是主分片掛了,能夠從副本分片中選擇一個做爲主分片繼續提供服務app

基本概念

  1. Cluster:集羣

    一個集羣包含多個節點,對外提供服務,每一個節點屬於哪一個集羣經過配置文件中的集羣名稱決定

  2. Node:節點

    集羣中的一個節點,每一個節點也有一個名稱,默認是隨機分配,也能夠本身指定,在es集羣中經過節點名稱進行管理和通訊

  3. Index:索引

    索引是具備相同結構的文檔集合,做用至關於mysql中的庫

  4. Type:類型

    一個索引能夠對應一個或者多個類型,類型能夠當作是索引的邏輯分區,做用至關於mysql中的表

  5. Document:文檔

    存儲在es中的一個JSON格式的字符串,每個文檔有一個文檔ID,若是沒有本身指定ID,系統會自動生成一個ID,文檔的index/type/id必須是惟一的,做用至關於mysql中的行

  6. field:字段

    一個文檔會包含多個字段,每一個字段都對應一個字段類型,相似於mysql中的列

  7. shard:分片

    es中分爲primary shard主分片和replica shard副本分片

    主分片:當存一個文檔的時候會先存儲在主分片中,而後複製到不一樣的副本分片中,默認一個索引會有5個主分片,固然能夠本身指定分片數量,當分片一旦創建,分片數量不能改變

    副本分片:每個主分片會有零個或者多個副本,副本主要是主分片的複製,經過副本分片能夠提供高可用性,當一個主分片掛了,能夠從副本分片中選擇一個做爲主分片,還能夠提升性能,因此主分片不能和副本分片部署在相同的節點上

  8. replica:複製

    複製是爲了防止單點問題,能夠作到對故障進行轉移,保證系統的高可用

  9. 映射

    描述數據在每一個字段內如何存儲,是定義存儲和索引的文檔類型及字段的過程,索引中的每個文檔都有一個類型,每種類型都有它本身的映射,一個映射定義了文檔結構內每一個字段的數據類型

    使用GET /index/_mapping/type獲取對應的/index/type的映射信息

可視化界面Kibana

建議安裝Elasticsearch+Kibana,在Kibana的操做界面對es進行操做

Elasticsearch提供了RESTful接口能夠對Elasticsearch進行操做

Kibana操做頁面

在Kibana的Dev Tools界面能夠對es進行操做,在console界面敲命令,點執行,會在右面輸出結果

驗證Elasticsearch是否安裝成功

http://localhost:9200/?pretty

{
  "name" : "UzOujcc", //節點名稱
  "cluster_name" : "mx", //集羣名稱,我本身設置的
  "cluster_uuid" : "d2K1M95DRzG9XOPDOR_DEQ",
  "version" : {
    "number" : "6.2.4", //集羣版本
    "build_hash" : "ccec39f",
    "build_date" : "2018-04-12T20:37:28.497551Z",
    "build_snapshot" : false,
    "lucene_version" : "7.2.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
複製代碼

es提供了一套api,叫作cat api,能夠查看es中的信息數據

查看集羣健康情況

命令:GET /_cat/health?v

status表明着集羣的健康程度

  1. green:每一個索引的primary shard和replica shard都是active狀態的
  2. yellow:每一個索引的primary shard都是active狀態的,可是部分replica shard不是active狀態,處於不可用的狀態
  3. red:不是全部索引的primary shard都是active狀態的,部分索引有數據丟失了

索引操做

查看索引信息

命令:GET _cat/indices?v

有五個索引,都是的測試數據

新建索引

命令:PUT /myindex

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "myindex"
}
複製代碼

刪除索引

命令:DELETE myindex

{
  "acknowledged": true
}
複製代碼

文檔操做

添加文檔

添加文檔是向索引中添加一條文檔,讓其可以搜索,文檔格式是json串,若是es中有相同id的文檔存在則更新這個文檔

當建立文檔的時候,若是索引不存在,則會自動建立該索引,並且es默認會對document每一個field都創建倒排索引,讓其能夠被搜索

命令:

PUT /index/type/id 
{ 
	"json數據結構體 "
}
複製代碼

例:

PUT /school/student/1
{
  "name":"張三",
  "age":21,
  "class":2,
  "gender":"男"
}
複製代碼

返回:

{
  "_index": "school", //索引
  "_type": "student", //類型
  "_id": "1", //id,若是不指定則會系統生成一個20位的id,文檔被分到那個分片上就是根據id的散劣值進行控制
  "_version": 1, //文檔版本號,經過這個進行併發控制
  "result": "created", //操做類型
  "_shards": { //分片信息
    "total": 2, //文檔被建立時在多少個分片進行了操做(包括主分片和副本分片)
    "successful": 1, //添加成功的索引分片數量
    "failed": 0 //失敗的索引分片數量
  },
  "_seq_no": 0,
  "_primary_term": 1
}
複製代碼

修改文檔

方式1:使用put方式更新文檔

PUT /school/student/1
{
  "name":"呂布",
  "age":21,
  "class":2,
  "gender":"男"
}
複製代碼

返回:

{
  "_index": "school",
  "_type": "student",
  "_id": "1",
  "_version": 2, //版本號+1
  "result": "updated", // 修改
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 1,
  "_primary_term": 1
}
複製代碼

這種方式替換須要帶上全部的field,才能進行信息的修改,操做相似於覆蓋

方式2:post更新文檔

POST /school/student/1/_update
{
  "doc": {
    "name":"呂布1"
  }
}
複製代碼

使用post更新文檔,能夠只更新部分字段

查詢文檔

查詢單條文檔

命令:GET /school/student/1

返回:

{
  "_index": "school",
  "_type": "student",
  "_id": "1",
  "_version": 3,
  "found": true,
  "_source": {
    "name": "呂布1",
    "age": 21,
    "class": 2,
    "gender": "男"
  }
}
複製代碼

刪除文檔

命令:DELETE school/student/1

返回:

{
  "_index": "school",
  "_type": "student",
  "_id": "1",
  "_version": 4,
  "result": "deleted", //刪除
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 3,
  "_primary_term": 1
}
複製代碼

這時在查詢就會顯示"found": false

映射

es中的映射(mapping)用來描述數據在每一個字段內如何存儲,是定義存儲和索引的文檔類型及字段的過程,索引中的每個文檔都有一個類型,每種類型都有它本身的映射,一個映射定義了文檔結構內每一個字段的數據類型,做用至關於mysql中的DDL語句

查詢索引類型的映射

GET /ad/_mapping/phone

{
  "school": {
    "mappings": {
      "student": {
        "properties": {
          "age": {
            "type": "long"
          },
          "class": {
            "type": "long"
          },
          "gender": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}
複製代碼

動態映射

動態映射不須要事先定義映射,文檔在寫入es的時候,會根據文檔字段自動識別類型

映射規則:

Json 數據類型 es 數據類型
null 沒有字段添加
true,false boolean
Integer long
object object
array 依賴於數組中首個非空值
string text和keyword
日期 date或text

靜態映射

靜態映射須要事先定義好映射,包含文檔的各個字段及其類型

PUT books
{
  "mappings": {
    "book":{
      "properties": {
        "id":{"type": "long"},
        "bookName":{"type": "text"},
        "ad":{"type": "text"}
      }
    }
  }
}
複製代碼

Elasticsearch 中的數據能夠歸納的分爲兩類:精確值和全文

  1. 精確值:精確值是肯定的值,好比用戶ID,字符串也能夠表示精確值,例如用戶名或郵箱地址。對於精確值來說,Foofoo 是不一樣的,精確值的查詢簡單,要麼匹配查詢,要麼不匹配
  2. 全文:全文是指文本數據(一般以人類容易識別的語言書寫),例如一個推文的內容或一封郵件的內容,全文的查詢較爲複雜,他須要的是匹配查詢的程度有多大

在es中使用 倒排索引來進行快速的全文搜索。一個倒排索引由文檔中全部不重複詞的列表構成,對於其中每一個詞,有一個包含它的文檔列表,倒排索引具體內容請戳:www.elastic.co/guide/cn/el…

es中的字符串類型分爲keywordtext

  1. keyword:用於索引結構化內容的字段,例如電子郵件地址,主機名,狀態代碼,郵政編碼或標籤。它們一般用於過濾,排序,和聚合。keyword字段只能按其確切值進行搜索。若是您須要索引電子郵件正文或產品說明等全文內容,則可能應該使用text字段
  2. text:用於索引全文值的字段,例如電子郵件正文或產品說明。這些字段是analyzed,它們經過分詞器傳遞 ,以在被索引以前將字符串轉換爲單個術語的列表。分析過程容許Elasticsearch搜索單個單詞中 每一個完整的文本字段。文本字段不用於排序,不多用於聚合

有時候一個字段同時擁有全文類型(text)和關鍵字類型(keyword)是有用的:一個用於全文搜索,另外一個用於聚合和排序。這能夠經過多字段類型來實現(動態映射是字符串的默認映射類型)

參考: Elasticsearch: 權威指南 www.elastic.co/guide/cn/el…

相關文章
相關標籤/搜索