網站首頁 編程語言 正文
簡介
Elasticsearch 是一個分布式可擴展的實時搜索和分析引擎,一個建立在全文搜索引擎 Apache Lucene? 基礎上的搜索引擎.當然 Elasticsearch 并不僅僅是 Lucene 那么簡單,它不僅包括了全文搜索功能,還可以進行以下工作:
- 分布式實時文件存儲,并將每一個字段都編入索引,使其可以被搜索。
- 實時分析的分布式搜索引擎。
- 可以擴展到上百臺服務器,處理PB級別的結構化或非結構化數據。
核心概念
以下為ES和Mysql等的對照關系
Relational DB | Elasticsearch |
---|---|
數據庫(database) | 索引(indices) |
表(tables) | types |
行(rows) | documents |
字段(columns) | fields |
文檔
就是類似關系型數據庫的一行行的記錄
elasticsearch是面向文檔的,那么就意味著索弓和搜索數據的最小單位是文檔。
elasticsearch中,文檔有幾個重要屬性:
- 自我包含, 一篇文檔同時包含字段和對應的值,也就是同時包含key:value !
- 可以是層次型的
- 靈活的結構,文檔不依賴預先定義的模式,我們知道關系型數據庫中,要提前定義字段才能使用,在elasticsearch中,對于字段是非常靈活的,有時候,我們可以忽略該字段,或者動態的添加一個新的字段。
盡管我們可以隨意的新增或者忽略某個字段,但是,每個字段的類型非常重要,比如一一個年齡字段類型,可以是字符串也可以是整形。因為elasticsearch會保存字段和類型之間的映射及其他的設置。這種映射具體到每個映射的每種類型,這也是為什么在elasticsearch中,類型有時候也稱為映射類型。
類型
ES7之后Type被舍棄
類型是文檔的邏輯容器,就像關系型數據庫中的表一樣。
類型中對于字段的定義稱為映射,比如name映射為字符串類型。
我們說文檔是無模式的 ,它們不需要擁有映射中所定義的所有字段。
但是如果要新增一個字段,那么elasticsearch的流程是什么?
elasticsearch會自動的將新字段加入映射,但是這個字段的不確定它是什么類型, elasticsearch就開始猜,如果這個值是18 ,那么elasticsearch會認為它是整形。但是elasticsearch也可能猜不對 ,所以最安全的方式就是提前定義好所需要的映射,這點跟關系型數據庫殊途同歸了,先定義好字段,然后再使用。
索引
可以淺顯的理解為就是數據庫。
索引是映射類型的容器, elasticsearch中的索引是一個非常大的文檔集合。索引存儲了映射類型的字段和其他設置。然后它們被存儲到了各個分片上。
節點
Node為集群中的單臺節點,其可以為master節點亦可為slave節點(節點屬性由集群內部選舉得出)并提供存儲相關數據的功能
分片
在es中,默認一個Es就是一個集群,一個集群又至少有一個節點。而一個節點就是一個es進程,節點可以有多個默認索引,如果你創建新索引,那么索引將會由5個分片( primary shard ,又稱主分片)構成,每一個主分片會有一個副本( replica shard ,又稱復制分片)
分片有兩種類型:primary主片和replica副本,primary用于文檔存儲,Replica shard是Primary 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) ,然后創建一個包含所有不重復的詞條的排序列表,然后列出每個詞條出現在哪個文檔:
現在,我們試圖搜索 to forever,只需要查看包含每個詞條的文檔
兩個文檔都匹配,但是第一個文檔比第二個匹配程度更高。如果沒有別的條件,現在,這兩個包含關鍵字的文檔都將返回。
再來看一個示例,比如我們通過博客標簽來搜索博客文章。那么倒排索引列表就是這樣的一個結構:
博客文章(原始數據) | 博客文章(原始數據) | 索引列表(倒排索引) | 索引列表(倒排索引) |
---|---|---|---|
博客文章ID | 標簽 | 標簽 | 博客文章ID |
1 | python | python | 1,2,3 |
2 | python | linux | 3,4 |
3 | linux,python | ? | ? |
4 | linux |
如果要搜索含有python標簽的文章,那相對于查找所有原始數據而言,查找倒排索引后的數據將會快的多。只需要查看標簽這一欄,然后獲取相關的文章ID即可。完全過濾掉無關的所有數據,提高效率!
elasticsearch的索引和Lucene的索引對比
在elasticsearch中,索引(庫)這個詞被頻繁使用,這就是術語的使用。在elasticsearch中 ,索引被分為多個分片,每份分片是一個Lucene的索引。所以一個elasticsearch索引是由多 個Lucene索引組成的。
原文鏈接:https://blog.csdn.net/qq_21040559/article/details/109463505
相關推薦
- 2022-06-21 C++深入探究二階構造模式的原理與使用_C 語言
- 2022-08-22 PyCharm安裝庫numpy失敗問題的詳細解決方法_python
- 2022-04-17 Unity實現簡單的多人聊天工具_C#教程
- 2022-12-03 React使用ref方法與場景介紹_React
- 2022-12-14 PostgreSQL模式匹配與正則表達式方法總結_PostgreSQL
- 2022-10-05 教你使用RustDesk?搭建一個自己的遠程桌面中繼服務器_服務器其它
- 2023-02-04 python中各種路徑設置的方法詳解_python
- 2022-09-29 C++Vector容器常用函數接口詳解_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支