ES快速入門


一、概念

1.ES基礎概念

  ES是ElasticSearch的縮寫。ES是基於Apache Lucene的開源搜索引擎,是一款實時分布式搜索和分析引擎,提供RestfulAPI可以進行可視化的交互。具有如下特點:

  1) 提供分布式的實時文件存儲,每個字段都被索引並可被搜索;

  2)實時分析的分布式搜索引擎;

  3)可以擴展到上百萬台服務器,能處理PB級結構化或非結構化的數據

2.NRT

  NRT是近實時Near Realtime的縮寫。ES是一款近實時的搜索平台,即意味着有輕微的延遲,在從開始索引文檔到有結果的時間稍微延遲通常為1秒。

3.ES和SQL

  ES也是一種數據庫,學習ES可以對比SQL來理解和學習。下面先列出二者的關系如表-1,方便讀者有個大概了解。第二節會詳細介紹關於ES的常用術語。

 
表-1.ES和SQL對照理解

 

二、存儲相關

1.物理存儲

1)Cluster

  集群是一個或者一個以上的節點(服務器)的集合。並在所有節點上提供聯合的索引和搜索功能。集群由唯一的名稱標識,默認情況下是“elasticsearch”。該名稱很重要,因為如果節點設置為通過其名稱加入集群,則節點只能是集群的一部分。

2)Node

  節點是作為集群一部分的單一服務器,存儲您的數據,並參與集群的索引和搜索功能。就像一個集群一樣,一個節點由一個名稱來標識,默認情況下是一個隨機的通用唯一標識符(UUID),它在啟動時分配給該節點。所有的節點通過設置集群名cluster.name來確定屬於某個集群。

3)Shard

  由於索引存在存儲可能超過單個節點的硬件限制的大量數據。例如,占用1TB磁盤空間的10億個文檔的單個索引可能不適合單個節點的磁盤,或者可能太慢,無法單獨從單個節點提供搜索請求。因此分片就是為了解決這個問題。每個索引被分成若干個分片。分片被存儲在不同的節點中。分片很重要,使用分片的作用:

a) 允許水平分割/縮放內容,提高擴展能力;

b) 允許在分片(可能在多個節點上)分布和並行操作,從而提高性能/吞吐量;

4)Replica

  副本是分片的復制。副本的作用:

a) 如果分片/節點出現故障,則可提供高可用性

b) 允許擴展搜索量/吞吐量,因為可以對所有副本並行執行搜索

  默認情默認情況下,ElasticSearch中的每個索引都分配了5個主分片和1個副本況下,ElasticSearch中的每個索引都分配了5個主分片和1個副本。創建索引后,您可以隨時動態更改副本數,但不能更改主分片數。

2.邏輯存儲

1)Index

  索引是具有某種相似特征的文檔的集合。例如,您可以擁有客戶數據的索引,產品目錄的另一個索引,以及訂單數據的另一個索引。索引由名稱(必須全部為小寫)標識,該名稱用於在針對其中的文檔執行索引,搜索,更新和刪除操作時引用索引。

2)Type

  類型是您的索引的邏輯類別/分區,允許您將不同類型的文檔存儲在同一索引中,例如用戶的一種類型,博客文章的另一種類型。在索引中不再可能創建多個類型,並且在以后的版本中將刪除整個類型的概念。

3)Document

  文檔是可以索引的基本信息單元。例如,您可以為單個客戶提供文檔,單個產品的文檔,單個訂單的另一個文檔。該文檔以JSON(JavaScript Object Notation)表示,它是一種無處不在的互聯網數據交換格式。

4)Field

  多個字段組成一個文檔。一個索引的所有文檔類型中對於具有相同名稱的字段必須是同一種數據類型,與SQL SERVER不同,同一數據庫中不同表中相同名稱的列數據類型可以不一樣。

5)Mapping

  映射就是字段即字段和字段類型的對應關系。映射機制用於進行字段類型確認,將每個字段匹配為一種確定的數據類型。例如:字段name,類型是String;字段age,類型是Integer。除此之外字段的類型也可以是日期、布爾值、數組、浮點數、對象等等。

三、基礎操作

1.創建

增加一行數據,使用關鍵字Create。內容按照json數據,可以手動寫,也可以根據已知的json格式創建。

語法模板一:

curl -XPOST localhost:9200/索引名/類型名/'-d'

{"title":"xxxx","text":"xxxx","date":"2014/01/01"}

備注:-d參數用於將數據放在http請求的body中發送

語法模板二:

curl -XPOST localhost:9200/create_index_action/索引名/類型名/ --data-binary @a.json

備注:依據據a.json創建

2.刪除

刪除一行數據,使用關鍵字Delete。

語法模板:

curl -XDELETE localhost:9200/索引名/類型名/ID

備注:ID號一般是自動生成的唯一標志符,也可以更具需要自定義。

3.修改

修改一行數據,使用關鍵字Update。

語法模板:

1)修改某一字段的值

