關系行資料庫和ElasticSearch客觀對比
ElasticSearch是面向文檔,關系行資料庫和ElasticSearch客觀對比!一切都是JSON!
Relational DB | ElasticSearch |
資料庫(database) | 索引(indices) |
表(tables) | types <慢慢會被棄用!> |
行(rows) | documents |
字段(columns) | fields |
elasticsearch(叢集)中可以包含多個索引(資料庫) ,
每個索引中可以包含多個類型(表) ,
每個類型下又包含多個文檔(行) ,
每個文檔中又包含多個字段(列)。
實體設計:
elasticsearch在背景把每個索引劃分成多個分片,每分分片可以在叢集中的不同伺服器間遷移
一個人就是一個叢集! ,即啟動的ElasticSearch服務,預設就是一個叢集,且預設叢集名為elasticsearch;
邏輯設計:
一個索引類型中,包含多個文檔,比如說文檔1,文檔2。
當我們索引一篇文檔時,可以通過這樣的順序找到它:
索引 => 類型 => 文檔ID ,通過這個組合我們就能索引到某個具體的文檔。
注意:ID不必是整數,實際上它是個字元串。
索引(“庫”)
索引是映射類型的容器, elasticsearch中的索引是一個非常大的文檔集合。
索引存儲了映射類型的字段和其他設定。
然後它們被存儲到了各個分片上了。
一個叢集至少有一個節點,而一個節點就是一個elasricsearch程序,
節點可以有多個索引預設的,如果你建立索引,那麼索引将會有5個分片(primary shard ,又稱主分片) 構成的,
每一個主分片會有一個副本(replica shard,又稱複制分片);
類型(“表”)
類型是文檔的邏輯容器,就像關系型資料庫一樣,表格是行的容器。
類型中對于字段的定義稱為映射,比如name映射為字元串類型。我們說文檔是無模式的,它們不需要擁有映射中所定義的所有字段,比如新增一個字段,那麼elasticsearch是怎麼做的呢?
elasticsearch會自動地将新字段加入映射,但是這個字段的不确定它是什麼類型,elasticsearch就開始猜,如果這個值是18,那麼elasticsearch會認為它是整形。
但是elasticsearch也可能猜不對,是以最安全的方式就是提前定義好所需要的映射,這點跟關系型資料庫殊途同歸了,先定義好字段,然後再使用
文檔(”行“)
之前說elasticsearch是面向文檔的,那麼就意味着索引和搜尋資料的最小機關是文檔,
elasticsearch中,文檔有幾個重要屬性:
- 自我包含,一篇文檔同時包含字段和對應的值,也就是同時包含key:value !
- 可以是層次型的,一個文檔中包含自文檔,複雜的邏輯實體就是這麼來的! {就是一個json對象 ! fastjson進行自動轉換 !}
- 靈活的結構,文檔不依賴預先定義的模式,我們知道關系型資料庫中,要提前定義字段才能使用,在elasticsearch中,對于字段是非常靈活的,有時候,我們可以忽略該字段,或者動态的添加一個新的字段。
反向索引(Lucene索引底層)
簡單說就是 按(文章關鍵字,對應的文檔<0個或多個>)形式建立索引,根據關鍵字就可直接查詢對應的文檔(含關鍵字的),無需查詢每一個文檔
反向索引是差別于正排索引的概念:
- 正排索引:是以文檔對象的唯一 ID 作為索引,以文檔内容作為記錄。
- 反向索引:Inverted index,指的是将文檔内容中的單詞作為索引,将包含該詞的文檔 ID 作為記錄。
如果需要在文檔中查詢 蘇州街桔子 ,可以通過分詞後:
蘇州街 查到 1、2,
通過 桔子 查到 2,
然後再進行 取交取并等操作 得到最終結果。