Lucene是一個基于java的全文檢索庫,它高效、開源。為什么叫它全文檢索庫呢?這得從人們生活中的數據結構來說起。
人們在使用各種軟件服務的時候會產生各種的數據,這些數據會被相關軟件服務提供商按照不同的規則存儲起來,當人們需要的時候再取出來。由于不同的軟件服務提供商所使用的技術不同,這些數據被以各種不同的方式存儲在不同的地方,即便是同一個軟件服務提供商,它的數據可能也被存儲在不同的服務器甚至根據不同的業務存儲在不同的數據庫中。這樣一來,一個用戶的相關數據可能一部分存儲在關系型數據庫A庫、B庫中,另一部分被存儲在非關系型數據庫的數據庫中,用戶的這些數據被分散在各個不同的地方,導致這些數據呈現出非結構化的狀態。當用戶需要把這些不同的數據按一定規則排列展示出來的時候,由于數據存儲地方的不同,如果按照傳統的技術方案來實現的話會使得系統非常復雜。而全文檢索則把這些分部在不同地方的數據按照一定的規則抽取出來,組合成一個結構化的數據,這就可以非常方便地使用一些算法來快速地定位找到相關數據。而從這些散亂分部的數據中提取并重新組織出的信息,被稱之為索引。

Lucene的全文檢索過程
全文檢索大體分兩個過程,索引創建和搜索索引。
索引創建:把所有的分部在不同地方的信息提取并重新組織起來,創建索引;
搜索索引:將用戶的查詢請求按一定規則轉換為特定的查詢條件,搜索索引中的結構化數據,然后返回結果;
全文檢索存在三個重要問題:
索引里究竟存在些什么?
如何創建索引?
如何對索引進行搜索?
后面我們會對這三個問題進行逐一研究與討論。
第一:索引里究竟存些什么?
首先,由于數據的分散式存儲,導致我們不能直接去一次性查詢所有的數據;即便所有的數據都存放在一起,我們可以在一個地方去查詢數據,也會由于所有用戶的數據都放在一起,導致查詢的數據過于龐大而搜索速度非常緩慢。
這些非結構化的數據所存儲的信息是每個文件包含哪些字符串,也即已知文件,欲求字符換相關容易,就是從文件到字符串的映射。而我們想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,即從字符串到文件的映射,則會大大提高搜索速度。
由于從字符串到文件的映射是從文件到字符串映射的反向過程,于是保存這種信息的索引稱為反向索引。
反向索引中存儲的信息如下:
假設我的文檔集合里面有100篇文檔,為了方便表示,我們將其表示為1-100,其結構如下:

反向索引存儲結構
左邊的一系列字符串被稱為詞典。
每個字符串都指向包含此字符串的文檔鏈表,此文檔鏈表稱為倒排表。
當索引建立之后,我們就可以非常快速地搜索到想要得到的文檔。
有人說,建立索引,然后再查詢,兩者的速度不一定比直接進行順序掃描快。的確,加上索引創建的過程,全文檢索不一定比直接的全文順序掃描快多少,尤其在數據量少,并且存儲在一個地方的時候,并且為一個很大的數據創建索引也是一個很慢的過程。然而兩者還是有一定的區別的。順序掃描是每次查詢都要從頭查找,而創建索引的過程只有一次,以后就可以一勞永逸了,每次搜索,只要查詢索引即可,而不用每次都去創建索引。
下一篇,我們將討論如何去創建索引。
新聞熱點
疑難解答