Lucene隨筆-全文檢索基本原理

全文檢索

目前,數據從類型上可以分爲三類:

  • 結構化數據
  • 非結構化數據
  • 半結構化數據

針對非結構化數據。最簡單的全文檢索算法就是順序掃描法,很明顯當文檔量上升到一定數量時,代價極大。另一種即全文檢索法,先對文檔建立索引,然後根據索引進行查詢。

倒排索引(inverted-index)

倒排表的結構很簡單,本質上就是以詞查文,簡單的理解爲一個HashMap機構, 其key爲詞term也就是文檔中的詞彙,而value則是一個list結構記錄了哪些文檔包含了這個詞。當query一個關鍵詞“love”時候,就可以簡單的獲取所有包含該詞彙的文檔,進行相關性排序,獲取結構。

詞term 文檔列表
love 1,2,3,4,45,5,
anger 2,5,11,7

當然,一個查詢可能包含的關鍵詞不只是一個,比如說“i love China”,這時候簡單的將query分成三個"i", “love”, “China”,此時我們就需要額外的一些操作,簡單的我們稱這種叫做聯合查詢

  • 利用跳錶(Skip list)的數據結構快速做“與”運算。
  • 利用上面提到的bitset按位“與”。

1.跳錶(skip list)
每一個index的查詢結果都是有序的,以下假設是三個index的查詢結果,可以看做是三個鏈表。將鏈表按照長度從小到大排列。我們對與長度最小的鏈表開始遍歷元素,對於一個候選元素,若其值等於下一個鏈表的當前值,則遍歷下一個鏈表;若小於下一個鏈表的當前元素,則當前鏈表遍歷下一個節點;直到把最短鏈表遍歷完成。

在這裏插入圖片描述
2.bitset實現
對於每一個index的查詢結果,將其轉化成一個bitmap數組,然後對所有index的位圖數組進行與操作,最後結果便是查詢結果。

索引過程

  • 輸入原文檔。
  • 將原文檔傳給分詞器tokenizer(分詞、去除標點、去停留詞)
  • 將詞元token傳給語言處理組建linguistic Processor(縮減爲詞根,轉換爲詞根以及大小寫轉換)。
  • 將詞term傳給索引組件indexer,其首先根據輸入的term建立一個詞典,然後對字典進行排序,最後合併相同的詞組成倒排表posting list。

在lucene的倒排表中還包含了兩個概念:
document frequency:文檔頻次,多少個文檔包含此詞。
frequency:詞頻率,這個文檔包含某個詞多少個。

檢索過程

檢索過程相對與索引過程,同樣需要對query進行分詞等處理,最後最重要的是對文檔根據相關性進行排序。
a) 用戶輸入查詢語句。
b) 對查詢語句經過語法分析和語言分析得到一系列詞(Term)。
c) 通過語法分析得到一個查詢樹。
d) 通過索引存儲將索引讀入到內存。
e) 利用查詢樹搜索索引,從而得到每個詞(Term)的文檔鏈表,對文檔鏈表進行交,差,並得
到結果文檔。
f) 將搜索到的結果文檔對查詢的相關性進行排序。
g) 返回查詢結果給用戶。

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