⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sortextendtest.java

📁 Lucene+nuctch一书的全部源码 测试源码 和几个简单的项目
💻 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 + -