curl -XPOST localhost:9200/索引名/類型名/ID號/_update?pretty

{

"doc":{"name":"wxxq"}

}

2)增加一個字段

curl -XPOST localhost:9200/索引名/類型名/ID號/_update?pretty

{

"doc":{"name":"wxxq","age":18}

}

3)使用腳本修改

curl -XPOST localhost:9200/索引名/類型名/ID號/_update?pretty

{

"script":"ctx._source.age+=5"

}

備注:ctx._source指的是即將更新的當前源文檔

4.簡單查詢

查詢數據,使用關鍵字Search。

語法模板:

1)空查詢:

  curl -XGET localhost:9200/_search?pretty

  備注:返回索引中所有的文檔

2)根據id號來查詢:

  curl -XGET localhost:9200/索引名/類型名/_search?q="_id":"AV4CnR6NuLtuw-m9JsB_"

3)模糊查詢:

  curl -XGET localhost:9200/_all/_search?q="add"

 

  備注:查詢有add的文檔

5.批處理

  批量處理數據,使用關鍵字bulk。

語法模板:

1)同時修改多個索引

  curl -XPOST localhost:9200/索引名/類型名/_bulk?pretty

  {"index":{"_id":"1"}}

  {"name": "John Doe" }

  {"index":{"_id":"2"}}

  {"name": "Jane Doe" }

2)對多個索引進行不同的處理操作

  curl -XPOST localhost:9200/索引名/類型名/_bulk?pretty

  {"update":{"_id":"1"}}

  {"doc": { "name": "John Doe becomes JaneDoe" } }

  {"delete":{"_id":"2"}}

6.搜索結果釋義

圖-1是一張搜索結果的截圖,下面將針對搜索結果的結構解釋來查看數據內容。

 

 
圖-1.搜索結果

 

搜索結果備注:

took:執行ES的搜索需要的時間

timed_out:是否超時

_shards:搜索了多少個分片,成功數量,失敗數量

hits:搜索結果,通過鍵值對展示

hits.total:符合搜索條件的文件總數

hits.hits:實際搜索結果數組

_index:該條數據所在索引

_type:該條數據所在類型

_id:該數據的唯一標識符

_source:該條數據的內容,里面由多個fields組成

四、復雜查詢

1.多條件查詢

curl -XGET localhost:9200/school/student/_search{

"query":{

"bool":{

               "must":[{"match":{"gender":"male"}},

                             {"match":{"age":18}}],

              "should":["match":{"hobby":"music"}],

               "must_not":["match":{"address":"BeiJing"}]

}},

"from":5,

"size":10,

"sort":{"age":{"order":"desc"}}

}

2.過濾器

curl -XGET localhost:9200/school/student/_search{

"query": {

               "bool": {

                               "must": {

                                                     "match_all": {}

                                             },

                               "filter": {

                                                      "range": {

                                                                            "money": {

                                                                                                 "gte": 20000,

                                                                                                 "lte": 30000

                                                                                              }

                                                                        }

                                           }

                        }

 },

"from":5,

"size":10,

"sort":{"age":{"order":"desc"}}

}

備注1:

gt          大於

gte        大於等於

lt            小於

lte          小於等於

備注2:

除了使用range過濾,還可以使用term,terms,exists,missing等

1) term用於精確匹配某些值,如數字,日期,布爾值

   {"term":{"age":20}}

   {"term":{"date":"2017-08-21"}}

2) terms與term類似,但允許指定多個匹配條件,當某個字段存在多個值時

    {"terms":{

                      "tag":["search","full_text","nosql"]

                   }

      }

3)exists包含某字段

{

        "exists":{

                       "fields":"tittle"

                    }

}

4)missing沒有某字段

{

         "missing":{

                              "fields":"tittle"

                        }

}

3.聚合

聚合(aggregations)類似於SQL的Group By。

curl -XGET localhost:9200/school/student/_search{

 "size":0,

"aggs":{

"group_by_age":{

                                   "range":{

                                                           "field":"age",

                                                           "ranges":[{"from":20,

                                                                              "to":30},

                                                                            {"from":30,

                                                                               "to":40},

                                                                             {"from":40,

                                                                                 "to":50}]

                                                    }

                         }

   }

}

聚合還支持嵌套查詢

curl -XGET localhost:9200/school/student/_search{

"size":0,

"aggs":{

"group_by_age":{

                             "range":{

                                           "field":"age",

                                          "ranges":[{"from":20,

                                                              "to":30},

                                                          {"from":30,

                                                                "to":40},

                                                          {"from":40,

                                                                "to":50}]

                                    }

        }

},

"aggs":{

              "group_by_gender":{

                                                   "terms":{

                                                                  "field":"gender"

                                                      },

                                                    "aggs":{

                                                                   "avg":{

                                                                              "field":"balance"

                                                                            }

                                                               }

                                           }

             } 

}

 


作者:__Jasmine__
鏈接:https://www.jianshu.com/p/ddee872c69c1
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM