Elasticsearch學習第一篇--Elasticsearch初認知

最近開始學習Elasticsearch,作爲Elk Stack (Elasticsearch、Logstash、Kibana)的核心,優先學習,貫穿學習Logstash、Kibana的使用。因爲工作項目使用的6.3版本,我這邊也是學習6.3;目前最新已是7.x 。

ElasticSearch 基本概念

定義:基於 Apache Lucene 的開源搜索引擎

核心概念:

  • lucene

功能強大的搜索庫,但比較複雜,elasticSearch基於lucene,提供了簡單易用的restful api接口、java api接口等。

  • Node 與 Cluster

Elastic 本質上是一個分佈式數據庫,允許多臺服務器協同工作,每臺服務器可以運行多個 Elastic 實例。

單個 Elastic 實例稱爲一個節點(node)。一組節點構成一個集羣(cluster)。

  • Index

索引是具有某種相似特徵的文檔的集合。索引有一個名稱標識,該名稱用於在對其中的文檔執行索引、搜索、更新和刪除操作時引用索引。

Elastic 會索引所有字段,經過處理後寫入一個倒排索引(Inverted Index)。查找數據的時候,直接查找該索引。

所以,Elastic 數據管理的頂層單位就叫做 Index(索引)。它是單個數據庫的同義詞。每個 Index (即數據庫)的名字必須是小寫。

其實還有一個type;1個索引可以有1至多個type;

比如建立了一個索引是博客;  然後又可以細分博客內容type,博客評論type等;貌似7.x 取消了type。

  • Document

文檔是可以被索引的基本信息單元。文檔用JSON表示。 可以理解爲java的對象。

同一個 Index 裏面的 Document,不要求有相同的結構(scheme),但是最好保持相同,這樣有利於提高搜索效率。

  • 分片

當有大量的文檔時,由於內存的限制、磁盤處理能力不足、無法足夠快的響應客戶端的請求等,一個節點可能不夠。這種情況下,可以將一個索引的數據可以分爲較小的shard,分佈在多臺服務器上存儲。 從而實現橫向拓展,讓搜索和分析等操作分佈到多臺服務器上執行,提高吞吐量和性能。這時候每個shard都是一個lucene index。所以一般一個index包含多個shard。

增減節點時,shard 會自動在nodes中負載均衡,使用者不用關注負載均衡問題,很方便擴容。
當你查詢的索引分佈在多個分片上時,ES會把查詢發送給每個相關的shard,並將結果組合在一起,而應用程序並不知道分片的存在。即:這個過程對用戶來說是透明的。

分片有兩種:Primary Shard  主分片 和Replica shard:副本分片

爲提高查詢吞吐量或實現高可用性,可以使用分片副本。Replica shard是一個Primary Shard的精確複製,每個Primary Shard可以有零個或多個Replica shard。ES中可以有許多相同的分片,其中之一被選擇更改索引操作,這種特殊的分片稱爲主分片。 
當主分片丟失時,如:該分片所在的數據不可用時,集羣將Replica shard提升爲新的Primary Shard(白話點就是ES的容災機制),比較特殊的是replica shard 也會承擔讀請求負載。

所以呢,主分片和副本分片不要放到一個節點上,不然節點掛掉,副本分片也是用不了,沒有任何意義。

主分片的數量在創建索引的時候就固定了,但Replica shard的數量可以隨時修改。

  • 全文檢索

全文檢索就是對一篇文章進行索引,可以根據關鍵字搜索,類似於mysql裏的like語句。 

中文檢索較複雜,常用到分詞器,比IK.

  • NLK 近實時

寫入ES到讀取近實時;

搜索和分析可以達到秒級,近實時

ES數據架構的主要概念(與關係數據庫Mysql對比)

è¿éåå¾çæè¿°

