Elasticsearch系列開坑啦,入門老是愉快的,學一學再放棄啊。node
Apache Lucene簡介
Lucene基本概念
Apache Lucene是ElasticSearch使用的全文檢索庫。瞭解Lucene以前,須要先了解一些概念:apache
- 文檔:索引和搜索到主要數據載體,它包含一個或多個字段,存放將要寫入索引或從索引搜索出來的數據
- 字段:文檔的一個片斷,是一個K-V結構
- 詞項:搜索時的一個單位,表明文本中的某個詞
- 詞條:詞項在字段中的一次出現,包括詞項的文本、開始和結束的位移以及類型
- 倒排索引:倒排索引能夠快速獲取包含某個單詞的文檔。倒排索引由兩部分組成:單詞詞典和倒排文件
- 單詞詞典:單詞詞典是由文檔集合中出現過的全部單詞構成的字符串集合,單詞詞典內每條索引項記載單詞自己的一些信息以及指向「倒排列表」的指針
- 倒排列表:倒排列表記載了出現過某個單詞的全部文檔的列表以及該單詞在文檔中的位置,每條記錄稱爲一個倒排項(Posting)
- 倒排文件:全部單詞的倒排列表每每順序存在磁盤的某個文件,這個文件稱爲倒排文件
其中最重要的是倒排索引,爲了方便理解,咱們看一個簡單的例子。數據結構
假設這裏有三句話:app
T[0] = "it is what it is"elasticsearch
T[1] = "what is it"性能
T[2] = "it is a banana"指針
倒排索引一般有兩種表現形式:cdn
- inverted file index{詞項,詞項所在文檔ID}
"a" : {2}blog
"banana" : {2}索引
"is" : {0, 1, 2}
"it" : {0, 1, 2}
"what" : {0,1}
- full inverted index{詞項,(詞項所在文檔ID,在具體文檔中的位置)}
"a" : {(2, 2)}
"banana" : {(2, 3)}
"is" : {(0, 1), (0, 4), (1, 1), (2, 1)}
"it" : {(0, 0), (0, 3), (1, 2), (2, 0)}
"what" : {(0, 2), (1, 0)}
Lucene查詢語言
在瞭解了Lucene的一些基本概念以後,還須要瞭解Lucene的查詢語言。一個查詢一般被分割爲詞項和操做符,詞項能夠是單個詞或短語。操做符包括:
- AND:文檔同時包含AND兩邊的詞項時才返回
- OR:文檔包含OR兩邊的詞項中任意一個時就返回
- NOT:不包含NOT操做符後面的詞項
- +:只有包含+操做符後面詞項的文檔纔會返回。例如,查詢+lucene apache表示必須包含lucene,apache可包含可不包含
- -:匹配的文檔不能出現-操做符後的詞項
- 冒號:查詢title:elasticsearch表示要查詢全部在title字段中包含詞項elastisearch的文檔
- 通配符(?/*):?匹配任意一個字符,*匹配任意多個字符(出於性能考慮,通配符不能做爲詞項的第一個字符)
- ~:用於Lucene中的模糊查詢,~後面跟的整數值肯定了近似詞項與原始詞項的最大編輯距離。例如查詢boy~2,那麼boy和boys這兩個詞項都能匹配,用於短語時,則表示詞項之間能夠接受的最大距離
- ^:用於對詞項進行加權
- 花括號:表示範圍查詢
對於一些特殊字符的查詢,咱們一般使用反斜槓進行轉義。
Elasticsearch基本概念
瞭解了Lucene的基本概念之後,咱們回到正題,再來看一下Elasticsearch的一些基本概念,可能和Lucene有一些重複,不過仍是有一些Elasticsearch特有的屬性。
- **索引(index):**數據存儲在索引中,能夠向索引寫入文檔或者從索引讀取文檔,Elasticsearch的索引可能由一個或多個Lucene索引構成。
- **文檔(document):**文檔由字段構成,每一個字段有它的字段名以及一個或多個字段值
- **映射(mapping):**用於存儲元信息,這些元信息決定了如何將輸入文本分割爲詞條,哪些詞條應該被過濾掉等
- **類型(type):**每一個文檔都有與之對應的類型,同一類型下的文檔數據結構一般保持一致,不一樣文檔能夠有不一樣的映射。可是在Elasticsearch7之後已經刪除了這個概念
- **節點(node):**集羣中每一個ES實例都稱做一個節點
- **集羣(cluster):**在生產環境中,咱們的數據量和查詢壓力可能超過了單機負載,所以須要多個節點協同處理
- **分片(shard):**ES會將數據散落到多個Lucene索引上。這些Lucene索引稱爲分片。ES會自動進行分片處理
- **副本(replica):**ES會爲每一個分片建立冗餘的副本,一方面分攤請求壓力,另外一方面是爲了保證數據不會丟失。ES支持在任意時間點添加或移除副本
Elasticsearch的啓動過程
當Elasticsearch啓動時,它使用廣播技術來發現同一集羣內的其餘節點,集羣中會有一個節點被選爲master節點。master節點負責管理集羣狀態,並在集羣中節點數量變化時作出反應。但從用戶角度來看,master節點與其餘節點沒有什麼區別,命令能夠發送的任意節點執行。
master節點會檢查全部分片,決定哪些分片爲主分片。主分片肯定之後,集羣狀態爲黃色,此時能夠接收查詢。而後master節點會決定是否要對各個分片建立副本,副本也沒有問題之後,集羣狀態變爲綠色。
Elasticsearch的集羣狀態分爲3種:
- 綠色:一切無缺
- 黃色:全部數據均可用,但有些分片沒有分配副本
- 紅色:有些數據不可用
關於Elasticsearch的啓動過程,後面還會有更加深刻的討論。
敬請期待。