基本概念和術語
什么是 ES
ES 是一個基于全文搜索引擎庫 Apache Lucene 做出來的開源分布式搜索引擎前痘,使用 JAVA 編寫,隱藏了 Luncene 的復雜性坎拐,提供了簡單 RESTFUL API 接口訪問烦磁。什么是文檔
ES 是面向文檔的,文檔代表的就是數據哼勇,也可以理解為 MySQL 中的記錄都伪,但是 ES 不是使用行列存儲數據。ES 的文檔采用 JSON 對象的形式存儲积担,當集群中有多個 ES 節(jié)點時陨晶,存儲的文檔會分布在整個集群中,并且可以從任何節(jié)點立即訪問先誉。什么是索引
索引可以被認為是文檔的優(yōu)化集合,每個文檔都是字段的集合的烁,字段是包含數據的鍵值對。默認情況下渴庆,ES 索引每個字段中的所有數據雅镊,并且每個索引字段都有一個專用的優(yōu)化數據結構。搜索數據
ES 支持通過 RESETFUL API 查詢結構化數據刃滓、全文查詢,和兩者結合的復雜查詢注盈。分析數據
ES 可以聚合查找復雜數據叙赚,并同時進行過濾結果和數據分析老客,因為聚合利用了用于搜索的相同數據結構震叮,所以它們也非畴逝椋快。節(jié)點
指已經部署了 ES 的服務器苇瓣,節(jié)點可以指定身份尉间,用以標識在集群中的角色,分為:
1击罪、node.master :主節(jié)點哲嘲,可以管理整個集群的設置及變化:創(chuàng)建、更新媳禁、刪除索引眠副,添加節(jié)點,為節(jié)點配置分片
2竣稽、node.data :數據
3囱怕、node.ingest :數據接入
4、node.ml :機器學習集群
由一個或多個節(jié)點組成毫别,可以通過集群名稱進行標識娃弓,在 elasticsearch.yml 配置文件中的 cluster.name 設置分片
1、ES 用于存儲文檔的容器岛宦,可以進行復制以提供數據冗余副本台丛,防止硬件故障造成數據不能訪問的情況。
2砾肺、分片可以分布在集群中不同的節(jié)點上挽霉,由 ES 自動管理分片的排序
3、分片可以很方便的支持水平擴容
4债沮、分片可以進行分布式炼吴、并行的操作,從而提高性能和吞吐量分片類型
1疫衩、主分片:每個文檔都存儲在主分片上硅蹦,索引文檔時,首先在主分片上編制索引,然后在此分片的所有副分片上編制索引童芹,索引可以包含一個或多個主分片涮瞻,一旦創(chuàng)建索引,主分片數量就無法修改了假褪。
2署咽、副分片:每個主分片可以具有零個或多個副本,可以實現故障轉移生音,當主分片無法工作時將副分片提升為主分片位他,也可以提高性能悄蕾。倒排索引
ES 中的索引結構,它由文檔中所有不重復詞的列表構成,適合快速的全文搜索执桌,這也是比關系型數據庫更適合做全文索引的重要原因斥滤。
假設有兩個文檔烂琴,每個文檔的正文字段包含如下內容:
1弧械、The quick brown fox jumped over the lazy dog
2、Quick brown foxes leap over lazy dogs in summer
倒排索引創(chuàng)建時譬挚,會將每個文檔的正文字段拆分成單獨的詞(稱為詞條或Tokens),創(chuàng)建一個包含所有不重復詞條的排序列表减宣,然后列出每個詞條出現在哪個文檔。
詞條 | 文檔1 | 文檔2 |
---|---|---|
Quick | ? | |
The | ? | |
brown | ? | |
dog | ? | |
dogs | ? | |
fox | ? | |
foxes | ? | |
in | ? | |
jumped | ? | |
lazy | ? | |
leap | ? | |
over | ? | |
quick | ? | |
summer | ? | |
the | ? |
默認情況下,ES 文檔每個字段都會被索引屉凯,如果某些字段不需要支持查詢,可以在映射中配置 "index": false悠砚,減少存儲空間占用,并且提升寫入速度绑咱。
-
文檔值
在 ES 中枢泰,文檔值(Doc Values)是一種列式存儲結構,在索引時創(chuàng)建窿克,文檔值默認對除 text 和 annotated_text 類型以外的所有字段啟用。文檔值常被應用到以下場景:
1年叮、對一個字段進行排序
2、對一個字段進行聚合
3一姿、地址位置過濾
4跃惫、腳本計算
5、使用 docvalue_fields 返回搜索結果部分字段值
如果確定數據集中的某些字段不會應用以上場景衬横,也可以選擇禁用文檔值终蒂,這樣不僅可以節(jié)省磁盤空間,也會提升索引的速度拇泣,通過 mapping 設置 doc_values:false即可矮锈。