原文:chenmingyu.top/es-basics/html
elasticsearch是一個近實時分佈式搜索和分析引擎,它用於全文搜索、結構化搜索、分析以及將這三者混合使用,使用java編寫,基於Lucene 實現java
優點:mysql
分佈式的實時文件存儲,每一個字段都被索引並可被搜索sql
實時分析的分佈式搜索引擎json
橫向可擴展:支持上百臺服務節點的擴展,集羣增長機器簡單,支持處理PB級數據api
分片機制:數組
容許水平分割擴展數據,容許分片和並行操做從而提升性能和吞吐量數據結構
提供高性能:同一個索引能夠分多個主分片(primary shard
),每一個主分片擁有本身的副本分片(replica shard
),每一個副本分片均可以提供服務,提高系統搜索請求的吞吐量和性能併發
提供高可用性:同一個索引能夠分多個主分片,每一個主分片擁有零個或者多個副本,若是主分片掛了,能夠從副本分片中選擇一個做爲主分片繼續提供服務app
Cluster
:集羣
一個集羣包含多個節點,對外提供服務,每一個節點屬於哪一個集羣經過配置文件中的集羣名稱決定
Node
:節點
集羣中的一個節點,每一個節點也有一個名稱,默認是隨機分配,也能夠本身指定,在es集羣中經過節點名稱進行管理和通訊
Index
:索引
索引是具備相同結構的文檔集合,做用至關於mysql中的庫
Type
:類型
一個索引能夠對應一個或者多個類型,類型能夠當作是索引的邏輯分區,做用至關於mysql中的表
Document
:文檔
存儲在es中的一個JSON
格式的字符串,每個文檔有一個文檔ID,若是沒有本身指定ID,系統會自動生成一個ID,文檔的index/type/id必須是惟一的,做用至關於mysql中的行
field
:字段
一個文檔會包含多個字段,每一個字段都對應一個字段類型,相似於mysql中的列
shard
:分片
es中分爲primary shard
主分片和replica shard
副本分片
主分片:當存一個文檔的時候會先存儲在主分片中,而後複製到不一樣的副本分片中,默認一個索引會有5個主分片,固然能夠本身指定分片數量,當分片一旦創建,分片數量不能改變
副本分片:每個主分片會有零個或者多個副本,副本主要是主分片的複製,經過副本分片能夠提供高可用性,當一個主分片掛了,能夠從副本分片中選擇一個做爲主分片,還能夠提升性能,因此主分片不能和副本分片部署在相同的節點上
replica
:複製
複製是爲了防止單點問題,能夠作到對故障進行轉移,保證系統的高可用
映射
描述數據在每一個字段內如何存儲,是定義存儲和索引的文檔類型及字段的過程,索引中的每個文檔都有一個類型,每種類型都有它本身的映射,一個映射定義了文檔結構內每一個字段的數據類型
使用GET /index/_mapping/type
獲取對應的/index/type
的映射信息
建議安裝Elasticsearch+Kibana,在Kibana的操做界面對es進行操做
Elasticsearch提供了RESTful接口能夠對Elasticsearch進行操做
Kibana操做頁面
在Kibana的Dev Tools界面能夠對es進行操做,在console界面敲命令,點執行,會在右面輸出結果
驗證Elasticsearch是否安裝成功
{
"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
表明着集羣的健康程度
green
:每一個索引的primary shard和replica shard都是active狀態的yellow
:每一個索引的primary shard都是active狀態的,可是部分replica shard不是active狀態,處於不可用的狀態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 中的數據能夠歸納的分爲兩類:精確值和全文
Foo
和 foo
是不一樣的,精確值的查詢簡單,要麼匹配查詢,要麼不匹配在es中使用 倒排索引來進行快速的全文搜索。一個倒排索引由文檔中全部不重複詞的列表構成,對於其中每一個詞,有一個包含它的文檔列表,倒排索引具體內容請戳:www.elastic.co/guide/cn/el…
es中的字符串類型分爲keyword
和text
keyword
:用於索引結構化內容的字段,例如電子郵件地址,主機名,狀態代碼,郵政編碼或標籤。它們一般用於過濾,排序,和聚合。keyword字段只能按其確切值進行搜索。若是您須要索引電子郵件正文或產品說明等全文內容,則可能應該使用text字段text
:用於索引全文值的字段,例如電子郵件正文或產品說明。這些字段是analyzed,它們經過分詞器傳遞 ,以在被索引以前將字符串轉換爲單個術語的列表。分析過程容許Elasticsearch搜索單個單詞中 每一個完整的文本字段。文本字段不用於排序,不多用於聚合有時候一個字段同時擁有全文類型(text)和關鍵字類型(keyword)是有用的:一個用於全文搜索,另外一個用於聚合和排序。這能夠經過多字段類型來實現(動態映射是字符串的默認映射類型)
參考: Elasticsearch: 權威指南 www.elastic.co/guide/cn/el…