📄 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 + -