Lucene是一個基于Java的全文檢索庫,它高效幸乒、開源轩端。為什么叫它全文檢索庫呢?這得從人們生活中的數(shù)據(jù)結(jié)構(gòu)來說起逝变。
人們在使用各種軟件服務(wù)的時候會產(chǎn)生各種的數(shù)據(jù)基茵,這些數(shù)據(jù)會被相關(guān)軟件服務(wù)提供商按照不同的規(guī)則存儲起來,當(dāng)人們需要的時候再取出來壳影。由于不同的軟件服務(wù)提供商所使用的技術(shù)不同拱层,這些數(shù)據(jù)被以各種不同的方式存儲在不同的地方,即便是同一個軟件服務(wù)提供商宴咧,它的數(shù)據(jù)可能也被存儲在不同的服務(wù)器甚至根據(jù)不同的業(yè)務(wù)存儲在不同的數(shù)據(jù)庫中根灯。這樣一來,一個用戶的相關(guān)數(shù)據(jù)可能一部分存儲在關(guān)系型數(shù)據(jù)庫A庫掺栅、B庫中烙肺,另一部分被存儲在非關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)庫中,用戶的這些數(shù)據(jù)被分散在各個不同的地方氧卧,導(dǎo)致這些數(shù)據(jù)呈現(xiàn)出非結(jié)構(gòu)化的狀態(tài)桃笙。當(dāng)用戶需要把這些不同的數(shù)據(jù)按一定規(guī)則排列展示出來的時候,由于數(shù)據(jù)存儲地方的不同沙绝,如果按照傳統(tǒng)的技術(shù)方案來實現(xiàn)的話會使得系統(tǒng)非常復(fù)雜搏明。而全文檢索則把這些分部在不同地方的數(shù)據(jù)按照一定的規(guī)則抽取出來,組合成一個結(jié)構(gòu)化的數(shù)據(jù)闪檬,這就可以非常方便地使用一些算法來快速地定位找到相關(guān)數(shù)據(jù)星著。而從這些散亂分部的數(shù)據(jù)中提取并重新組織出的信息,被稱之為索引粗悯。
Lucene的全文檢索過程
全文檢索大體分兩個過程虚循,索引創(chuàng)建和搜索索引。
索引創(chuàng)建:把所有的分部在不同地方的信息提取并重新組織起來样傍,創(chuàng)建索引横缔;
搜索索引:將用戶的查詢請求按一定規(guī)則轉(zhuǎn)換為特定的查詢條件,搜索索引中的結(jié)構(gòu)化數(shù)據(jù)铭乾,然后返回結(jié)果剪廉;
全文檢索存在三個重要問題:
索引里究竟存在些什么娃循?
如何創(chuàng)建索引炕檩?
如何對索引進(jìn)行搜索?
后面我們會對這三個問題進(jìn)行逐一研究與討論。
第一:索引里究竟存些什么笛质?
首先泉沾,由于數(shù)據(jù)的分散式存儲,導(dǎo)致我們不能直接去一次性查詢所有的數(shù)據(jù)妇押;即便所有的數(shù)據(jù)都存放在一起跷究,我們可以在一個地方去查詢數(shù)據(jù),也會由于所有用戶的數(shù)據(jù)都放在一起敲霍,導(dǎo)致查詢的數(shù)據(jù)過于龐大而搜索速度非常緩慢俊马。
這些非結(jié)構(gòu)化的數(shù)據(jù)所存儲的信息是每個文件包含哪些字符串,也即已知文件肩杈,欲求字符換相關(guān)容易柴我,就是從文件到字符串的映射。而我們想搜索的信息是哪些文件包含此字符串扩然,也即已知字符串艘儒,欲求文件,即從字符串到文件的映射夫偶,則會大大提高搜索速度界睁。
由于從字符串到文件的映射是從文件到字符串映射的反向過程,于是保存這種信息的索引稱為反向索引兵拢。
反向索引中存儲的信息如下:
假設(shè)我的文檔集合里面有100篇文檔翻斟,為了方便表示,我們將其表示為1-100说铃,其結(jié)構(gòu)如下:
反向索引存儲結(jié)構(gòu)
左邊的一系列字符串被稱為詞典杨赤。
每個字符串都指向包含此字符串的文檔鏈表,此文檔鏈表稱為倒排表截汪。
當(dāng)索引建立之后疾牲,我們就可以非常快速地搜索到想要得到的文檔衙解。
有人說阳柔,建立索引,然后再查詢蚓峦,兩者的速度不一定比直接進(jìn)行順序掃描快舌剂。的確,加上索引創(chuàng)建的過程暑椰,全文檢索不一定比直接的全文順序掃描快多少霍转,尤其在數(shù)據(jù)量少,并且存儲在一個地方的時候一汽,并且為一個很大的數(shù)據(jù)創(chuàng)建索引也是一個很慢的過程避消。然而兩者還是有一定的區(qū)別的低滩。順序掃描是每次查詢都要從頭查找,而創(chuàng)建索引的過程只有一次岩喷,以后就可以一勞永逸了恕沫,每次搜索,只要查詢索引即可纱意,而不用每次都去創(chuàng)建索引婶溯。