szhswl
          宋針還的個人空間

                  這里首先介紹一下基本的query:
          1,最普通的TermQuery
                  TermQuery最普通, 用Term t=new Term("contents","cap"); new TermQuery(t)就可以構造
                  TermQuery把查詢條件視為一個key, 要求和查詢內容完全匹配,比如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添加進去并標明他們的邏輯關系,添加條件用

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

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

          5,PhraseQuery
                  表示不嚴格語句的查詢,比如"red pig"要匹配"red fat pig","red fat big pig"等,PhraseQuery所以提供了一個setSlop()參數,在查詢中,lucene會嘗試調整單詞的距離和位置,這個參數表示可以接受調整次數限制,如果實際的內容可以在這么多步內調整為完全匹配,那么就被視為匹配.在默認情況下slop的值是0, 所以默認是不支持非嚴格匹配的, 通過設置slop參數(比如"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中,只要是匹配上的紀錄,他們的相關度都是一樣的,比如wilxaaaa和wilda的對于wil*a的相關度就是一樣的.

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

          注意上面WildcardQuery類,在網上有很多資料在介紹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     }

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

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



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

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


          網站導航:
           
          主站蜘蛛池模板: 柞水县| 曲阜市| 玛沁县| 墨江| 深州市| 阿克陶县| 察隅县| 翁源县| 泗水县| 原阳县| 绥滨县| 长泰县| 汾西县| 石嘴山市| 特克斯县| 南溪县| 邢台县| 武功县| 定结县| 巴林右旗| 庆城县| 上杭县| 新河县| 驻马店市| 泰和县| 仁寿县| 高雄市| 长海县| 应城市| 望城县| 从化市| 乐都县| 怀来县| 沽源县| 肃宁县| 东乡族自治县| 通化县| 科技| 花莲市| 衡东县| 浦江县|