我將會從下面四個方面去介紹 Elasticsearch。
目錄
一、Elasticsearch是什麼?
二、Elasticsearch全文檢索的原理是什麼?
三、Elasticsearch的核心數據類型有哪些?
四、怎麼判斷搜索準確性?
一、Elasticsearch是什麼?
Elasticsearch是一個實時的分佈式搜索分析引擎,它可以使你以前所未有的速度和規模,去探索你的數據。
它被用來做全文檢索,結構化搜索,分析以及這三個功能的組合:
- Wikipedia使用Elasticsearch提供了高亮片段的全文搜索,還有search-as-you-type和did-you-mean的建議。
- 衛報使用Elasticsearch將其社交媒體提供給公衆有關新文章的實時反饋。
- Stack Overflow將定位查詢整合到全文檢索中去,並使用more-like-this接口去查找相關的問題和回答。
- GitHub使用Elasticsearch對1300億行代碼進行查詢。
(這是官方的簡介)
ES的生態圈
ES生態圈主要包含這幾個好基友。
ES的用途
(1)用作搜索系統數據存儲
- 應用程序將數據寫入到mysql或其他數據庫當中
- mysql把數據同步到ES中
- 應用程序查詢數據時,從ES中搜索數據
(2)用作日誌分析
- 日誌通過kafka傳到Logstash進行日誌數據聚合
- Logstash將日誌存儲到ES中
- 通過Grafna或者Kibana對數據進行監控和分析
ES的特點和優勢
- 分佈式實時文件存儲,可將每一個字段存入索引,使其可以被檢索到
- 實時分析的分佈式搜索引擎,分佈式,索引拆分成多個分片,集羣中的數據節點可以承載一個或多個分片,並且協調和處理各種操作,負載再平衡和路由大多數情況下自動完成。
- 可以擴張到上百臺服務器,處理PB級別的結構化和非結構化數據,也可以運行在單臺PC上。
- 支持插件機制,分詞插件、同步插件、Hadoop插件、可視化插件。
幾個重要概念
文檔
- Elasticsearch 是面向文檔的,文檔是所有可搜索數據的最小單位
- Elasticsearch裏面的文檔是以 JSON 的格式保存。
- 每個文檔都有一個唯一的 Doc ID
文檔相當於關係型數據庫的一行記錄
舉例:下圖的JSON格式數據就是一個文檔
索引(index)
索引是文檔的容器,是一類文檔的集合
索引需要定義Mapping和Settings
- Mapping定義文檔字段的類型
- Settings定義不通的字段分佈,比如說你的索引需要多少個分片
索引相當於關係型數據庫的一個表
舉例:下面的結構是一個索引
分詞
分詞是把全文本轉換成一系列單詞的過程。
分詞器是處理分詞的模塊。
分詞器的處理過程可以分爲三個步驟:
- Character Filters 處理原始文本,比如說去除html標籤
- Tokenizer 按照一些規則,將文本切分成一個個單詞
- Token Filters 將切分後的單詞進行加工,例如:單詞轉小寫、過濾停用詞、增加同義詞等
處理中文分詞的第三方插件:analysis-icu、IK、THULAC
安裝 analysis-icu 插件的方式
elasticsearch-plugin install analysis-icu
REST API
ES支持http協議訪問數據,增刪改查都提供了相應的REST API
集羣(Cluster)
Elasticsearch是分佈式架構,一個集羣可以有一個或多個節點。
分佈式架構的好處
- 方便對存儲水平擴容
- 提高系統高可用性,部分節點停止服務,整個集羣的服務不受影響
集羣配置有兩種方式:
(1)配置文件
vim config/elasticsearch.yml
cluster.name: dmall_xxx
(2)命令行指定
在命令行啓動ES時,指定參數 -E cluster.name=xxx 進行設定。
節點(node)
節點是Elasticsearch的一個實例,本質上是一個java進程。
一臺機器可以運行多個Elasticsearch進程,但生產環境中一般建議一臺機器只運行一個es實例。
節點配置有兩種方式:
(1)配置文件
vim config/elasticsearch.yml
node.name: dmall_xxx_node1
(2)命令行指定
在命令行啓動ES時,指定參數 -E node.name=node1 進行設定。
每個節點啓動之後,會分配一個UID,保存在data目錄下。
分片(shard)
主分片(Primary Shard)
分片是一個運行的 Lucene 實例,ES可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分佈到不同的節點上,構成分佈式搜索。這個過程對用戶來說是透明的。
主分片在索引創建時指定,後續不允許修改,除非 Reindex。
使用分片有兩個優點:
- 可以水平擴展。
- 可以併發提高性能。
副本(Replica Shard)
用以解決數據高可用的問題。副本是對主分片的拷貝。
- 副本分片數,可以同臺調整
- 增加副本數,還可以在一定程度上,提高服務的高可用性(讀取的吞吐)
二、Elasticsearch全文檢索的原理是什麼?
這裏先解釋什麼是正排索引,什麼是倒排索引。
正排索引
好比一本書的目錄。
我們通過書本的目錄,找到相關內容的頁碼,再去查詢該頁碼下,我們想要查找的內容。
圖片來源於網絡
倒排索引
主要是爲了解決:你想知道某個關鍵詞,在書中的哪一頁出現過,這類的問題。
倒排索引需要把文本拆分成一個一個單詞,並且標記這個單詞在文本中的位置,當我們想查找與某個關鍵詞相關的文本內容時,我們通過倒排索引查找,就可以很輕易找到我們想要查找的內容。
圖片來源於網絡
全文搜索引擎也是通過倒排索引去實現的。
例如:通過百度搜索“倒排索引”,我們的關鍵詞是“倒排索引”。
百度搜索引擎就可以將與“倒排索引”相關的網頁內容進行聚合,並且對查詢到的結果集合中的每一個網頁進行相關性打分,分值高的會排在前面。
三、Elasticsearch的核心數據類型有哪些?
四、怎麼判斷搜索準確性?
下圖的圖示中,
綠色的圓圈,表示應該被返回的結果
橙色的三角形,表示不應該被返回的結果
True Positive(TP):應該返回的結果,被返回
False Positive(FP):不應該返回的結果,被返回
True Negatives(TN):應該返回的結果,不被返回
False Negatives(FN):不應該返回的結果,不被返回
關於作者
github:https://github.com/GitDzreal93/dev-tester
微信公衆號:測試開發guide