ElasticSearch 入門

1、簡介

  ElasticSearch 是一個基於 Apache Lucene 的開源分佈式搜索引擎。它經過RESTful API 來隱藏Lucene的複雜性,從而讓全文搜索變得簡單。不過,Elasticsearch 不只僅是 Lucene 和全文搜索,咱們還能這樣去描述它:html

  • 分佈式的實時文件存儲,每一個字段都被索引並可被搜索
  • 分佈式的實時分析搜索引擎
  • 能夠擴展到上百臺服務器,處理PB級結構化或非結構化數據

  2004年, 有一個叫Shay Banon的待業工程師跟隨他的新婚妻子來到倫敦,他的妻子想在倫敦學習作一名廚師。而後他想爲本身的妻子開發一個方便搜索菜譜的應用,他開始使用 Lucene 的一個早期版本。可是嘗試以後,他感覺到了直接使用 Lucene 開發程序的各類暴擊和痛苦,因而他在 Lucene 之上,封裝了一個叫做 Compass 的程序框架而且把它開源了。node

  後來 Shay 找到了一份跟高性能和分佈式相關的工做,他在工做中漸漸發現,愈來愈須要一個易用的高性能、實時、分佈式搜索服務,因而他決定重寫Compass,將它從一個庫打形成了一個獨立的server,並將其更名爲Elasticsearch。編程

  Shay Banon在2010年2月發佈了Elasticsearch的第一個版本。它支持分佈式,能夠水平擴展,增長了Restful api, 下降了全文檢索的學習曲線,能夠被任何編程語言調用。json

  2012年成立了Elasticsearch 公司,主要圍繞Elasticsearch及相關軟件提供商業服務和產品。2014年6月,在成立公司18個月後,該公司宣佈經過C輪融資籌集7000萬美圓。這輪融資由新企業協會(NEA)牽頭。其餘投資者包括Benchmark Capital和Index Ventures。這一輪融資總計1.04億美圓。api

  2015年3月,Elasticsearch公司改名爲Elastic。安全

  2018年6月,Elastic提交了首次公開募股申請,估值在15億到30億美圓之間。公司於2018年10月5日在紐約證券交易所掛牌上市。服務器

2、安裝

  ElasticSearch 提供了開箱即用的功能,在 7.0 以前還須要安裝 Jdk,可是 7.0 以後內置了Jdk,因此只要從官網下載相應平臺的壓縮包便可。網絡

  如下使用 Mac 做爲演示app

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-darwin-x86_64.tar.gz
$ tar -zxvf elasticsearch-7.3.0-darwin-x86_64.tar.gz
$ cd elasticsearch-7.3.0-darwin-x86_64

  進入 elasticsearch 目錄中,而後運行elasticsearch  框架

$ ./bin/elasticsearch

  若是啓動一切正常,ElasticSearch 默認會監聽 9200 端口,此時你能夠訪問本機的地址: http://localhost:9200, 會返回以下信息:

