elasticsearch 基本概念

2022-02-07 05:04:29 字數 1948 閱讀 3046

先模擬 elasticsearch 和 關係型資料庫對應的某些概念,了解es的結構:

索引:簡單理解成資料庫

分片:乙個索引由多個分片組成,應用程式向es請求的時候,是向索引請求,但是實際上工作的是分片,每個分片都是乙個lucene(搜尋引擎),需要占用一定的內                存,cpu,磁碟等物理資源,他是乙個最小工作單位,是實際能跑的乙個程式。

主分片:主分片比起副分片,多出的功能只是提供寫入文件(索引文件,在es的官方文件中,經常會同義"索引"和"寫入")

副分片:類似hdfs中的replica,或者更像是資料庫主從複製中的 從資料庫,只提供讀功能

如果乙個es集群只有乙個主分片,那麼整個索引的所有資料都在這個主分片裡,無論有多少個副分片,和只有乙個主資料庫同理。

如果乙個es集群有兩個主分片,無論多少個副分片,那麼整個索引的資料分布在這兩個主分片裡,類似與關係型資料庫分庫,橫切資料庫表

n個主分片,以此類推。

型別:分片的資料的組成部分,每個部分代表一類事務。

文件:相當於關係型資料庫中的一行記錄,es的實質是 分布式文件儲存系統

id:類似與關係型資料庫中行記錄的主鍵

域:相當於字段

elasticsearch 存在兩種獲得文件的方式:

1.根據域(字段)搜尋

2.id直達

兩種獲取方式的速度都挺快,因為elasticsearch對同一條文件(記錄)儲存了兩種資料結構

正排索引和倒排索引

省略掉偏移量之類的屬性,我們只看簡單的查詢過程

下圖第乙個是正排索引,可以簡單理解成我們儲存進去的內容,並且每條文件有唯一的標識(id)確認

對映其實就是對類似關係型資料庫的表的型別進行域(字段)定義,比如 age 是 integer......

對映還可以指明乙個域是否可以被解析,如果可以的話,可以在對映指定相應的解析器

第二個是倒排索引,在存入文件的時候,都需要將存入的文件(一條記錄)中需要分析(analyse)的域進行分析器分析

比如 i love your sister,一般使用英語分析器分詞,分詞後分出的單元叫做 term,比如這句話會被分為 i , love , your , sister 這四個term。

當然,有一些分析器有去除無用詞功能,比如 the , a 這些無太大意義的詞會被去除。

對於可分析的域,查詢的值也要通過相同的分析器進行分析,然後進行檢索,比如查詢 love your,那麼 也會按照上面同樣的解析器解析查詢的值,解析成 your ,sister 兩個term然後再用倒排索引檢索

查詢這種可解析的域 叫做全文域查詢

如果乙個域是不可分析的,那麼查詢的值本身就是乙個term,這種查詢叫做精確值查詢

文件中的字段,無論是否可解析,都會被建立倒排索引,所以把一條記錄寫入到es中,「寫入」被稱為「索引」

物件導向表示和處理了真實世界中潛在的各種複雜資料結構,es的每條文件都代表乙個物件,當然,物件中可以巢狀物件,文件指的是巢狀結構中最頂層的物件

當然儲存方式不一定如下圖,因為這樣的話要線下時間去遍歷出文件的唯一索引,一種假設的方法是當相關文件數太多的時候,可以使用查詢樹結構或b+數結構

es使用簡單的 resful 風格的 api ,索引+型別+id可以唯一標識乙個文件(一條記錄),使用不同的請求方法可以 進行不同操作,比如刪除,新增,修改

get or post or put...  /索引名/型別名/id

需要注意的是 es 是不支援修改的,名義上是修改,但實際上是 將原本的內容 讀出 轉換成 json ,然後修改 ,修改後寫會索引,同時刪除舊文件。

es可以全量替換掉某個id的文件,實際過程也是 刪除 - 新增

Elasticsearch 基本操作

mget elasticsearch中檢索多個文件,相對於乙個乙個的檢索,更快的方式是在乙個請求中使用multi get或者 mget api。具體應用如下 mget api引數是乙個 docs 陣列,陣列的每個節點定義乙個文件的 index type id 元資料。如果你只想檢索乙個或幾 個確定的...

elasticsearch基本操作

get search 建立索引 指定分片和副本 put lib 建立索引 put lib2 檢視索引的配置 get lib settings get lib2 settings get all settings 新增文件put方式指定id put lib user 1 新增文件,不指定id用post...

Elasticsearch 基本操作

乙個批量匯入elasticsearch 的demo 機器少的話,分片數最好是你的data節點的機器數倍數,這樣請求負載能夠均攤到每個機器上,如果機器比較多,最好保證分片數不要太多,比如最好別超過20 30個,然後根據你的資料量評估一下,盡量保證每個分片在15到20g吧 資料 vi request.j...