szhswl
          宋針還的個人空間

                  這里首先介紹一下基本的query:
          1,最普通的TermQuery
                  TermQuery最普通, 用Term t=new Term("contents","cap"); new TermQuery(t)就可以構(gòu)造
                  TermQuery把查詢條件視為一個key, 要求和查詢內(nèi)容完全匹配,比如Field.Keyword類型就可以使用TermQuery

          2,RangeQuery
                  RangeQuery表示一個范圍的搜索條件,RangeQuery query = new RangeQuery(begin, end, included);
                  最后一個boolean值表示是否包含邊界條件本身, 用字符表示為"[begin TO end]" 或者"{begin TO end}"

          3,PrefixQuery
                  顧名思義,就是表示以某某開頭的查詢, 字符表示為"something*"

          4,BooleanQuery
                  這個是一個組合的Query,你可以把各種Query添加進去并標明他們的邏輯關(guān)系,添加條件用

                  public void add(Query query, boolean required, boolean prohibited)

                  方法, 后兩個boolean變量是標示AND OR NOT三種關(guān)系 字符表示為" AND OR NOT" 或 "+ -" ,一個BooleanQuery中可以添加多個Query, 如果超過setMaxClauseCount(int)的值(默認1024個)的話,會拋出TooManyClauses錯誤.

          5,PhraseQuery
                  表示不嚴格語句的查詢,比如"red pig"要匹配"red fat pig","red fat big pig"等,PhraseQuery所以提供了一個setSlop()參數(shù),在查詢中,lucene會嘗試調(diào)整單詞的距離和位置,這個參數(shù)表示可以接受調(diào)整次數(shù)限制,如果實際的內(nèi)容可以在這么多步內(nèi)調(diào)整為完全匹配,那么就被視為匹配.在默認情況下slop的值是0, 所以默認是不支持非嚴格匹配的, 通過設(shè)置slop參數(shù)(比如"red pig"匹配"red fat pig"就需要1個slop來把pig后移動1位),我們可以讓lucene來模糊查詢. 值得注意的是,PhraseQuery不保證前后單詞的次序,在上面的例子中,"pig red"需要2個slop,也就是如果slop如果大于等于2,那么"pig red"也會被認為是匹配的.

          6,WildcardQuery
                  使用?和*來表示一個或多個字母比如wil*a可以匹配 wilda ,wilba ,wilxaaaa...,值得注意的是,在wildcard中,只要是匹配上的紀錄,他們的相關(guān)度都是一樣的,比如wilxaaaa和wilda的對于wil*a的相關(guān)度就是一樣的.

          7,F(xiàn)uzzyQuery
                  這個Query對中文沒有什么用處,他能模糊匹配英文單詞(前面的都是詞組),比如fuzzy和wuzzy他們可以看成類似, 對于英文的各種時態(tài)變化和復(fù)數(shù)形式,這個FuzzyQuery還算有用,匹配結(jié)果的相關(guān)度是不一樣的.字符表示為 "fuzzy~"

          注意上面WildcardQuery類,在網(wǎng)上有很多資料在介紹WildcardQuery時,比如:http://www.ibm.com/developerworks/cn/web/wa-lucene2/
          中就寫到:
          如果你想查詢 Teach, Teacher 和 Teaching,你就可以使用查詢語句 “Teach*”。下面代碼 顯示了通配符查詢的過程。

           1     public void testWildcardSearch(String indexDirectory)throws Exception{
           2             Directory dir = FSDirectory.getDirectory(indexDirectory,false);
           3             IndexSearcher indexSearcher = new IndexSearcher(dir);
           4             String[] searchWords = {"tex*""tex?""?ex*"};
           5             Query query;
           6             for(int i = 0; i < searchWords.length; i++){
           7                 query = new WildcardQuery(new Term("title",searchWords[i]));
           8                 Hits results = indexSearcher.search(query);
           9                 System.out.println(results.length() + "search results for query " + searchWords[i]);
          10             }
          11     }

          都給人以誤解(當然上面代碼這樣寫是沒錯的、可以執(zhí)行的),比如像GOOGLE一樣在查詢框中用"Teach*"時查詢會實例化WildcardQuery類,而在《Lucene IN ACTION》書中關(guān)于解析查詢表達式:QueryParser的說明中寫到了通配符和前綴查詢關(guān)系:
                  如果某個項包含了一個星號或問號,該項就會看作是進行通配符查詢的一個WildcardQuery對象。而當查詢項僅在項的末尾有一個星號時,QueryParser會將它優(yōu)化為前綴查詢的 PrefixQuery對象。不管是前綴查詢,還是通配符查詢,其對象都會被默認地轉(zhuǎn)換為小寫形式,不過該轉(zhuǎn)換行為也是可以控制的。
                  如果要關(guān)閉自動的小寫轉(zhuǎn)換功能,就一定要自己創(chuàng)建QueryParser實例,而不能只通過靜態(tài)的parse()方法。當通配符位于查詢項的開頭時,不能使用QueryParser進行解析;但由API的構(gòu)造函數(shù)創(chuàng)建的Wildcard對象,則允許查詢項以通配符開頭(但這以損失查詢性能為代價)。

          所以在這里給剛上路的新手一點說明。



          ---------------------------------------------------------------------------------------------------------------------------------
          說人之短,乃護己之短。夸己之長,乃忌人之長。皆由存心不厚,識量太狹耳。能去此弊,可以進德,可以遠怨。
          http://www.aygfsteel.com/szhswl
          ------------------------------------------------------------------------------------------------------ ----------------- ---------
          posted on 2007-12-18 11:43 宋針還 閱讀(1351) 評論(0)  編輯  收藏

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 西宁市| 鹿泉市| 嘉善县| 义马市| 百色市| 长白| 车致| 晋城| 迭部县| 呼和浩特市| 高碑店市| 东乡族自治县| 宁津县| 关岭| 昂仁县| 牡丹江市| 南和县| 邹平县| 昌吉市| 洛宁县| 乐亭县| 道孚县| 讷河市| 兴山县| 水城县| 隆林| 桓台县| 钦州市| 通渭县| 磴口县| 通化县| 泰来县| 安乡县| 鲁山县| 南澳县| 新邵县| 东山县| 泰来县| 普陀区| 乌鲁木齐县| 河曲县|