zoukankan      html  css  js  c++  java
  • Lucene自定义评分查询

      1 package com.lucene.score;
      2 
      3 import java.io.IOException;
      4 import java.sql.Date;
      5 import java.text.SimpleDateFormat;
      6 
      7 import org.apache.lucene.document.Document;
      8 import org.apache.lucene.index.CorruptIndexException;
      9 import org.apache.lucene.index.IndexReader;
     10 import org.apache.lucene.index.Term;
     11 import org.apache.lucene.search.FieldCache;
     12 import org.apache.lucene.search.IndexSearcher;
     13 import org.apache.lucene.search.Query;
     14 import org.apache.lucene.search.ScoreDoc;
     15 import org.apache.lucene.search.TermQuery;
     16 import org.apache.lucene.search.TopDocs;
     17 import org.apache.lucene.search.function.CustomScoreProvider;
     18 import org.apache.lucene.search.function.CustomScoreQuery;
     19 import org.apache.lucene.search.function.FieldScoreQuery;
     20 import org.apache.lucene.search.function.FieldScoreQuery.Type;
     21 import org.apache.lucene.search.function.ValueSourceQuery;
     22 
     23 import com.lucene.search.IndexUtils;
     24 
     25 public class MyCustomScore {
     26     public void searchByScoreQuery() {
     27         try {
     28             IndexSearcher searcher = new IndexSearcher(
     29                     IndexReader.open(IndexUtils.getDirectory()));
     30             Query q = new TermQuery(new Term("content", "1"));
     31             // 1.创建评分域
     32             FieldScoreQuery fieldScoreQuery = new FieldScoreQuery("size",
     33                     Type.INT);
     34             // 2.根据评分域和原有的query创建自定义的query对象
     35             // 2.1 创建MyCustomScoreQuery继承CustomScoreQuery
     36             // 2.2重写getCustomScoreProvider方法
     37             // 2.3创建MyCustomScoreProvider继承CustomScoreProvider
     38             // 2.4重写customScore方法,自定义评分算法
     39             MyCustomScoreQuery query = new MyCustomScoreQuery(q,
     40                     fieldScoreQuery);
     41             TopDocs docs=searcher.search(query, 30);
     42             // 输出信息
     43             ScoreDoc[] sds = docs.scoreDocs;
     44             Document d = null;
     45             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
     46             for (ScoreDoc s : sds) {
     47                 d = searcher.doc(s.doc);
     48                 System.out.println(s.doc + "->" + s.score + "->"
     49                         + d.get("filename") + "->" + d.get("size") + "->"
     50                         + sdf.format(new Date(Long.valueOf(d.get("date")))));
     51             }
     52 
     53         } catch (CorruptIndexException e) {
     54             e.printStackTrace();
     55         } catch (IOException e) {
     56             e.printStackTrace();
     57         }
     58     }
     59 }
     60 
     61 @SuppressWarnings("serial")
     62 class MyCustomScoreQuery extends CustomScoreQuery {
     63 
     64     public MyCustomScoreQuery(Query subQuery, ValueSourceQuery valSrcQuery) {
     65         super(subQuery, valSrcQuery);
     66     }
     67 
     68     @Override
     69     protected CustomScoreProvider getCustomScoreProvider(IndexReader reader)
     70             throws IOException {
     71         // 默认情况评分是根据原有的评分*传入进来的评分
     72         //return super.getCustomScoreProvider(reader);
     73         
     74         return new MyCustomScoreProvider(reader);
     75     }
     76 }
     77 
     78 class MyCustomScoreProvider extends CustomScoreProvider {
     79 
     80     String[] filenames = null;
     81 
     82     public MyCustomScoreProvider(IndexReader reader) {
     83         super(reader);
     84         try {
     85             filenames = FieldCache.DEFAULT.getStrings(reader, "filename");
     86         } catch (IOException e) {
     87             e.printStackTrace();
     88         }
     89     }
     90 
     91     @Override
     92     public float customScore(int doc, float subQueryScore, float valSrcScore)
     93             throws IOException {
     94         // 根据doc获取文件名
     95         String filename = filenames[doc];
     96         //判断文件后缀是否为txt结尾,是把评分*10  否则/10
     97         if (filename.endsWith(".txt")) {
     98             return subQueryScore * 10;
     99         } else {
    100             return subQueryScore / 10;
    101         }
    102     }
    103 }
        @Test
        public void test01(){
            MyCustomScore score=new MyCustomScore();
            score.searchByScoreQuery();
        }
  • 相关阅读:
    zabbix邮件报警设置(加密)
    Linux实战(10):ssh密码被拒绝
    Linux实战(9):Docker一键搭建kms服务
    Linux实战(8):查看文件大小
    Linux实战(7):centos7安装xrdp
    Linux实战(6):Centos8上传镜像
    Linux实战(5):Centos8安装python
    Linux实战(4):Centos7升级python
    nginx实战(1):宝塔设置反向代理
    Dell服务器R710修改iDRAC密码
  • 原文地址:https://www.cnblogs.com/Laupaul/p/2465046.html
Copyright © 2011-2022 走看看