?? sortextendtest.java
字號:
package chapter7;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.FieldDoc;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopFieldDocs;
import org.apache.lucene.store.RAMDirectory;
import java.io.IOException;
// 測試自定義排序的實現,基本過程是使用IndexWriter創建內存索引,使用自定義的排序類
// 構造Sort對象,得到的檢索結果,使用search方法分別獲得Hits對象和TopFieldDocs對象,
// 進行簡單排序測試和詳細結果的輸出。
public class SortExtendTest {
private RAMDirectory directory;
private IndexSearcher searcher;
private Query query;
//建立測試環境
protected void setUp() throws Exception {
directory = new RAMDirectory();
// 創建索引
IndexWriter writer = new IndexWriter(directory,new SimpleAnalyzer(), true);
// 添加文檔
addWare(writer, "蘋果", "fruit", 2.5F, 2.0F,3.0F);
addWare(writer, "桔子", "fruit", 2.0F, 2.0F,3.0F);
addWare(writer, "香蕉", "fruit", 3.0F, 3.0F,3.0F);
addWare(writer, "菠蘿", "fruit", 4.5F, 5.0F,6.0F);
writer.close();
searcher = new IndexSearcher(directory); // 創建檢索器
query = new TermQuery(new Term("type", "fruit")); // 創建Query查詢對象
}
/*================================================================
* 根據參數指定的索引器和參數,創建文檔對象并添加到索引器對應的索引中
*================================================================*/
private void addWare(IndexWriter writer, String name, String type, float last,float stat,float next)
throws IOException {
Document document = new Document(); // 創建文檔對象
// 創建域對象
Field fieldContent = new Field("name" , name, Field.Store.YES, Field.Index.TOKENIZED);
Field fieldNumber = new Field("type" , type , Field.Store.YES, Field.Index.TOKENIZED);
Field fieldOrder = new Field("prices" , last + "," + stat +"," + next ,
Field.Store.YES, Field.Index.UN_TOKENIZED);
document.add(fieldContent); // 添加創建的名字域到當前文檔
document.add(fieldNumber); // 添加創建的文本域到當前文檔
document.add(fieldOrder); // 添加創建的文本域到當前文檔
writer.addDocument(document); // 完成的文檔添加到索引
}
/*================================================================
* 測試自定義排序,簡單利用結果的Hits對象,獲取排序最大、最小結果
*================================================================*/
public void simplesorttest() throws Exception {
//使用SortExtendSearch構造一個SortField,作為域排序對象的參數
Sort sort = new Sort(new SortField("prices",new SortExtendSearch()));
Hits hits = searcher.search(query, sort); // 按照自定義匹配檢索
int ihitsmax = hits.length() - 1; // 最大長度
System.out.println("===========簡單自定義排序測試===================");
System.out.println("匹配文檔數目 :" + hits.length());
System.out.println("價格最平穩 :" + hits.doc(0).get("name") + hits.doc(0).get("prices") );
System.out.println("價格波動大 :" + hits.doc(ihitsmax).get("name") + hits.doc(ihitsmax).get("prices") );
System.out.println("");
}
/*================================================================
* 測試自定義排序,利用TopFieldDocs 進一步訪問相關信息
*================================================================*/
public void detailsorttest() throws Exception {
Sort sort = new Sort(new SortField("prices", // 排序對象域
new SortExtendSearch(0, 0 , 0)));
TopFieldDocs docs = searcher.search(query, null, 5, sort); // 搜索索引,獲得TopFieldDocs集合
System.out.println("===========詳細自定義排序測試===================");
System.out.println( "匹配文檔個數 :" + docs.totalHits );
System.out.println( "評分文檔個數 :" + docs.scoreDocs.length );
displayDocs(sort, docs); // 顯示相關信息
}
/*================================================================
* 利用ScoreDoc對象顯示有關排序的信息
*================================================================*/
private void displayDocs(Sort sort, TopFieldDocs docs) throws IOException {
System.out.println("排序字段 : " + sort); // 輸出排序字段
ScoreDoc[] scoreDocs = docs.scoreDocs; // 獲取scoreDoc數組
for (int i = 0; i < scoreDocs.length; i++) { // 循環處理每一個結果
FieldDoc fieldDoc = (FieldDoc) scoreDocs[i]; // 獲得FieldDoc對象
Float prices = (Float) fieldDoc.fields[0]; // 獲取價格波動數值
Document document = searcher.doc(fieldDoc.doc); // 取得文檔句柄
System.out.println(" " + document.get("name") + " @ ("
+ document.get("prices") + ") -> " + prices);
}
}
public static void main(String[] args) throws IOException{
try{
SortExtendTest test = new SortExtendTest(); // 排序測試對象初始化
test.setUp(); // 初始化自定義文檔
test.simplesorttest(); // 簡單自定義排序測試
test.detailsorttest(); // 詳細自定義排序測試
} catch (Exception e){
;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -