基本流程
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);