TNT blog  
          日歷
          <2025年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456
          統(tǒng)計
          • 隨筆 - 5
          • 文章 - 40
          • 評論 - 7
          • 引用 - 0

          導航

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          home

          搜索

          •  

          最新隨筆

          最新評論

          閱讀排行榜

           

          基本流程
          1、 初始化IndexSearcher :Searcher searcher = new IndexSearcher(indexDir);//indexDir為索引存放路徑
          2、 生成Query對象: QueryParser類的parse()方法返回Query類形對象
          3、 使用search(Query)方法,開始搜索,并返回Hits對象
          4、 使用Hits對象的方法檢索結(jié)果:
          length();//結(jié)果總數(shù)量
          doc(int n);//返回第n個文檔;Document對象
          id(int n);//第n個文檔的內(nèi)部ID
          score(n);//第n個文檔的分值,用于排序

          例子:
          IndexSearcher searcher = new IndexSearcher(“c:\\index”);
          Query query = QueryParser.parse(“key1”,”name”,new StandardAnalyzer());
          Hits hits = searcher.search(query);
          If(hits.length()==0){
           Out.println(“not found”);
          }
          else{
           for(int i=0;i  Document d  = hits.doc(i);
           Out.println(d.get(“title”));
          }
          }

          文檔搜索結(jié)果的主要排序依據(jù)是文檔的分值。改變文檔分值的方法是建立索引時,在初始化Document對象后,使用Document的setBoost方法來改變文檔的boost因子(分值的倍數(shù)):
          Document doc = new Document();
          Doc.add(Field.Text(“contents”,”text1 text2”));
          Doc.setBoost(1.5f); //改變因子,如0.3f,1.0f等

          構(gòu)建Query:
          Query是search包中的一個抽象類,它有許多子類,代表不同類形的查詢

          關(guān)鍵字TermQuery
          Term term = new Term(“contents”,”java”);//實質(zhì)也是一個鍵/值對
          //構(gòu)造TermQuery
          Query query = new TermQuery(term);

          組合查詢BooleanQuery
          BooleanQuery是一個查詢?nèi)萜鳎峁iT的方法往其中加入查詢,并標明條件的關(guān)系
          IndexSearcher searcher = new IndexSearcher(“c:\\index”);
          Query q1 = new TermQuery(new Term(“name”,”tim”));
          Query q2 = new TermQuery(new Term(“name”,”fly”));
          //構(gòu)造容器
          Query query = new BooleanQuery();
          query.add(q1,true,false);
          query..add(q2,true,false);
          Hits hits = searcher.search(query);

          BooleanQuery的add方法的第二,第三參數(shù)說明:第二參數(shù)表示是否必須滿足,第三參數(shù)表示是否不需要滿足,組合一起有以下三種情況:
          True,false:當前查詢條件是必須要滿足的
          False ,true:當前查詢是不可以滿足的
          False,false:條件是可選的
          True,true:這種情況是錯誤的
          以上表明,上述例子的兩個條件都是必須滿足的,是“與(and)”的關(guān)系
          如果查進行“或(or)”運算,相應地可改為:
          query.add(q1,false,false);
          query.add(q2,false,false)

          范圍搜索RangeQuery
          RangeQuery query = new RangeQuery(begin,end,included);//最后參數(shù)為是否包含邊界
          例:
          Term begin = new Term(“time”,”20050101”);
          Term end = new Term(“time”,”20050202”);
          RangeQuery query = new RangeQuery(begin,end,false);

          前綴PrefixQuery
          PrefixQuery query = new PrefixQuery(new Term(“name”,”ti”));//name字段中以ti開頭

          多關(guān)鍵字PhraseQuery
          PhraseQuery query = new PhraseQuery();
          Query.add(new Term(“content”,”hello”));
          Query.add(new Term(“content”,”world”));
          Query.setSlop(2);
           //設(shè)置以上加上的兩個關(guān)鍵字坡度,此值代表兩個關(guān)鍵字之間無關(guān)詞的個數(shù).對于兩個緊連的關(guān)鍵字,無論將坡度設(shè)為多少都能找到,如果兩個詞不緊連,且坡度值小于它們之間的無關(guān)詞的數(shù)量,則無法找到

          短詞綴PhrasePrefixQuery
          Term word1 = new Term(“content”,”david”);
          Term word2 = new Term(“content”,”mary”);
          Term word3 = new Term(“content”,”robert”);
          PhrasePrefixQuery query = new PhrasePrefixQuery();
          //加入不確定的詞
          Query.add(new Term[]{word1,word2});//不確定,第一個關(guān)鍵詞在Term數(shù)組中產(chǎn)生
          //加入確定的詞
          query.add(word3);
          query.setSlop(2);//設(shè)置坡度
          //以上查詢中,david robert和mary robert都會出現(xiàn)在查詢結(jié)果,同樣地,mary and robert也會被擊中

          相近詞FuzzyQuery
          FuzzyQuery query = new FuzzyQuery(new Term(“content”,”david”));

          通配符WildcardQuery
          WildcardQuery query = new WildcardQuery(new Term(“content”,”*im”));
          WildcardQuery query = new WildcardQuery(new Term(“content”,”t?m??”));
          //*代表0個或多個字符,?一個字符

          QueryParser類,把用戶各種輸入轉(zhuǎn)為Query
          Query query = QueryParser.parse(keywords,filedName,new StandardAnalyer());
          關(guān)鍵字格式:
          “tim” //在默認字段搜索tim
          “name:tim”;//在name字段搜tim
          “tim wong”或tim or wong;//在默認字段搜搜關(guān)鍵字tim 或wong
          “+tim +wong”或”tim and wong” //搜索tim和 wong
          ”tim*”//在默認字段中搜前綴為tim的
          “name:tim is a programer”;//在name字段中包含短語tim is a programer
          “(tim or wong) and php” //在默認字段中搜含有tim 或wong的關(guān)鍵字,但一定要包含php
          “name:tim –title:php” //name字段搜tim,并且title不含有php

          另外,QueryParser構(gòu)造時需要一個分析器,它應該與建立索引時的分析器一樣

          QueryParser的“與”和“或”
          當輸入兩個關(guān)鍵字時,默認關(guān)系是或,要改變這種關(guān)系,方法是:
          QueryParser parser = new QueryParser(keyword,fieldNmae,new StandardAnalyzer());
          Parser.setOperator(QueryParser.DEFAULT_OPERATOR_AND);

           

          排序及多字段查找

          默認情況下,IndexSearcher類的search方法返回查詢結(jié)果時,是按文檔的分值排序的,可以使用重載的search方法對結(jié)果排序

          IndexSearcher.search(Query,Sort);

          new Sort() 和 Sort.RELEVANCE,以及null一樣,采用默認排序,要定義排序字段,方法是將字段傳入Sort對象

          Sort sort = new Sort(String field);

          也可以對多個字段排序Sort sort = new Sort(String[] fields);

          例:

          Sort sort = new Sort(new SortField[]{new SortField(“title”),new SortField(“name”)});

          Hits hits=searcher.search(query,Sort);

           

          多字段查找MultiFieldQueryParser

          只在某些Term中查找,不關(guān)心在哪個字段

          Query query = new MultiFieldQueryParser.parse(“word”,new String[]{“title”,”content”},analyzer); //在title和content中找word

          多字段時默認是OR關(guān)系,要改變它,使用以下方法:

          Query query = MultiFieldQueryParser.parse(“word”,new String[]{“title”,”content”},new int[]{MultiFieldQueryParser.REQUIRED_FIELD,MultiFieldQueryParser.PROHIBITED_FIELD},analyzer);

          其中:

          REQUIRED_FIELD 表示該條件必須有

          PROHIBITED_FIELD 表示必須不含

           

          索多個索引文件MultiSearcher

          1)      建立多個索引:使用不同的索引目錄,實例化不同的IndexWriter

          2)      建立多索引搜索器:

          Searcher[] searchers = new SEARCHER[2];

          Searchers[0] = new IndexSearcher(dir1); //搜索索引目錄一

          Searchers[1]= new IndexSearcher(dir2);//搜索索引目錄二

          Searcher searcher = new MultiSearcher(serarchers);

          3) 開始查詢:Hits hits = searcher.search(query);



          posted on 2007-06-27 16:52 TNT 閱讀(636) 評論(0)  編輯  收藏 所屬分類: apache
           
          Copyright © TNT Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 巴南区| 辉南县| 阜新| 恩施市| 广丰县| 三都| 宣恩县| 刚察县| 德保县| 大邑县| 竹北市| 双鸭山市| 汉中市| 乃东县| 临夏市| 通江县| 永定县| 襄垣县| 高清| 庄浪县| 岑溪市| 东至县| 成安县| 思南县| 金寨县| 唐山市| 来凤县| 阜城县| 衡南县| 滦南县| 古田县| 巴塘县| 鹿泉市| 通州市| 泾阳县| 乌什县| 襄垣县| 达拉特旗| 东兰县| 九寨沟县| 崇信县|