lucene學習筆記
可以搜尋文字檔案,理論上可以搜尋任何型別的資料。只要先把資料轉化為文字,就可以對資料進行索引和搜尋。
使用了反向索引的機制,維護乙個詞/短語的表,對於每個詞和短語都有乙個鍊錶描述有哪些文件包含這個詞和短語。這樣使用者輸入查詢條件的時候,搜尋引擎先對輸入的條件分詞,分成詞和短語,然後到建立好的索引上面查詢,最終返回索引相關的文件。
1、首先對文件進行分詞。
2、然後將分詞的結果進行索引的建立。
結構化資料:資料庫資料,元資料
半結構化資料:xml、html
非結構化資料:全文資料,word文件,email
全文檢索:新建立索引,在進行搜尋。
建立索引
1、準備文件
2、將文件傳給分詞元件tokenizer
a) 將文件分成乙個個的單詞
b) 去除標點
c) 利用停詞集合,去除停詞(最普通的詞,沒有任何意義,英文中的the,a,this等等)
d) 得到詞元token
3、將詞元token傳給語言處理元件linguistic processor
a) 變為小寫
b) 將單詞縮減為詞根形式,如cars到car,drove到drive,前者是縮減,後者是轉變。前者給予某種演算法,例如去除s,去除ing新增e等等,後者基於字典做轉變就可以了。這兩種方法不是互斥的,有交集,有的詞彙用兩種方法都可以縮減。
c) 語音處理的詞稱為詞term
d) 只有這樣處理,搜尋drove和drive才能都命中。
4、將得到的詞term傳給索引元件idnexer去建立文件倒排列表
a) 利用得到的詞term建立乙個字典
b) 例如
term document id
student 1
allow 1
go 1
my 2
friend 2
allow 2
c) 對字典按照字母順序排序
term document id
allow 1
allow 2
friend 2
go 1
my 2
student 1
d) 合併相同的詞trem,形成文件倒排列表posting list
e) document frequency文件頻次,表示有多少個文件包含當前詞。
f) frequency詞頻次,表示乙個文件中有多少個當前詞。
搜尋1、使用者輸入查詢語句。例如使用者輸入:lucene and learned not hadoop,表明使用者想要找包含lucene和learned而不包含hadoop的文件。
2、對查詢語句進行語法分析,詞法分析,幾語言處理
a) 識別單詞和關鍵字,lucene和learned是單詞,and和not是關鍵字
b) 形成語法樹
c) 語言處理,同建立索引過程中的語言處理相同,如learned變成learn,形成經過語言處理的語法樹
3、搜尋索引
a) 在反向索引表中找到lucene、learn和hadoop的文件鍊錶
b) 其次對lucene和learn的文件鍊錶進行合併
c) 在合併的鍊錶中去除包含hadoop的文件鍊錶
d) 剩下的就是我們要找的文件鍊錶
4、根據得到的文件和查詢語句的相關性,對結果進行排序
a) 如何判斷文件的之間的關係
b) 首先乙個文件有很多詞,
c) 對於文件之間的關係,不同的term的重要性不同。要判斷文件的關係,首先要找出那些term對於文件是重要的。找出詞term對於文件的重要性的過程稱為計算詞的權重term weight的過程。權重term weight的引數有兩個,第乙個是詞term,第二個是文件document
d) 影響乙個詞term在文件中的重要性有兩個因素:
e) term frequency(tf):乙個詞在文件**現的次數,越多說明越重要。
f) document frequency(df):有多少文件包含乙個詞term,越多說明越不重要。
lucene學習筆記 1
indexing主要使用的類 indexwriter 較核心的類,index檔案由它建立 directory 乙個抽象的標示index檔案位址的類,有兩個實現 fsdirectory和ramdirectory,前者是基於檔案系統,後者使用記憶體 analyzer 檔案的分析器 聽起來彆扭,還是叫an...
Lucene 學習筆記 1
今天開始研究lucene,有關lucene的簡單介紹我就不做介紹了,直接google一下就了解了,我根據的是 lucene in action 這本書來學習的。學習還在進行,把學習過程中的一些經驗和體會寫出來供和我一樣的新手參考。1 這本書對應的lucene版本。我一開始用最新的lucene 2.4...
lucene學習筆記 1
doug cutting 於2000年開始的專案 2001年9月後加入apache,lucene是doug cutting的middle name 目前lucene已經是apache的top level的專案,已經不在jakarta下面,同時也有了python,perl,c net,ruby 進行中...