1)關係型數據庫中的數據庫(DataBase),等價於ES中的索引(Index) 
2)一個數據庫下面有N張表(Table),等價於1個索引 Index下面有N多類型(Type), 
3)一個數據庫表(Table)下的數據由多行(ROW)多列(column,屬性)組成,等價於1個Type由多個文檔(Document)和多Field組成。 
4)在一個關係型數據庫裏面,schema定義了表、每個表的字段,還有表和字段之間的關係。 與之對應的,在ES中:Mapping定義索引下的Type的字段處理規則,即索引如何建立、索引類型、是否保存原始索引JSON文檔、是否壓縮原始JSON文檔、是否需要分詞處理、如何進行分詞處理等。 
5)在數據庫中的增insert、刪delete、改update、查search操作等價於ES中的增PUT、刪Delete、改POST、查GET.

此關係引自:https://blog.csdn.net/roshy/article/details/89307570

 ES特點和優勢

1)分佈式實時文件存儲,可將每一個字段存入索引,使其可以被檢索到。 
2)實時分析的分佈式搜索引擎。 
分佈式:索引分拆成多個分片,每個分片可有零個或多個副本。集羣中的每個數據節點都可承載一個或多個分片,並且協調和處理各種操作; 負載再平衡和路由在大多數情況下自動完成。 
3)可以擴展到上百臺服務器,處理PB級別的結構化或非結構化數據。也可以運行在單臺PC上(已測試) 
4)支持插件機制,分詞插件、同步插件、Hadoop插件、可視化插件等。

ES安裝

開箱即用,比較方便

https://www.elastic.co/cn/官網下載 es 和kibana, 解壓後到目錄執行bin\elasticsearch.bat即可。

默認端口9200 ,默認集羣名稱my-application; 如需要修改,可以到ES的解壓目錄config下 修改elasticsearch.yml

檢查ES是否啓動成功:http://localhost:9200 

如圖:

name: node名稱
cluster_name: 集羣名稱(默認的集羣名稱就是elasticsearch)
version.number: 6.3.2,es版本號

kibana安裝(ES的看板)

也是開箱即用,解壓後啓動Kibana:bin\kibana.bat

默認端口5601,可去kibana解壓包conf下修改kibana.yml

驗證啓動:http://localhost:5601

 

kibana看板的一些簡單操作

(1)快速檢查集羣的健康狀況

GET /_cat/health?v
epoch      timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1591689514 15:58:34  simon   green           1         1      1   1    0    0        0             0                  -                100.0%

status :green、yellow、red

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

這裏顯示的是yellow ,因爲我自己PC只啓動了一個es,相當於就只有一個node.

由於默認的配置是給每個index分配5個primary shard和5個replica shard,而且primary shard和replica shard不能在同一臺機器上(爲了容錯)。現在kibana自己建立的index是1個primary shard和1個replica shard。當前就一個node,所以只有1個primary shard被分配了和啓動了,但是一個replica shard沒有第二臺機器去啓動。

(2)快速查看集羣中有哪些索引

GET /_cat/indices?v

(3)簡單的索引操作

創建索引:

PUT /test_index

刪除索引:

DELETE /test_index

(4)建立索引後的簡單CRUD操作

新增

put test_index/base/1
{
  "name":"xiaoming",
  "age":18,
  "sex":"M"
}

這時候去查詢

get test_index/base/1

查的結果:

{
  "_index": "test_index",
  "_type": "base",
  "_id": "1",
  "_version": 2,
  "found": true,
  "_source": {
    "name": "xiaoming",
    "age": 18,
    "sex": "M"
  }
}

 

修改

修改方式1:可以增量修改

POST /test_index/base/1/_update
{
  "doc": {
    "age": 20
  }
}

再次查詢

{
  "_index": "test_index",
  "_type": "base",
  "_id": "1",
  "_version": 2,
  "found": true,
  "_source": {
    "name": "xiaoming",
    "age": 20,
    "sex":"M"
  }
}

修改方式2:這種方式會覆蓋;PUT或POST都可以

post test_index/base/1
{
  "age":30
}

再次查詢

{
  "_index": "test_index",
  "_type": "base",
  "_id": "1",
  "_version": 2,
  "found": true,
  "_source": {
    "age": 30
  }
}

刪除

DELETE /test_index/base/1/

 

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