Lucene是一個基于java的全文檢索庫,它高效、開源。為什么叫它全文檢索庫呢?這得從人們生活中的數(shù)據(jù)結構來說起。
人們在使用各種軟件服務的時候會產(chǎn)生各種的數(shù)據(jù),這些數(shù)據(jù)會被相關軟件服務提供商按照不同的規(guī)則存儲起來,當人們需要的時候再取出來。由于不同的軟件服務提供商所使用的技術不同,這些數(shù)據(jù)被以各種不同的方式存儲在不同的地方,即便是同一個軟件服務提供商,它的數(shù)據(jù)可能也被存儲在不同的服務器甚至根據(jù)不同的業(yè)務存儲在不同的數(shù)據(jù)庫中。這樣一來,一個用戶的相關數(shù)據(jù)可能一部分存儲在關系型數(shù)據(jù)庫A庫、B庫中,另一部分被存儲在非關系型數(shù)據(jù)庫的數(shù)據(jù)庫中,用戶的這些數(shù)據(jù)被分散在各個不同的地方,導致這些數(shù)據(jù)呈現(xiàn)出非結構化的狀態(tài)。當用戶需要把這些不同的數(shù)據(jù)按一定規(guī)則排列展示出來的時候,由于數(shù)據(jù)存儲地方的不同,如果按照傳統(tǒng)的技術方案來實現(xiàn)的話會使得系統(tǒng)非常復雜。而全文檢索則把這些分部在不同地方的數(shù)據(jù)按照一定的規(guī)則抽取出來,組合成一個結構化的數(shù)據(jù),這就可以非常方便地使用一些算法來快速地定位找到相關數(shù)據(jù)。而從這些散亂分部的數(shù)據(jù)中提取并重新組織出的信息,被稱之為索引。
Lucene的全文檢索過程
全文檢索大體分兩個過程,索引創(chuàng)建和搜索索引。
索引創(chuàng)建:把所有的分部在不同地方的信息提取并重新組織起來,創(chuàng)建索引;
搜索索引:將用戶的查詢請求按一定規(guī)則轉換為特定的查詢條件,搜索索引中的結構化數(shù)據(jù),然后返回結果;
全文檢索存在三個重要問題:
索引里究竟存在些什么?
如何創(chuàng)建索引?
如何對索引進行搜索?
后面我們會對這三個問題進行逐一研究與討論。
第一:索引里究竟存些什么?
首先,由于數(shù)據(jù)的分散式存儲,導致我們不能直接去一次性查詢所有的數(shù)據(jù);即便所有的數(shù)據(jù)都存放在一起,我們可以在一個地方去查詢數(shù)據(jù),也會由于所有用戶的數(shù)據(jù)都放在一起,導致查詢的數(shù)據(jù)過于龐大而搜索速度非常緩慢。
這些非結構化的數(shù)據(jù)所存儲的信息是每個文件包含哪些字符串,也即已知文件,欲求字符換相關容易,就是從文件到字符串的映射。而我們想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,即從字符串到文件的映射,則會大大提高搜索速度。
由于從字符串到文件的映射是從文件到字符串映射的反向過程,于是保存這種信息的索引稱為反向索引。
反向索引中存儲的信息如下:
假設我的文檔集合里面有100篇文檔,為了方便表示,我們將其表示為1-100,其結構如下:
反向索引存儲結構
左邊的一系列字符串被稱為詞典。
每個字符串都指向包含此字符串的文檔鏈表,此文檔鏈表稱為倒排表。
當索引建立之后,我們就可以非??焖俚厮阉鞯较胍玫降奈臋n。
有人說,建立索引,然后再查詢,兩者的速度不一定比直接進行順序掃描快。的確,加上索引創(chuàng)建的過程,全文檢索不一定比直接的全文順序掃描快多少,尤其在數(shù)據(jù)量少,并且存儲在一個地方的時候,并且為一個很大的數(shù)據(jù)創(chuàng)建索引也是一個很慢的過程。然而兩者還是有一定的區(qū)別的。順序掃描是每次查詢都要從頭查找,而創(chuàng)建索引的過程只有一次,以后就可以一勞永逸了,每次搜索,只要查詢索引即可,而不用每次都去創(chuàng)建索引。
下一篇,我們將討論如何去創(chuàng)建索引。
新聞熱點
疑難解答