也算是使用了ElasticSearch
一段時間了,可是仍是沒有仔細看過Lucene
相關的內容。今天來系統小結下。java
這篇文章主要談論Lucene
的基本架構,倒排索引
,分詞器
,如何使用查詢語法查詢Lucene
以及Lucene
和ElasticSearch
的區別和聯繫。數組
term
翻譯而來。能夠簡單理解爲具體的信息中拆分出來的一個個單詞。token
翻譯而來。詞項在文本中的一次出現。不只包含詞項的內容,並且包含開始的位置,結束的位置等信息。Segment
翻譯而來。每一個段只會被建立一次,段一但被建立了以後就不會被修改。因此,會存在段合併的過程,減小段的數量,並且搜索的性能也會提高。段中數據的刪除只會在段合併的過程當中進行。term和token的區別是什麼? 舉個例子,有下面一段文本。My brother love ElasticSearch.I love ElasticSearch,too. token爲My,brother,love,ElasticSearch,I,love,ElasticSearch,too term爲My,brother,love,ElasticSearch,I,toobash
簡單來講,倒排索引最主要的一個特色是面向term
創建索引的,而不是面向文檔
創建索引的。 舉個例子,假若有下面這幾個文檔。架構
doc1:I love ElasticSearch
doc2:I love Java
doc3:I hate sleeping
複製代碼
若是使用傳統面向文檔的方式創建索引,那麼當使用love
進行搜索的時候,須要先遍歷doc1中全部的字段,再遍歷doc2中全部的字段,依次遍歷,直到最後一個doc,纔可以肯定存在love
這個單詞的文檔是doc1,doc2
。elasticsearch
若是使用的是倒排索引呢?分佈式
那麼會組成如下的倒排索引。性能
Term | Doc |
---|---|
I | doc1,doc2,doc3 |
love | doc1,doc2 |
elasticsearch | doc1 |
java | doc2 |
sleeping | doc3 |
那麼,當使用love
來搜索的時候,最多隻須要遍歷一遍就可以查詢到結果。直接返回doc1,doc2
。優點在於只要匹配到了term
,就能夠直接返回。無需像傳統索引同樣遍歷全部的文檔。spa
一段文本在Lucene
中被轉化爲一個一個可用於搜索的詞項的過程叫作分析。有時候也會叫作分詞。在Lucene
中是使用分詞器來進行分析(分詞)的行爲的。翻譯
舉個例子code
I love ElasticSearch -> [I,love,elasticsearch]
複製代碼
這裏就是原來的文本被分詞器轉換爲多個詞項。
文本分析由分析器執行,而分析器又由字符過濾器,分詞器和字符映射器組成。
那麼這三個組成又分別有什麼做用呢?
舉個例子。存在下面這樣文本。
I love! ElasticSearch.
複製代碼
通過了字符過濾器以後
I love! ElasticSearch. -> I lvoe ElasticSearch
複製代碼
字符過濾器是去掉在本來文本中存在的一些不合適
的字符,好比!
,.
等。過濾器將本來存在多種不合適
的字符流轉化爲合適
的字符流。
接着,會通過分詞器。
I love ElasticSearch -> [I,love,ElasticSearch]
複製代碼
分詞器會原來的字符流轉化爲多個詞項的數組。最終能夠經過這些詞項搜索。
[I,love,ElasticSearch] -> [I,love,elasticsearch]
複製代碼
最後,字符映射器會將最原始的詞項統一格式,好比都轉化爲小寫的詞項。這個被轉化後的詞項纔會被Lucene
存放。
固然,這是默認的標準分析器採用的規則。不一樣的分析器可使用不一樣的字符過濾器,分詞器和字符映射器來完成分析的工做。
由查詢內容和操做符組合而成。
首先,ElasticSearch
正是基於Lucene
開發的。相對於Lucene
擁有輕量級,獨立性的特色來講。ElasticSearch
具備的特色就是分佈式,可擴展,高可用的特色。
之後這裏天天都會寫一篇文章,題材不限,內容不限,字數不限。儘可能把本身天天的思考都放入其中。
若是這篇文章給你帶來了一些幫助,能夠動動手指點個贊,順便關注一波就更好了。
若是上面都沒有,那麼寫下讀完以後最想說的話?有效的反饋和你的鼓勵是對我最大的幫助。
另外打算把博客給從新撿起來了。歡迎你們來訪問吃西瓜。
我是shane。今天是2019年9月6日。百天寫做計劃的第四十四天,44/100。