{
  "name" : "chengshengzhangdeMacBook-Pro.local",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "EsoM4PhOQzyPzGUOYH4E4A",
  "version" : {
    "number" : "7.3.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "de777fa",
    "build_date" : "2019-07-24T18:30:11.767338Z",
    "build_snapshot" : false,
    "lucene_version" : "8.1.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

  ElasticSearch 文件目錄以下:

  

3、基本概念

3.一、Cluster 集羣

  集羣是一個或者多個節點協同工做來承載,並提供跨全部節點的索引和搜索功能。ElasticSearch 經過配置 cluster.name 來惟一標識集羣,或者在命令啓動時經過 -E cluster.name=my-cluster 指定。

3.二、Node 節點

  節點是組成集羣的一個 ElasticSearch 實例,用於存儲數據並提供集羣的搜索和索引功能。與集羣同樣,ElasticSearch 經過配置 node.name 來惟一標識一個節點,或或者在命令啓動時經過 -E node.name=node1 指定。

  本質上一個節點就是一個 Java 進程,一臺機器上能夠運行多個 ElasticSearch 進程,可是生產環境下通常建議一臺機器只運行一個 ElasticSearch 實例。

3.三、Index 索引

  索引是相同特性的文檔集合。好比客戶索引,訂單索引。

3.四、Type 類型

  ElasticSearch 在 7.0 以前,一個Index能夠設置多個Type,可是從 6.0 開始,Type已經被 Deprecated,7.0 開始,一個索引只能建立一個 Type, 名字叫 "_doc"。

3.五、Document 文檔

  ElasticSearch 是面向文檔的,文檔是全部可搜索數據的最小單位,好比一條日誌信息,一筆訂單數據等。文檔會被序列化成 JSON 格式,保存在 ElasticSearch 中,每一個文檔都會有一個UniqueID,能夠在建立的時候本身指定,也能夠經過 ElasticSearch 自動生成。

3.六、Primary Shard and Replicas Shard [主分片和副本]

  ElasticSearch 是分佈式的,爲了解決索引能夠存儲超過一個節點機器硬件限制的數據的問題。ES 提供了將單個索引分割成多個分片的功能。ES 的分片分爲 Primary Shard(主分片) and Replicas Shard(副本) 。

  主分片,用戶解決數據水平擴展的問題,經過主分片,能夠將數據分佈到集羣內的全部節點上。一個分片本質上是一個運行的 Lucene 實例,主分片在索引建立時指定,後續不容許修改,除非進行 Reindex。

  副本,用以解決數據高可用的問題,副本是主分片的拷貝。副本分片數,能夠進行動態調整,增長副本數,能夠在必定程度上提供服務的可用性(讀取的吞吐)。

4、重要配置

4.一、path.data 和 path.logs

  若是您正在使用.zip或.tar.gz文件歸檔,data和logs 目錄在 $ES_HOME 下。若是這些重要文件夾保留在默認位置,則Elasticsearch升級到新版本時,頗有可能被刪除。在生產中使用,確定要更改數據和日誌文件夾的位置:

path:
  logs: /var/log/elasticsearch
  data: /var/data/elasticsearch

  補充說明:在生產環境下,應用程序的數據和日誌通常須要配置到獨立的磁盤分區下。好比/data目錄做爲獨立的數據分區,/var/log做爲應用程序日誌分區。這樣作的好處是,防止因應用程序數據或日誌增加,撐爆OS分區。

4.二、cluster.name

   集羣名稱,惟一標識一個集羣,某個節點只有和集羣下的其餘節點共享它的 cluster.name 才能加入一個集羣。默認是elasticsearch,可是應該修改成更恰當的,用於描述集羣目的的名稱。

cluster.name: my-cluster

  必定要確保不要在不一樣的環境中使用相同的集羣名稱。不然,節點可能會加入錯誤的集羣中。

4.三、node.name

  節點名稱, 惟一標識一個節點,默認狀況下,Elasticsearch 將使用隨機生成的uuid的前7個字符做爲節點id,請注意,節點ID是持久化的,而且在節點從新啓動時不會更改,所以默認節點名稱也不會更改。也可使用服務器的 HOSTNAME 做爲節點的名稱。

node.name: ${HOSTNAME}

4.四、node.master 和 node.data

  node.master 表示節點是否參與master的選舉,默認爲 true。每個節點上都保存了集羣的狀態,只有 Master 節點才能修改集羣的狀態信息。

  node.data 表示節點是不是數據節點,默認是 true。負責保存分片數據。

4.五、network.host

  默認狀況下,ElasticSearch 僅僅綁定迴環地址,好比 127.0.0.1 和 [::1], 這足以在服務器上運行單個開發節點。爲了與其餘服務器上的節點進行通訊並造成集羣,你的節點將須要綁定到非環回地址。雖然這裏有不少網絡相關的配置,但一般只須要配置一下 network.host。

network.host: 192.168.60.101

  一旦自定義設置了 network.host ,Elasticsearch 會假定你正在從開發模式轉移到生產模式,並將許多系統啓動檢查從警告升級到異常。

  默認狀況下,Elasticsearch假定您正在開發模式下工做。 若是未正確配置上述任何設置,則會向日志文件寫入警告,但您將可以啓動並運行Elasticsearch節點。

  一旦配置了network.host之類的網絡設置,Elasticsearch就會假定您正在轉向生產並將上述警告升級爲異常。 這些異常將阻止您的Elasticsearch節點啓動。 這是一項重要的安全措施,可確保您不會因服務器配置錯誤而丟失數據。   

5、基本操做

5.一、Index 建立文檔

  Type 名稱約定是 _doc, 若是向指定的 /Index/doc 發送 PUT 請求,就能夠在該 Index 下面增長一條記錄,若是文檔ID不存在,則建立新的文檔。不然會先刪除現有的文檔,再建立新的文檔,可是版本號會增長。

curl -X PUT http://localhost:9200/my_index/_doc/1 -H 'Content-Type:application/json' -d '
{
  "user": "zhang san",
  "title": "Development Engineer"
}'

  返回值:

{
    "_index":"my_index",
    "_type":"_doc",
    "_id":"1",
    "_version":1,
    "result":"created",
    "_shards":{
        "total":2,
        "successful":1,
        "failed":0
    },
    "_seq_no":0,
    "_primary_term":1
}

5.2 _create 新建文檔

  經過 _create 建立新的文檔,若是文檔ID存在,則會建立失敗,以下:

curl -X PUT http://localhost:9200/my_index/_create/1 -H 'Content-Type:application/json' -d '
{
  "user": "li si",
  "title": "Development Engineer"
}'

  返回值:

{
    "error":{
        "root_cause":[
            {
                "type":"version_conflict_engine_exception",
                "reason":"[1]: version conflict, document already exists (current version [2])",
                "index_uuid":"2ow9LqwSQout7C_y9dW-wA",
                "shard":"0",
                "index":"my_index"
            }
        ],
        "type":"version_conflict_engine_exception",
        "reason":"[1]: version conflict, document already exists (current version [2])",
        "index_uuid":"2ow9LqwSQout7C_y9dW-wA",
        "shard":"0",
        "index":"my_index"
    },
    "status":409
}

5.三、查看文檔

  經過 GET 方式能夠讀取相應的文檔。 找到文檔,返回 HTTP 200, 找不到文檔,返回 HTTP 404。

curl -X GET http://localhost:9200/my_index/_doc/1

  返回值:

{
    "_index":"my_index",
    "_type":"_doc",
    "_id":"1",
    "_version":2,
    "_seq_no":1,
    "_primary_term":1,
    "found":true,
    "_source":{
        "user":"zhang san",
        "title":"Development Engineer"
    }
}

5.四、修改文檔

  Update 方法不會刪除原來的文檔,而是實現真正的數據更新。 採用POST請求方式,Payload 須要包含在 "doc" 上。

curl -X POST http://localhost:9200/my_index/_update/1 -H 'Content-Type:application/json' -d '
{
   "doc": {"user": "lisi"}   
}' 

  返回值:

{
    "_index":"my_index",
    "_type":"_doc",
    "_id":"1",
    "_version":6,
    "result":"updated",
    "_shards":{
        "total":2,
        "successful":1,
        "failed":0
    },
    "_seq_no":6,
    "_primary_term":1
}

5.五、刪除文檔

  Delete 刪除文檔

curl -X DELETE http://localhost:9200/my_index/_doc/1

  返回值:

  

{
    "_index":"my_index",
    "_type":"_doc",
    "_id":"1",
    "_version":3,
    "result":"deleted",
    "_shards":{
        "total":2,
        "successful":1,
        "failed":0
    },
    "_seq_no":3,
    "_primary_term":1
}

6、參考資料

相關文章
相關標籤/搜索