<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 134,comments - 22,trackbacks - 0

    全文轉(zhuǎn)載:http://blog.csdn.net/forfuture1978/archive/2009/10/22/4711308.aspx

    作者:forfuture1978 (from CSDN)

     

     

     

    我們都知道,Lucene是一個(gè)開放源代碼 的全文檢索引擎工具包。那么全文檢索到底是什么? 這要從我們生活中的數(shù)據(jù)說起。

     

    我們生活中的數(shù)據(jù)總體分為兩種:結(jié)構(gòu)化數(shù)據(jù) 非結(jié)構(gòu)化數(shù)據(jù)

    • 結(jié)構(gòu)化數(shù)據(jù): 指具有固定格式或有限長(zhǎng)度的數(shù)據(jù),如數(shù)據(jù)庫,元數(shù)據(jù)等。
    • 非結(jié)構(gòu)化數(shù)據(jù): 指不定長(zhǎng)或無固定格式的數(shù)據(jù),如郵件,word文檔等。

    當(dāng)然有的地方還會(huì)提到第三種,半結(jié)構(gòu)化數(shù)據(jù),如XML,HTML等,當(dāng)根據(jù)需要可按結(jié)構(gòu)化數(shù)據(jù)來處理,也可抽取出純文本按非結(jié)構(gòu)化數(shù)據(jù)來處理。

    非結(jié)構(gòu)化數(shù)據(jù)又一種叫法叫全文數(shù)據(jù)。

     按照數(shù)據(jù)的分類,搜索也分為兩種:

    • 對(duì)結(jié)構(gòu)化數(shù)據(jù)的搜索 :如對(duì)數(shù)據(jù)庫的搜索,用SQL語句。再如對(duì)元數(shù)據(jù)的搜索,如利用windows搜索對(duì)文件名,類型,修改時(shí)間進(jìn)行搜索等。
    • 對(duì)非結(jié)構(gòu)化數(shù)據(jù)的搜索 :如利用windows的搜索也可以搜索文件內(nèi)容,Linux下的grep命令,再如用Google和百度可以搜索大量?jī)?nèi)容數(shù)據(jù)。

    對(duì)非結(jié)構(gòu)化數(shù)據(jù)也即對(duì)全文數(shù)據(jù)的搜索主要有兩種方法:

     

    一種是順序掃描法 (Serial Scanning) 所謂順序掃描,比如要找內(nèi)容包含某一個(gè)字符串的文件,就是一個(gè)文檔一個(gè)文檔的看,對(duì)于每一個(gè)文檔,從頭看到尾,如果此文檔包含此字符串,則此文檔為我們要找的文件,接著看下一個(gè)文件,直到掃描完所有的文件。如利用windows的搜索也可以搜索文件內(nèi)容,只是相當(dāng)?shù)穆?。如果你有一個(gè)80G硬盤,如果想在上面找到一個(gè)內(nèi)容包含某字符串的文件,不花他幾個(gè)小時(shí),怕是做不到。Linux下的grep命令也是這一種方式。大家可能覺得這種方法比較原始,但對(duì)于小數(shù)據(jù)量的文件,這種方法還是最直接,最方便的。但是對(duì)于大量的文件,這種方法就很慢了。

     

    有人可能會(huì)說,對(duì)非結(jié)構(gòu)化數(shù)據(jù)順序掃描很慢,對(duì)結(jié)構(gòu)化數(shù)據(jù)的搜索卻相對(duì)較快(由于結(jié)構(gòu)化數(shù)據(jù)有一定的結(jié)構(gòu)可以采取一定的搜索算法加快速度),那么把我們的非結(jié)構(gòu)化數(shù)據(jù)想辦法弄得有一定結(jié)構(gòu)不就行了嗎?

     

    這種想法很天然,卻構(gòu)成了全文檢索的基本思路,也即將非結(jié)構(gòu)化數(shù)據(jù)中的一部分信息提取出來,重新組織,使其變得有一定結(jié)構(gòu),然后對(duì)此有一定結(jié)構(gòu)的數(shù)據(jù)進(jìn)行搜索,從而達(dá)到搜索相對(duì)較快的目的。

    這部分從非結(jié)構(gòu)化數(shù)據(jù)中提取出的然后重新組織的信息,我們稱之索引 。

     

    這種說法比較抽象,舉幾個(gè)例子就很容易明白,比如字典,字典的拼音表和部首檢字表就相當(dāng)于字典的索引,對(duì)每一個(gè)字的解釋是非結(jié)構(gòu)化的,如果字典沒有音節(jié)表和部首檢字表,在茫茫辭海中找一個(gè)字只能順序掃描。然而字的某些信息可以提取出來進(jìn)行結(jié)構(gòu)化處理,比如讀音,就比較結(jié)構(gòu)化,分聲母和韻母,分別只有幾種可以一一列舉,于是將讀音拿出來按一定的順序排列,每一項(xiàng)讀音都指向此字的詳細(xì)解釋的頁數(shù)。我們搜索時(shí)按結(jié)構(gòu)化的拼音搜到讀音,然后按其指向的頁數(shù),便可找到我們的非結(jié)構(gòu)化數(shù)據(jù)——也即對(duì)字的解釋。

     

    這種先建立索引,再對(duì)索引進(jìn)行搜索的過程就叫全文檢索(Full-text Search)

    下面這幅圖來自《Lucene in action》,但卻不僅僅描述了Lucene的檢索過程,而是描述了全文檢索的一般過程。

     

    全文檢索大體分兩個(gè)過程,索引創(chuàng)建 (Indexing) 搜索索引 (Search) 。

    • 索引創(chuàng)建:將現(xiàn)實(shí)世界中所有的結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)提取信息,創(chuàng)建索引的過程。
    • 搜索索引:就是得到用戶的查詢請(qǐng)求,搜索創(chuàng)建的索引,然后返回結(jié)果的過程。

    于是全文檢索就存在三個(gè)重要問題:

    1. 索引里面究竟存些什么?(Index)

    2. 如何創(chuàng)建索引?(Indexing)

    3. 如何對(duì)索引進(jìn)行搜索?(Search)

    下面我們順序?qū)γ總€(gè)個(gè)問題進(jìn)行研究。

     

     

    一、 索引里面究竟存些什么?(Index)

     

    首先我們來看為什么順序掃描的速度慢:

     

    其實(shí)是由于我們想要搜索的信息和非結(jié)構(gòu)化數(shù)據(jù)中所存儲(chǔ)的信息不一致造成的。

    非結(jié)構(gòu)化數(shù)據(jù)中所存儲(chǔ)的信息是每個(gè)文件包含哪些字符串,也即已知文件,欲求字符串相對(duì)容易,也即是從文件到字符串的映射。而我們想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即從字符串到文件的映射。兩者恰恰相反。于是如果索引總能夠保存從字符串到文件的映射,則會(huì)大大提高搜索速度。

     

    由于從字符串到文件的映射是文件到字符串映射的反向過程,于是保存這種信息的索引稱為反向索引 。

     

    反向索引的所保存的信息一般如下:

    假設(shè)我的文檔集合里面有100篇文檔,為了方便表示,我們?yōu)槲臋n編號(hào)從1到100,得到下面的結(jié)構(gòu)

     

    左邊保存的是一系列字符串,稱為詞典

    每個(gè)字符串都指向包含此字符串的文檔(Document)鏈表,此文檔鏈表稱為倒排表 (Posting List) 。

    有了索引,便使保存的信息和要搜索的信息一致,可以大大加快搜索的速度。

     

    比如說,我們要尋找既包含字符串“lucene”又包含字符串“solr”的文檔,我們只需要以下幾步:

    1. 取出包含字符串“lucene”的文檔鏈表。

    2. 取出包含字符串“solr”的文檔鏈表。

    3. 通過合并鏈表,找出既包含“lucene”又包含“solr”的文件。

    看到這個(gè)地方,有人可能會(huì)說,全文檢索的確加快了搜索的速度,但是多了索引的過程,兩者加起來不一定比順序掃描快多少。的確,加上索引的過程,全文檢索不一定比順序掃描快,尤其是在數(shù)據(jù)量小的時(shí)候更是如此。而對(duì)一個(gè)很大量的數(shù)據(jù)創(chuàng)建索引也是一個(gè)很慢的過程。

     

    然而兩者還是有區(qū)別的,順序掃描是每次都要掃描,而創(chuàng)建索引的過程僅僅需要一次,以后便是一勞永逸的了,每次搜索,創(chuàng)建索引的過程不必經(jīng)過,僅僅搜索創(chuàng)建好的索引就可以了。

     

    這也是全文搜索相對(duì)于順序掃描的優(yōu)勢(shì)之一:一次索引,多次使用。

     

     

    二、 如何創(chuàng)建索引?(Indexing)

     

    全文檢索的索引創(chuàng)建過程一般有以下幾步:

     

    1、一些要索引的原始文檔(Document)

     

    為了方便說明索引創(chuàng)建過程,這里特意用兩個(gè)文件為例:

    文件一:Students should be allowed to go out with their friends, but not allowed to drink beer.

    文件二:My friend Jerry went to school to see his students but found them drunk which is not allowed.

     

    2、將原始文檔傳給分詞組件(Tokenizer)

     

    分詞組件(Tokenizer)會(huì)做以下幾件事情( 此過程稱為Tokenize)

    1. 將文檔分成一個(gè)一個(gè)單獨(dú)的單詞。

    2. 去除標(biāo)點(diǎn)符號(hào)。

    3. 去除停用詞(Stop word) 。

     

    所謂停用詞(Stop word) 就是一種語言中最普通的一些單詞,由于沒有特別的意義,因而大多數(shù)情況下不能成為搜索的關(guān)鍵詞,因而創(chuàng)建索引時(shí),這種詞會(huì)被去掉而減少索引的大小。

    英語中挺詞(Stop word)如:“the”,“a”,“this”等。

    對(duì)于每一種語言的分詞組件(Tokenizer),都有一個(gè)停詞(stop word)集合。

     

    經(jīng)過分詞(Tokenizer) 后得到的結(jié)果稱為詞元(Token)

     

    在我們的例子中,便得到以下詞元(Token):

    “Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“students”,“found”,“them”,“drunk”,“allowed”。

     

    3、將得到的詞元(Token)傳給語言處理組件(Linguistic Processor)

     

    語言處理組件(linguistic processor)主要是對(duì)得到的詞元(Token)做一些同語言相關(guān)的處理。

    對(duì)于英語,語言處理組件(Linguistic Processor) 一般做以下幾點(diǎn):

    1. 變?yōu)樾?Lowercase) 。

    2. 將單詞縮減為詞根形式,如“cars ”到“car ”等。這種操作稱為:stemming 。

    3. 將單詞轉(zhuǎn)變?yōu)樵~根形式,如“drove ”到“drive ”等。這種操作稱為:lemmatization

     

    Stemming 和 lemmatization的異同:

    • 相同之處:Stemming和lemmatization都要使詞匯成為詞根形式。
    • 兩者的方式不同:
      • Stemming采用的是“縮減”的方式:“cars”到“car”,“driving”到“drive”。
      • Lemmatization采用的是“轉(zhuǎn)變”的方式:“drove”到“drive”,“driving”到“drive”。
    • 兩者的算法不同:
      • Stemming主要是采取某種固定的算法來做這種縮減,如去除“s”,去除“ing”加“e”,將“ational”變?yōu)?#8220;ate”,將“tional”變?yōu)?#8220;tion”。
      • Lemmatization主要是采用保存某種字典的方式做這種轉(zhuǎn)變。比如字典中有“driving”到“drive”,“drove”到“drive”,“am, is, are”到“be”的映射,做轉(zhuǎn)變時(shí),只要查字典就可以了。
    • Stemming和lemmatization不是互斥關(guān)系,是有交集的,有的詞利用這兩種方式都能達(dá)到相同的轉(zhuǎn)換。

    語言處理組件(linguistic processor)的結(jié)果稱為詞(Term) 。

    在我們的例子中,經(jīng)過語言處理,得到的詞(Term)如下:

    “student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,“student”,“find”,“them”,“drink”,“allow”。

    也正是因?yàn)橛姓Z言處理的步驟,才能使搜索drove,而drive也能被搜索出來。


    4、將得到的詞(Term)傳給索引組件(Indexer)

     

    索引組件主要是為了得到下面這個(gè)圖:

     

    在此表中,有幾個(gè)定義:

    • Document Frequency 即文檔頻次,表示總共有多少文件包含此詞(Term)。
    • Frequency 即詞頻率,表示此文件中包含了幾個(gè)此詞(Term)。

    所以對(duì)詞(Term) “allow”來講,總共有兩篇文檔包含此詞(Term),從而詞(Term)后面的文檔鏈表總共有兩項(xiàng),第一項(xiàng)表示包含“allow”的第一篇文檔,即 1號(hào)文檔,此文檔中,“allow”出現(xiàn)了2次,第二項(xiàng)表示包含“allow”的第二個(gè)文檔,是2號(hào)文檔,此文檔中,“allow”出現(xiàn)了1次。

     

    到此為止,索引已經(jīng)創(chuàng)建好了,我們可以通過它很快的找到我們想要的文檔。

     

    而且在此過程中,我們驚喜地發(fā)現(xiàn),搜索“drive”,“driving”,“drove”,“driven”也能夠被搜到。因?yàn)樵谖覀兊乃饕校?#8220;driving”,“drove”,“driven”都會(huì)經(jīng)過語言處理而變成“drive”,在搜索時(shí),如果您輸入“driving”,輸入的查詢語句同樣經(jīng)過我們這里的一到三步,從而變?yōu)椴樵?#8220;drive”,從而可以搜索到想要的文檔。

     

    三、 如何對(duì)索引進(jìn)行搜索?(Search)

     

    到這里似乎我們可以宣布“我們找到想要的文檔了”。

     

    然而事情并沒有結(jié)束,找到了僅僅是全文檢索的一個(gè)方面。不是嗎?如果僅僅只有一個(gè)或十個(gè)文檔包含我們查詢的字符串,我們的確找到了。然而如果結(jié)果有一千個(gè),甚至成千上萬個(gè)呢?那個(gè)又是您最想要的文件呢?

     

    打開Google吧,比如說您想在微軟找份工作,于是您輸入“Microsoft job”,您卻發(fā)現(xiàn)總共有22600000個(gè)結(jié)果返回。好大的數(shù)字呀,突然發(fā)現(xiàn)找不到是一個(gè)問題,找到的太多也是一個(gè)問題。在如此多的結(jié)果中,如何將最相關(guān)的放在最前面呢?

     

    當(dāng)然Google做的很不錯(cuò),您一下就找到了jobs at Microsoft。想象一下,如果前幾個(gè)全部是“Microsoft does a good job at software industry…”將是多么可怕的事情呀。

     

    如何像Google一樣,在成千上萬的搜索結(jié)果中,找到和查詢語句最相關(guān)的呢?

    如何判斷搜索出的文檔和查詢語句的相關(guān)性呢?

     

    這要回到我們第三個(gè)問題:如何對(duì)索引進(jìn)行搜索?

    搜索主要分為以下幾步:

     

    1、用于輸入查詢語句

     

    查詢語句同我們普通的語言一樣,也是有一定語法的。

    不同的查詢語句有不同的語法,如SQL語句就有一定的語法。

    查詢語句的語法根據(jù)全文檢索系統(tǒng)的實(shí)現(xiàn)而不同。最基本的有比如:AND, OR, NOT等。

    舉個(gè)例子,用戶輸入語句:lucene AND learned NOT hadoop。

    說明用戶想找一個(gè)包含lucene和learned然而不包括hadoop的文檔。

     

    2、對(duì)查詢語句進(jìn)行詞法分析,語法分析及語言處理

     

    由于查詢語句有語法,因而也要進(jìn)行語法分析,語法分析及語言處理。

     

    詞法分析主要用來識(shí)別單詞和關(guān)鍵字。

    如上述例子中,經(jīng)過詞法分析,得到單詞有l(wèi)ucene,learned,hadoop, 關(guān)鍵字有AND, NOT。

    如果在詞法分析中發(fā)現(xiàn)不合法的關(guān)鍵字,則會(huì)出現(xiàn)錯(cuò)誤。如lucene AMD learned,其中由于AND拼錯(cuò),導(dǎo)致AMD作為一個(gè)普通的單詞參與查詢。

     

    語法分析主要是根據(jù)查詢語句的語法規(guī)則來形成一棵語法樹。

    如果發(fā)現(xiàn)查詢語句不滿足語法規(guī)則,則會(huì)報(bào)錯(cuò)。如lucene NOT AND learned,則會(huì)出錯(cuò)。

     

    語言處理同索引過程中的語言處理幾乎相同。

    如learned變成learn等。

     

    3、搜索索引,得到符合語法樹的文檔

     

    此步驟有分幾小步:

    首先,在反向索引表中,分別找出包含lucene,learn,hadoop的文檔鏈表。

    其次,對(duì)包含lucene,learn的鏈表進(jìn)行合并操作,得到既包含lucene又包含learn的文檔鏈表。

    然后,將此鏈表與hadoop的文檔鏈表進(jìn)行差操作,去除包含hadoop的文檔,從而得到既包含lucene又包含learn而且不包含hadoop的文檔鏈表。

    最后,此文檔鏈表就是我們要找的文檔。

     

    4、根據(jù)得到的文檔和查詢語句的相關(guān)性,對(duì)結(jié)果進(jìn)行排序。

    雖然在上一步,我們得到了想要的文檔,然而對(duì)于查詢結(jié)果應(yīng)該按照與查詢語句的相關(guān)性進(jìn)行排序,越相關(guān)者越靠前。

     

    如何計(jì)算文檔和查詢語句的相關(guān)性呢?

     

    不如我們把查詢語句看作一片短小的文檔,對(duì)文檔與文檔之間的相關(guān)性(relevance)進(jìn)行打分(scoring),分?jǐn)?shù)高的相關(guān)性好,就應(yīng)該排在前面。


    那么又怎么對(duì)文檔之間的關(guān)系進(jìn)行打分呢?

     

    首先,一個(gè)文檔有很多詞(Term)組成 , 如search, lucene, full-text, this, a, what等。

    其次對(duì)于文檔之間的關(guān)系,不同的Term重要性不同 , 比如對(duì)于本篇文檔,search, Lucene, full-text就相對(duì)重要一些,this, a , what可能相對(duì)不重要一些。所以如果兩篇文檔都包含search, Lucene,fulltext,這兩篇文檔的相關(guān)性好一些,然而就算一篇文檔包含this, a, what,另一篇文檔不包含this, a, what,也不能影響兩篇文檔的相關(guān)性。

    因而判斷文檔之間的關(guān)系,首先找出哪些詞(Term)對(duì)文檔之間的關(guān)系最重要,如search, Lucene, fulltext。然后判斷這些詞(Term)之間的關(guān)系。

    找出詞(Term) 對(duì)文檔的重要性的過程稱為計(jì)算詞的權(quán)重(Term weight) 的過程。

    計(jì)算詞的權(quán)重(term weight)有兩個(gè)參數(shù),第一個(gè)是詞(Term),第二個(gè)是文檔(Document)。

    詞的權(quán)重(Term weight)表示此詞(Term)在此文檔中的重要程度,越重要的詞(Term)有越大的權(quán)重(Term weight),因而在計(jì)算文檔之間的相關(guān)性中將發(fā)揮更大的作用。

    判斷詞(Term) 之間的關(guān)系從而得到文檔相關(guān)性的過程應(yīng)用一種叫做向量空間模型的算法(Vector Space Model) 。

    下面仔細(xì)分析一下這兩個(gè)過程:

    1. 計(jì)算權(quán)重(Term weight)的過程。

    影響一個(gè)詞(Term)在一篇文檔中的重要性主要有兩個(gè)因素:

    • Term Frequency (tf):即此Term在此文檔中出現(xiàn)了多少次。tf 越大說明越重要。
    • Document Frequency (df):即有多少文檔包含次Term。df 越大說明越不重要 。

    容易理解嗎?詞(Term)在文檔中出現(xiàn)的次數(shù)越多,說明此詞(Term)對(duì)該文檔越重要,如“搜索”這個(gè)詞,在本文檔中出現(xiàn)的次數(shù)很多,說明本文檔主要就是講這方面的事的。然而在一篇英語文檔中,this出現(xiàn)的次數(shù)更多,就說明越重要嗎?不是的,這是由第二個(gè)因素進(jìn)行調(diào)整,第二個(gè)因素說明,有越多的文檔包含此詞(Term), 說明此詞(Term)太普通,不足以區(qū)分這些文檔,因而重要性越低。

     

    這也如我們程序員所學(xué)的技術(shù),對(duì)于程序員本身來說,這項(xiàng)技術(shù)掌握越深越好(掌握越深說明花時(shí)間看的越多,tf越大),找工作時(shí)越有競(jìng)爭(zhēng)力。然而對(duì)于所有程序員來說,這項(xiàng)技術(shù)懂得的人越少越好(懂得的人少df?。?,找工作越有競(jìng)爭(zhēng)力。人的價(jià)值在于不可替代性就是這個(gè)道理。

     

    道理明白了,我們來看看公式:

     

    這僅僅只term weight計(jì)算公式的簡(jiǎn)單典型實(shí)現(xiàn)。實(shí)現(xiàn)全文檢索系統(tǒng)的人會(huì)有自己的實(shí)現(xiàn),Lucene就與此稍有不同。

    2. 判斷Term之間的關(guān)系從而得到文檔相關(guān)性的過程,也即向量空間模型的算法(VSM)。

    我們把文檔看作一系列詞(Term),每一個(gè)詞(Term)都有一個(gè)權(quán)重(Term weight),不同的詞(Term)根據(jù)自己在文檔中的權(quán)重來影響文檔相關(guān)性的打分計(jì)算。

    于是我們把所有此文檔中詞(term)的權(quán)重(term weight) 看作一個(gè)向量。

    Document = {term1, term2, …… ,term N}

    Document Vector = {weight1, weight2, …… ,weight N}

    同樣我們把查詢語句看作一個(gè)簡(jiǎn)單的文檔,也用向量來表示。

    Query = {term1, term 2, …… , term N}

    Query Vector = {weight1, weight2, …… , weight N}

    我們把所有搜索出的文檔向量及查詢向量放到一個(gè)N維空間中,每個(gè)詞(term)是一維。

     

    我們認(rèn)為兩個(gè)向量之間的夾角越小,相關(guān)性越大。

    所以我們計(jì)算夾角的余弦值作為相關(guān)性的打分,夾角越小,余弦值越大,打分越高,相關(guān)性越大。

    有人可能會(huì)問,查詢語句一般是很短的,包含的詞(Term)是很少的,因而查詢向量的維數(shù)很小,而文檔很長(zhǎng),包含詞(Term)很多,文檔向量維數(shù)很大。你的圖中兩者維數(shù)怎么都是N呢?

    在這里,既然要放到相同的向量空間,自然維數(shù)是相同的,不同時(shí),取二者的并集,如果不含某個(gè)詞(Term)時(shí),則權(quán)重(Term Weight)為0。

    相關(guān)性打分公式如下:

     

    根據(jù)這個(gè)公式就能算出文檔與查詢之間的相似程度了。

     

    四、總結(jié)

    對(duì)上述索引創(chuàng)建和搜索過程所一個(gè)總結(jié),如圖:

    此圖參照http://www.lucene.com.cn/about.htm 中文章《開放源代碼的全文檢索引擎Lucene》

     

    1. 索引過程:

     

    a 有一系列被索引文件

    b) 被索引文件經(jīng)過語法分析和語言處理形成一系列詞(Term) 。

    c) 經(jīng)過索引創(chuàng)建形成詞典和反向索引表。

    d) 通過索引存儲(chǔ)將索引寫入硬盤。

     

    2. 搜索過程:

     

    a) 用戶輸入查詢語句。

    b) 對(duì)查詢語句經(jīng)過語法分析和語言分析得到一系列詞(Term) 。

    c) 通過語法分析得到一個(gè)查詢樹。

    d) 通過索引存儲(chǔ)將索引讀入到內(nèi)存。

    e) 利用查詢樹搜索索引,從而得到每個(gè)詞(Term) 的文檔鏈表,對(duì)文檔鏈表進(jìn)行交,差,并得到結(jié)果文檔。

    f) 將搜索到的結(jié)果文檔對(duì)查詢的相關(guān)性進(jìn)行排序。

    g) 返回查詢結(jié)果給用戶。

    posted on 2010-10-04 10:36 何克勤 閱讀(4377) 評(píng)論(1)  編輯  收藏 所屬分類: Java開源Linux 多線程

    FeedBack:
    # re: 全文檢索的基本原理
    2013-01-19 23:52 | 謝謝分享
    懂點(diǎn)了。
    人工智能  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 99久久国产热无码精品免费| 久久国产精品2020免费m3u8| 久久久精品国产亚洲成人满18免费网站 | 亚洲欧洲日产国码二区首页 | 久久亚洲AV成人无码电影| 亚洲视频在线免费看| 亚洲免费福利在线视频| 特级毛片A级毛片100免费播放| 国产A∨免费精品视频| 99久久免费精品高清特色大片| 青青草免费在线视频| 男人的天堂亚洲一区二区三区| 亚洲日韩在线观看| 综合自拍亚洲综合图不卡区| 亚洲乱码国产乱码精华| 一级做a爰片性色毛片免费网站| 亚在线观看免费视频入口| 思思99re66在线精品免费观看| 亚洲国产婷婷香蕉久久久久久| 亚洲欧洲免费视频| 精品无码专区亚洲| 日韩精品无码免费专区网站| 国产在线观看片a免费观看| 亚洲国产精品一区二区第四页| 久久久久久亚洲Av无码精品专口 | 四虎国产精品永久免费网址| 成人av免费电影| 亚洲精品乱码久久久久久蜜桃不卡 | 欧美好看的免费电影在线观看| 亚洲国产人成精品| 91亚洲性爱在线视频| 伊人久久国产免费观看视频| 57pao国产成视频免费播放| avtt亚洲天堂| 91午夜精品亚洲一区二区三区| 一级做α爱过程免费视频| 91精品免费国产高清在线| 国产精品亚洲美女久久久| 亚洲av无码一区二区三区天堂古代| 一区二区3区免费视频| 久久精品网站免费观看|