elasticsearch 基本概念

2022-03-10 21:38:55 字數 2851 閱讀 9218

elasticsearch是面向文件

關係行資料庫 和 elasticsearch 客觀的對比

relational db

elasticsearch

資料庫(database)

索引(indices)

表(tables)

types

行(rows)

documents

字段(columns)

fields

elasticsearch(集群)中可以包含多個索引(資料庫),每個索引中可以包含多個型別(表),每個型別下又包含多 個文件(行),每個文件中又包含多個字段(列)。

注意 elasticsearch 在第乙個版本的開始 每個文件都儲存在乙個索引中,並分配乙個 對映型別,對映型別用於表示被索引的文件或者實體的型別,這樣帶來了一些問題 (詳情:導致後來在 elasticsearch6.0.0 版本中乙個文件只能包含乙個對映型別,而在 7.0.0 中,映 射型別則將被棄用,到了 8.0.0 中則將完全被刪除。

乙個索引型別中,包含多個文件,比如說文件1,文件2。 當我們索引一篇文件時,可以通過這樣的一各順序找到 它: 索引 ▷ 型別 ▷ 文件id ,通過這個組合我們就能索引到某個具體的文件。 注意:id不必是整數,實際上它是個

字 符串。

之前說elasticsearch是面向文件的,那麼就意味著索引和搜尋資料的最小單位是文件,elasticsearch中,文件有幾個 重要屬性:

儘管我們可以隨意的新增或者忽略某個字段,但是,每個欄位的型別非常重要,比如乙個年齡字段型別,可以是字元 串也可以是整形。因為elasticsearch會儲存欄位和型別之間的對映及其他的設定。這種對映具體到每個對映的每種類 型(因此帶來的問題詳情:這也是為什麼在elasticsearch中,型別有時候也稱為對映型別。

型別是文件的邏輯容器,就像關係型資料庫一樣,**是行的容器。 型別中對於欄位的定義稱為對映,比如 name 映 射為字串型別。 我們說文件是無模式的,它們不需要擁有對映中所定義的所有字段,比如新增乙個字段,那麼elasticsearch是怎麼做的呢?elasticsearch會自動的將新字段加入對映,但是這個欄位的不確定它是什麼型別,elasticsearch就開始猜,如果這個值是18,那麼elasticsearch會認為它是整形。 但是elasticsearch也可能猜不對, 所以最安全的方式就是提前定義好所需要的對映,這點跟關係型資料庫殊途同歸了,先定義好欄位,然後再使用,別 整什麼么蛾子。後面在討論更多關於對映的東西。

索引是對映型別的容器,elasticsearch中的索引是乙個非常大的文件集合。索引儲存了對映型別的字段和其他設定。 然後它們被儲存到了各個分片上了。 我們來研究下分片是如何工作的。

乙個集群至少有乙個節點,而乙個節點就是乙個elasricsearch程序,節點可以有多個索引預設的,如果你建立索引,那麼索引將會又個5個分片(primary shard ,又稱主分片 )構成的,每乙個主分片會有乙個副本(replica shard ,又稱複製分片)

請看下圖:

上圖是乙個有3個節點的集群,可以看到主分片和對應的複製分片都不會在同乙個節點內,這樣有利於某個節點掛掉 了,資料也不至於丟失。 實際上,乙個分片是乙個lucene索引,乙個包含倒排索引的檔案目錄,倒排索引的結構使 得elasticsearch在不掃瞄全部文件的情況下,就能告訴你哪些文件包含特定的關鍵字。 不過,等等,倒排索引是什 麼鬼?

elasticsearch使用的是一種稱為倒排索引的結構,採用lucene倒排索作為底層。這種結構適用於快速的全文搜尋, 乙個索引由文件中所有不重複的列表構成,對於每乙個詞,都有乙個包含它的文件列表。 例如,現在有兩個文件, 每個文件包含如下內容:

study every day, good good up to forever # 文件1包含的內容 

to forever, study every day, good good up # 文件2包含的內容

為了建立倒排索引,我們首先要將每個文件拆分成獨立的詞(或稱為詞條或者tokens),然後建立乙個包含所有不重 復的詞條的排序列表,然後列出每個詞條出現在哪個文件:

term

doc_1

doc_2

study√×

tox×every√√

forever√√

day√

√study×√

good√√

every√√

to√×up

√√現在,我們試圖搜尋 to forever,只需要檢視包含每個詞條的文件

term

doc_1

doc_2to√

×forever√√

total21

兩個文件都匹配,但是第乙個文件比第二個匹配程度更高。如果沒有別的條件,現在,這兩個包含關鍵字的文件都將返回。

再來看乙個示例,比如我們通過部落格標籤來搜尋部落格文章。那麼倒排索引列表就是這樣的乙個結構:

elasticsearch的索引和lucene的索引對比

在elasticsearch中, 索引 這個詞被頻繁使用,這就是術語的使用。 在elasticsearch中,索引被分為多個分片,每份 分片是乙個lucene的索引。所以乙個elasticsearch索引是由多個lucene索引組成的。別問為什麼,誰讓elasticsearch使用lucene作為底層呢! 如無特指,說起索引都是指elasticsearch的索引。

see also: 倒排索引 | 倒排索引原理和實現

接下來的一切操作都在kibana中dev tools下的console裡完成。基礎操作

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...