lucene 東西太多,一點(diǎn)一點(diǎn)來(lái),先談下本人對lucene里Query的分析。其他的會(huì )在后續作品中發(fā)布。如有不足或者我理解上的錯誤,請email給我,我好及時(shí)改正,更新。
Query是Search的基本單元,實(shí)現各種搜索的方法,下面我簡(jiǎn)單的列一下他們的作用,
TermQuery,
最基本的Query,用TermQuery(new Term(Str filed, Str Text));就可以構造, TermQuery把查詢(xún)條件視為一個(gè)key, 要求和查詢(xún)內容完全匹配,比如Field.Keyword類(lèi)型就可以使用TermQuery。
PhraseQuery
PhraseQuery
表示可用于非嚴格語(yǔ)句的查詢(xún),匹配包含的指定連續Term, 比如"one five"可以匹配"one two three four five"等, PhraseQuery提供了一個(gè)重要的setSlop()參數, 這個(gè)參數主要用于設置phrase query中詞之間的允許間隔數目,在默認情況下slop的值是0, 就相當于TermQuery的精確匹配, 通過(guò)設置slop參數(比如"one five"匹配"one two three four five"就需要slop=3,如果slop=2就無(wú)法得到結果。這里我們可以認為slope是單詞移動(dòng)得次數,可以左移或者右移。這里特別提醒,PhraseQuery不保證前后單詞的次序,在上面的例子中,"two one"就需要2個(gè)slop,也就是認為one 向左邊移動(dòng)2位, 就是能夠匹配的”one two”如果是“five three one” 就需要slope=6才能匹配。還有一點(diǎn)要注意,就是如果碰到stopword,(會(huì )在stopAnalyzer中細說(shuō)),則stopword不用把slop算在內。
BooleanQuery
BooleanQuery
是一個(gè)組合的Query, 可以把各種Query添加進(jìn)去(主要是TernQuery和PhraseQuery)并標明他們的邏輯關(guān)系,添加條件用public void add(Query query, boolean required, boolean prohibited)方法, 后兩個(gè)boolean變量分別表示不匹配子Query將不匹配booleanQuery和匹配子Query將不匹配booleanQuery。估計類(lèi)似google的(+,-)功能。這兩個(gè)參數不允許同時(shí)為true, 否則報錯。但兩個(gè)參數可以都為false,而且必須保證匹配至少一個(gè)子query才能用來(lái)匹配booleanQuery。 一個(gè)BooleanQuery中可以添加多個(gè)Query, 但不能超過(guò)setMaxClauseCount(int)的值(默認1024個(gè)),否則拋出TooManyClauses錯誤.
RangeQuery
RangeQuery
RangeQuery表示一個(gè)范圍的搜索條件,RangeQuery query = new RangeQuery(begin, end, included);最后一個(gè)boolean值表示是否包含邊界條件本身, begin和end必須滿(mǎn)足至少有一個(gè)不為null及兩者都在同一個(gè)field. 這里的Range是以String的compareTo (Str)進(jìn)行比較。所以熟悉j2se的應該很容易確定Range的范圍。
PrefixQuery
PrefixQuery
表示匹配是以指定字符串開(kāi)頭的匹配查詢(xún), 可以用于Keyword形式的查詢(xún)。一般的在suggestion里對于single word可以使用的,也可用于查詢(xún)網(wǎng)絡(luò )結構目錄樹(shù)的數目。
PhrasePrefixQuery
PhrasePrefixQuery
由于PhraseQuery不能很靈活的適應各種的phrase的匹配。比如要搜索”Sony Cam*”, 先可以把add(Term)把Sony放在Term.,然后把使用IndexReader.Terms(Term)匹配以Cam為前綴的詞,最后使用PhrasePrefixQuery.add(Term[] terms)把兩者加在Query中。這里slope和phraseQuery雷同,仍然起著(zhù)對phrase的定位作用,addTerm(Term[] terms)內使用ArrayList來(lái)保存Term數據,而Phrase使用的是Vector.
WildcardQuery
WildcardQuery
WildcardQuery和FuzzyQuery是繼承MultiTermQuery的,這是他們區別的其他的幾種常規Query. Query包含自身全部的匹配,Term由FilteredTermEnum提供,而MultiQuery則是不完全自身的匹配。Term的提供者也不同。WildcardQuery主要使用?和*來(lái)表示一個(gè)或多個(gè)字母的匹配,值得注意的是,在wildcard中,empty對于?和*也是匹配的,且Query的開(kāi)頭不允許用使用?和*.
FuzzyQuery
FuzzyQuery
能模糊匹配英文單詞,這個(gè)功能非常有用,大小寫(xiě)敏感??梢允褂闷錁嬙旆椒?/span>FuzzyQuery(Term term, float minimumSimilarity, int prefixLength)方法,還提供2種默認的0.5相似度,和0的前綴狀態(tài)。相似度比較時(shí)要減去非比較的前綴。然后再比。例如,用”soni”匹配”sony”設置相似度前綴為0,則相似度為75%,如果前綴為1,則相似度為66.7%.只要高于最小相似度,便能找到。如果詞長(cháng)度不一致,則以Query減去前綴的為準,例如設前綴為1,用”della”來(lái)匹配”dell”,相似度75%, 如果”del”來(lái)匹配”dell”則相似度只有50%
聯(lián)系客服