對lucene更清晰的理解

1.lucene

Lucene的目的是爲軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現 全文檢索 的功能,或者是以此爲基礎建立起完整的全文檢索引擎。

2. 全文檢索

3.倒排索引

倒排索引源於實際應用中需要根據屬性的值來查找記錄。這種索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址。由於不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱爲倒排索引(inverted index)。帶有倒排索引的文件我們稱爲倒排索引文件,簡稱倒排文件(inverted file)

4.我來說倒排索引

所謂倒排索引 簡單來說就是用文章中的 某個 關鍵詞 來 索引查找 包含該關鍵詞的 文章;

1.要實現這樣的索引查找 ,需要構建兩種表:

  • 文檔表    

所謂文檔表, 我們可以類比 MySQL中的一張表 ,縱向是字段,橫向是記錄內容;與之對此應:文檔表中的 一個文檔 就是相當於MySQL表中的一條記錄; 文檔表中的Field用來劃分文檔一個文檔的結構,就相當於MySQL表中的字段用來劃分一條記錄的各個部分; 而不同之處在於MySQL中我們給一條記錄的某個字段賦值了,默認在存儲時是會將值保存在這條記錄的這個字段中的; 而文檔表中的一個文檔的某個Field在賦值之後確實可以通過Store.YES / Store.NO來決定該內容是否要保存在文檔表中;這個也是文檔表的存儲策略的體現;

  • 索引表

所謂索引表, 這個是在文檔表的基礎之上建立的多張表,我們沒有什麼可以類比的,這個在MySQL 中是不存在的,那麼索引表的生成規則是什麼呢?  

規則1: 索引表應該建幾張

索引表是多張表:多少張的依據是文檔表有多少個Field ,就是lucene的api會針對文檔表的每個Field建立一張索引表:舉個簡單例子:如果一個文檔表有 id , title ,content 三個Field 那麼,索引表就會有對應的三張 id索引表, title索引表, content索引表,不要嫌麻煩,因爲這樣做會導致後邊查詢時很方便;

規則2:索引表的結構是什麼

索引表的結構是: 我們可以把索引表看成一張key-value表; 我們舉例來說, 比如說 content索引表,在構建content索引表時,lucene的api會將文檔表中Field 列的內容全部進行分詞,生成詞條,每一條詞條就作爲索引表的每一個key, 然後某一個詞條在哪些文檔中出現,出現的位置,出現的次數生成一個類似List 作爲整個詞條對應的value; 指的注意的是, 我們的value記錄了詞條在某個文檔中出現,是用文檔id來標記某個文檔的,這個文檔id 並不是文檔的Field ,而是文檔表自動生成的一個id, 就相當於我們MySQL中的rowid 這個id是文檔表自己生成的唯一識別id,而不是我們給某個文檔定義的Field  id,這一點要特別注意,因此,我們定義的Field id 內容是可以重複的,他與其他Field 比如 title, content ,沒有本質區別;僅僅是作爲文檔的結構劃分的一個標記;

2.倒排索引的實現:

  • 確定是查詢哪張索引表

比如我們要查文檔標題(title)中包含 "java教程" 的文檔,那麼我們就到 title索引表中查詢;

  • 確定是查詢哪個詞條(key)

比如我們要查文檔標題(title)中包含 "java教程" 的文檔,那麼我們就到 title索引表中查詢 詞條(key) 等於 "java教程" value值;

在這裏補充一點,我寫成 等於 其實並不是真正的 等於 因爲我們根據我們實際業務,我們可以選擇多種key的匹配方式,比如

1、phrasequery  (短語查詢) 

        是用來查詢短語的。注意他只針對英文,對中文並沒有什麼用處。

2、WildcardQuery (外卡查詢) 

        使用如下,wildcardQuery是一個通配符查詢方式,你可以用‘?’或者‘*’來進行匹配。

3、RangeQuery  (範圍查詢)

        我們通常不直接用rangequery而是用NumericRangeQuery ,因爲3.5沒找到rangequery。齊作用查詢數值的一個範圍。

4、 FuzzyQuery (模糊查詢)

       本質就是你可以寫錯一個單詞。比如你想找java,用了模糊查詢,使用jave可以找到。

5、BooleanQuery  (邏輯查詢)

       主要作用是將查詢語句進行是否必須的設置   MUST爲必須包含,SHOULD爲可以包含,  MUST_NOT 爲必須不包含。

  • 根據value(與詞條key匹配的文檔的rowid集合list) ,到文檔表中找出對應的文檔;

比如我們要查文檔標題(title)中包含 "java教程" 的文檔,那麼我們就到 title索引表中查詢 詞條(key) 等於 "java教程" value值,這value值就是一文檔rowid的集合,我們根據這個集合去文檔表中,把對應的記錄都檢出來,這就完成了一次簡單的全文搜索;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章