SortExtendTest.java
上传用户:cctqzzy
上传日期:2022-03-14
资源大小:12198k
文件大小:5k
- 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){
- ;
- }
- }
- }