SortExtendTest.java
上传用户:cctqzzy
上传日期:2022-03-14
资源大小:12198k
文件大小:5k
源码类别:

搜索引擎

开发平台:

Java

  1. package chapter7;
  2. import org.apache.lucene.analysis.SimpleAnalyzer;
  3. import org.apache.lucene.document.Document;
  4. import org.apache.lucene.document.Field;
  5. import org.apache.lucene.index.IndexWriter;
  6. import org.apache.lucene.index.Term;
  7. import org.apache.lucene.search.FieldDoc;
  8. import org.apache.lucene.search.Hits;
  9. import org.apache.lucene.search.IndexSearcher;
  10. import org.apache.lucene.search.Query;
  11. import org.apache.lucene.search.ScoreDoc;
  12. import org.apache.lucene.search.Sort;
  13. import org.apache.lucene.search.SortField;
  14. import org.apache.lucene.search.TermQuery;
  15. import org.apache.lucene.search.TopFieldDocs;
  16. import org.apache.lucene.store.RAMDirectory;
  17. import java.io.IOException;
  18. // 测试自定义排序的实现,基本过程是使用IndexWriter创建内存索引,使用自定义的排序类
  19. // 构造Sort对象,得到的检索结果,使用search方法分别获得Hits对象和TopFieldDocs对象,
  20. // 进行简单排序测试和详细结果的输出。
  21. public class SortExtendTest {
  22. private RAMDirectory directory;
  23. private IndexSearcher searcher;
  24. private Query query;
  25. //建立测试环境
  26. protected void setUp() throws Exception {
  27. directory = new RAMDirectory();
  28. // 创建索引
  29. IndexWriter writer = new IndexWriter(directory,new SimpleAnalyzer(), true);
  30. // 添加文档
  31. addWare(writer, "苹果", "fruit", 2.5F, 2.0F,3.0F);   
  32. addWare(writer, "桔子", "fruit", 2.0F, 2.0F,3.0F);   
  33. addWare(writer, "香蕉", "fruit", 3.0F, 3.0F,3.0F);
  34. addWare(writer, "菠萝", "fruit", 4.5F, 5.0F,6.0F);
  35. writer.close();
  36. searcher = new IndexSearcher(directory);            // 创建检索器
  37. query = new TermQuery(new Term("type", "fruit"));   // 创建Query查询对象
  38. }
  39. /*================================================================
  40.  * 根据参数指定的索引器和参数,创建文档对象并添加到索引器对应的索引中
  41.  *================================================================*/
  42. private void addWare(IndexWriter writer, String name, String type, float last,float stat,float next) 
  43.  throws IOException {
  44. Document document = new Document(); // 创建文档对象
  45. // 创建域对象
  46.     Field fieldContent = new Field("name"   , name, Field.Store.YES, Field.Index.TOKENIZED);
  47.     Field fieldNumber  = new Field("type"   , type , Field.Store.YES, Field.Index.TOKENIZED);
  48.     Field fieldOrder   = new Field("prices" , last + "," + stat +"," + next , 
  49.                              Field.Store.YES, Field.Index.UN_TOKENIZED);
  50.     document.add(fieldContent);         // 添加创建的名字域到当前文档
  51.     document.add(fieldNumber);          // 添加创建的文本域到当前文档
  52.     document.add(fieldOrder);           // 添加创建的文本域到当前文档
  53.     writer.addDocument(document);       // 完成的文档添加到索引
  54. }
  55. /*================================================================
  56.  * 测试自定义排序,简单利用结果的Hits对象,获取排序最大、最小结果
  57.  *================================================================*/
  58. public void simplesorttest() throws Exception {
  59. //使用SortExtendSearch构造一个SortField,作为域排序对象的参数
  60. Sort sort = new Sort(new SortField("prices",new SortExtendSearch()));
  61. Hits hits = searcher.search(query, sort); // 按照自定义匹配检索
  62. int ihitsmax = hits.length() - 1;                  // 最大长度
  63. System.out.println("===========简单自定义排序测试===================");
  64. System.out.println("匹配文档数目 :" + hits.length());
  65. System.out.println("价格最平稳  :" +  hits.doc(0).get("name") + hits.doc(0).get("prices") );
  66. System.out.println("价格波动大  :" +  hits.doc(ihitsmax).get("name") + hits.doc(ihitsmax).get("prices") );
  67. System.out.println("");
  68. }
  69. /*================================================================
  70.  * 测试自定义排序,利用TopFieldDocs 进一步访问相关信息
  71.  *================================================================*/
  72. public void detailsorttest() throws Exception {
  73. Sort sort = new Sort(new SortField("prices",                // 排序对象域
  74.    new SortExtendSearch(0, 0 , 0))); 
  75. TopFieldDocs docs = searcher.search(query, null, 5, sort);  // 搜索索引,获得TopFieldDocs集合
  76. System.out.println("===========详细自定义排序测试===================");
  77. System.out.println( "匹配文档个数 :" + docs.totalHits );
  78. System.out.println( "评分文档个数 :" + docs.scoreDocs.length );
  79. displayDocs(sort, docs); // 显示相关信息
  80. }
  81. /*================================================================
  82.  * 利用ScoreDoc对象显示有关排序的信息
  83.  *================================================================*/
  84. private void displayDocs(Sort sort, TopFieldDocs docs) throws IOException {
  85. System.out.println("排序字段 : " + sort);                  // 输出排序字段
  86. ScoreDoc[] scoreDocs = docs.scoreDocs;                   // 获取scoreDoc数组
  87. for (int i = 0; i < scoreDocs.length; i++) {             // 循环处理每一个结果
  88. FieldDoc fieldDoc = (FieldDoc) scoreDocs[i];         // 获得FieldDoc对象
  89. Float prices = (Float) fieldDoc.fields[0];           // 获取价格波动数值
  90. Document document = searcher.doc(fieldDoc.doc);      // 取得文档句柄
  91. System.out.println(" " + document.get("name") + " @ ("
  92. + document.get("prices") + ") -> " + prices);
  93. }
  94. }
  95. public static void main(String[] args) throws IOException{
  96. try{
  97. SortExtendTest test = new SortExtendTest();   // 排序测试对象初始化
  98. test.setUp();                                 // 初始化自定义文档
  99. test.simplesorttest();                        // 简单自定义排序测试
  100. test.detailsorttest();                        // 详细自定义排序测试
  101. } catch (Exception e){
  102. ;
  103. }
  104. }
  105. }