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

搜索引擎

开发平台:

Java

  1. package chapter7;
  2. import org.apache.lucene.index.Term;
  3. import org.apache.lucene.index.TermEnum;
  4. import org.apache.lucene.index.TermDocs;
  5. import org.apache.lucene.search.ScoreDoc;
  6. import org.apache.lucene.search.SortField;
  7. import org.apache.lucene.index.IndexReader;
  8. import org.apache.lucene.search.SortComparatorSource;
  9. import org.apache.lucene.search.ScoreDocComparator;
  10. import java.io.IOException;
  11. // SortExtendSearch 实现SortComparatorSource接口,用来测试自定义排序,
  12. // 根据索引中的不同水果历史价格变化情况,按照价格波动的大小进行排序
  13. public class SortExtendSearch implements SortComparatorSource {
  14. private float last;  // 历史价格
  15. private float stat;  // 当前价格
  16. private float next;  // 预测价格
  17. // 默认构造函数
  18. public SortExtendSearch(){  
  19. this.last = 0;
  20. this.next = 0;
  21. this.stat = 0;
  22. }
  23. // 带输入参数的构造函数
  24. public SortExtendSearch(float last,float stat, float next) {
  25. this.last = last;
  26. this.stat = stat;
  27. this.next = next;
  28. }
  29. /*================================================================
  30.  * 返回ScoreDocComparator 用来实现排序功能
  31.  *================================================================*/
  32. public ScoreDocComparator newComparator(IndexReader reader, String sortname)
  33. throws IOException {
  34. return new PriceScoreDocComparator(reader, sortname, last,stat, next);
  35. }
  36. /*================================================================
  37.  * PriceScoreDocComparator 实现了ScoreDocComparator 用来对价格浮动情况进行排序
  38.  *================================================================*/
  39. private static class PriceScoreDocComparator implements ScoreDocComparator {
  40. private float[] markup; // 保存每个商品历史价格波动幅度
  41. // 实现了ScoreDocComparator接口的构造函数
  42. public PriceScoreDocComparator(IndexReader reader,String sortname, float last,float stat, float next) 
  43.  throws IOException {
  44. final TermEnum enumerator = reader.terms(new Term(sortname, "")); // 索引项枚举器
  45. markup = new float[reader.maxDoc()];              // 初始化markup数组
  46. if (markup.length > 0) {
  47. TermDocs termDocs = reader.termDocs();
  48. try {
  49. if (enumerator.term() == null) {
  50. throw new RuntimeException("no terms in field " + sortname);
  51. }
  52. int i = 0,j = 0;
  53. do {
  54. Term term = enumerator.term();   // 取出每一个Term 
  55. if (term.field() != sortname)    // 与给定的域不符合则停止比较
  56. break;
  57. termDocs.seek(enumerator);       // 定位枚举器
  58. while (termDocs.next()) {        // 循环取枚举器内每一个TermDocs
  59. String[] pricedis = term.text().split(","); 
  60. float price1 = Float.parseFloat( pricedis[0] ) - last;
  61. float price2 = Float.parseFloat( pricedis[1] ) - stat;
  62. float price3 = Float.parseFloat( pricedis[2] ) - next;
  63. // 计算价格变动幅度
  64. markup[termDocs.doc()] = (price3 - price2) - (price2 - price1) ;
  65. }
  66. } while (enumerator.next());
  67. } finally {
  68. termDocs.close();
  69. }
  70. }
  71. }
  72. // 定义排序的比较函数
  73. public int compare(ScoreDoc i, ScoreDoc j) {
  74. if (markup[i.doc] < markup[j.doc])
  75. return -1;
  76. if (markup[i.doc] > markup[j.doc])
  77. return 1;
  78. return 0;
  79. }
  80. // 返回排序的结果
  81. public Comparable sortValue(ScoreDoc data) {
  82. return new Float(markup[data.doc]);
  83. }
  84. // 指定接口的排序类型
  85. public int sortType() {
  86. return SortField.FLOAT;
  87. }
  88. }
  89. // 输出对象的内部变量
  90. public String toString() {
  91. return "Price makeup (" + last + "," + stat+ "," + next + ")";
  92. }
  93. // 测试方法
  94. public static void main(String[] args) throws IOException{
  95. SortExtendSearch sortext = new SortExtendSearch();
  96. System.out.println(sortext.toString());
  97. }
  98. }