TNT blog  
          日歷
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345
          統計
          • 隨筆 - 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對象的方法檢索結果:
          length();//結果總數量
          doc(int n);//返回第n個文檔;Document對象
          id(int n);//第n個文檔的內部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”));
          }
          }

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

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

          關鍵字TermQuery
          Term term = new Term(“contents”,”java”);//實質也是一個鍵/值對
          //構造TermQuery
          Query query = new TermQuery(term);

          組合查詢BooleanQuery
          BooleanQuery是一個查詢容器,提供專門的方法往其中加入查詢,并標明條件的關系
          IndexSearcher searcher = new IndexSearcher(“c:\\index”);
          Query q1 = new TermQuery(new Term(“name”,”tim”));
          Query q2 = new TermQuery(new Term(“name”,”fly”));
          //構造容器
          Query query = new BooleanQuery();
          query.add(q1,true,false);
          query..add(q2,true,false);
          Hits hits = searcher.search(query);

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

          范圍搜索RangeQuery
          RangeQuery query = new RangeQuery(begin,end,included);//最后參數為是否包含邊界
          例:
          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開頭

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

          短詞綴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});//不確定,第一個關鍵詞在Term數組中產生
          //加入確定的詞
          query.add(word3);
          query.setSlop(2);//設置坡度
          //以上查詢中,david robert和mary robert都會出現在查詢結果,同樣地,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類,把用戶各種輸入轉為Query
          Query query = QueryParser.parse(keywords,filedName,new StandardAnalyer());
          關鍵字格式:
          “tim” //在默認字段搜索tim
          “name:tim”;//在name字段搜tim
          “tim wong”或tim or wong;//在默認字段搜搜關鍵字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的關鍵字,但一定要包含php
          “name:tim –title:php” //name字段搜tim,并且title不含有php

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

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

           

          排序及多字段查找

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

          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中查找,不關心在哪個字段

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

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

          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 閱讀(634) 評論(0)  編輯  收藏 所屬分類: apache
           
          Copyright © TNT Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 邢台县| 平远县| 阿巴嘎旗| 炎陵县| 揭东县| 襄城县| 东山县| 雷山县| 永寿县| 巢湖市| 天柱县| 石城县| 大渡口区| 石景山区| 当涂县| 荣成市| 尉犁县| 景东| 历史| 南安市| 乌兰县| 太保市| 三江| 石首市| 喀喇| 富宁县| 阳泉市| 大名县| 电白县| 芮城县| 靖西县| 休宁县| 郧西县| 海原县| 抚松县| 锦州市| 上高县| 永春县| 华安县| 三明市| 连城县|