探索ElasticSearch-Lucene入門(六)
前言
也算是使用了ElasticSearch
一段時間了,但是還是沒有仔細看過Lucene
相關的內容。今天來系統小結下。
這篇文章主要談論Lucene
的基本架構,倒排索引
,分詞器
,如何使用查詢語法查詢Lucene
以及Lucene
和ElasticSearch
的區別和聯絡。
Lucene
基本架構
- 檔案:索引和搜尋的主要的資料載體,包含多個欄位。
- 欄位:多個欄位組成一個檔案。包含具體的資訊。
- 詞項:由
term
翻譯而來。可以簡單理解為具體的資訊中拆分出來的一個個單詞。 - 詞條:由
token
翻譯而來。詞項在文字中的一次出現。不僅包含詞項的內容,而且包含開始的位置,結束的位置等資訊。 - 段:由
Segment
term和token的區別是什麼? 舉個例子,有下面一段文字。My brother love ElasticSearch.I love ElasticSearch,too. token為My,brother,love,ElasticSearch,I,too term為My,too
倒排索引
簡單來說,倒排索引最主要的一個特點是面向term
建立索引的,而不是面向檔案
建立索引的。
舉個例子,假如有下面這幾個檔案。
doc1:I love ElasticSearch
doc2:I love Java
doc3:I hate sleeping
複製程式碼
如果使用傳統面向檔案的方式建立索引,那麼當使用love
進行搜尋的時候,需要先遍歷doc1中所有的欄位,再遍歷doc2中所有的欄位,依次遍歷,直到最後一個doc,才能夠確定存在love
這個單詞的檔案是doc1,doc2
。
如果使用的是倒排索引呢?
那麼會組成以下的倒排索引。
Term | Doc |
---|---|
I | doc1,doc2,doc3 |
love | doc1,doc2 |
elasticsearch | doc1 |
java | doc2 |
sleeping | doc3 |
那麼,當使用love
來搜尋的時候,最多隻需要遍歷一遍就能夠查詢到結果。直接返回doc1,doc2
。優勢在於只要匹配到了term
分詞器
一段文字在Lucene
中被轉化為一個一個可用於搜尋的詞項的過程叫做分析。有時候也會叫做分詞。在Lucene
中是使用分詞器來進行分析(分詞)的行為的。
舉個例子
I love ElasticSearch -> [I,elasticsearch]
複製程式碼
這裡就是原來的文字被分詞器轉換為多個詞項。
文字分析由分析器執行,而分析器又由字元過濾器,分詞器和字元對映器組成。
那麼這三個組成又分別有什麼作用呢?
舉個例子。存在下面這樣文字。
I love! ElasticSearch.
複製程式碼
經過了字元過濾器之後
I love! ElasticSearch. -> I lvoe ElasticSearch
複製程式碼
字元過濾器是去掉在原本文字中存在的一些不合適
的字元,比如!
,.
等。過濾器將原本存在多種不合適
的字元流轉化為合適
的字元流。
接著,會經過分詞器。
I love ElasticSearch -> [I,ElasticSearch]
複製程式碼
分詞器會原來的字元流轉化為多個詞項的陣列。最終可以通過這些詞項搜尋。
[I,ElasticSearch] -> [I,elasticsearch]
複製程式碼
最後,字元對映器會將最原始的詞項統一格式,比如都轉化為小寫的詞項。這個被轉化後的詞項才會被Lucene
存放。
當然,這是預設的標準分析器採用的規則。不同的分析器可以使用不同的字元過濾器,分詞器和字元對映器來完成分析的工作。
查詢語法
由查詢內容和操作符組合而成。
Lucene與ElasticSearch的聯絡
首先,ElasticSearch
正是基於Lucene
開發的。相對於Lucene
擁有輕量級,獨立性的特點來說。ElasticSearch
具有的特點就是分散式,可擴充套件,高可用的特點。
關於寫作
以後這裡每天都會寫一篇文章,題材不限,內容不限,字數不限。儘量把自己每天的思考都放入其中。
如果這篇文章給你帶來了一些幫助,可以動動手指點個贊,順便關注一波就更好了。
如果上面都沒有,那麼寫下讀完之後最想說的話?有效的反饋和你的鼓勵是對我最大的幫助。
另外打算把部落格給重新撿起來了。歡迎大家來訪問吃西瓜。
我是shane。今天是2019年9月6日。百天寫作計劃的第四十四天,44/100。