1. 程式人生 > 程式設計 >探索ElasticSearch-Lucene入門(六)

探索ElasticSearch-Lucene入門(六)

前言

也算是使用了ElasticSearch一段時間了,但是還是沒有仔細看過Lucene相關的內容。今天來系統小結下。

這篇文章主要談論Lucene的基本架構,倒排索引分詞器,如何使用查詢語法查詢Lucene以及LuceneElasticSearch的區別和聯絡。

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。