1.Lucene高级查询

来源:互联网 发布:手机上怎样开淘宝网店 编辑:程序博客网 时间:2024/05/08 13:40

1.Lucene高级查询
~1.自定义排序
 @Test
 public void test(){
  try {
   Directory directory=Util.getDirectory();
   IndexReader indexReader=Util.IndexReaderUtil(directory);
   
   IndexSearcher indexSearcher=new IndexSearcher(indexReader);
   
   QueryParser parser=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
   
   Query query=parser.parse("Java");
   
   Sort sort=new Sort();
   //这是排序的操作点
   TopDocs topDocs=indexSearcher.search(query, 100);
   //根据doc的ID来排序
   topDocs=indexSearcher.search(query, 100,sort.INDEXORDER);
   //根据默认评分来排序
   topDocs=indexSearcher.search(query, 100,sort.RELEVANCE);
   //根据ID的大小来排序  倒排true表示是否倒置
   topDocs=indexSearcher.search(query, 100,new Sort(new SortField("id", SortField.INT,true)));
   //根据ID的大小来排序和文件名称
   topDocs=indexSearcher.search(query, 100,new Sort(new SortField("id", SortField.INT),new SortField("filename", SortField.STRING)));
   ScoreDoc[] docs=topDocs.scoreDocs;
   System.out.println("总数:"+topDocs.totalHits);
   for (int i = 0; i < docs.length; i++) {
    //7.根据searcher和ScoreDoc对象获取具体Document对象
    Document d=indexSearcher.doc(docs[i].doc);
    //8.根据document对象获取需要的值
    System.out.println("id:"+d.get("id")+"boot:"+d.getBoost()+d.get("filename")+"["+d.get("path")+"]");
   }
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
=================================================================================
~2.自定义评分查询
    /**
  * 自定义评分查询
  * 1.创建一个类实现CustomScoreQuery
  * 2.实现getCustomScoreProvider(IndexReader reader)方法
  * 3.创建一个类实现CustomScoreProvider
  * 4. float customScore(int doc, float subQueryScore, float valSrcScore)中写评分规则
  */
    @Test
 public void test1(){
  try {
   Directory directory=Util.getDirectory();
   IndexReader indexReader=Util.IndexReaderUtil(directory);
   
   IndexSearcher indexSearcher=new IndexSearcher(indexReader);
   
   QueryParser parser=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
   
   Query query=parser.parse("Java");
   //定义一个评分查询器
   FieldScoreQuery scoreQuery=new FieldScoreQuery("id",org.apache.lucene.search.function.FieldScoreQuery.Type.INT);
   //根据评分域和原来的query来构造一个query对象
   myCustomScoreQuery customScoreQuery=new myCustomScoreQuery(query,scoreQuery);
   TopDocs topDocs=indexSearcher.search(customScoreQuery, 100);
   
   ScoreDoc[] docs=topDocs.scoreDocs;
   System.out.println("总数:"+topDocs.totalHits);
   for (int i = 0; i < docs.length; i++) {
    //7.根据searcher和ScoreDoc对象获取具体Document对象
    Document d=indexSearcher.doc(docs[i].doc);
    //8.根据document对象获取需要的值
    System.out.println("id:"+d.get("id")+"boot:"+d.getBoost()+d.get("filename")+"["+d.get("path")+"]");
   }
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 public class myCustomScoreQuery extends org.apache.lucene.search.function.CustomScoreQuery{

  
  public myCustomScoreQuery(Query subQuery, ValueSourceQuery valSrcQuery) {
   super(subQuery, valSrcQuery);
   
  }

  @Override
  protected CustomScoreProvider getCustomScoreProvider(IndexReader reader)
    throws IOException {
   // TODO Auto-generated method stub
   return new myCustomScoreProvider(reader);
  }
 }
 
 public class myCustomScoreProvider extends CustomScoreProvider{
  String[] filenames=null;
  public myCustomScoreProvider(IndexReader reader) {
   super(reader);
  }

  @Override
  public float customScore(int doc, float subQueryScore, float valSrcScore)
    throws IOException {
   // TODO Auto-generated method stub
   System.out.println("score:"+subQueryScore*valSrcScore);
   return subQueryScore/valSrcScore;
  }
  
 }
 
 //------------------------------------------------------------------------------------------
 @Test
 public void test2(){
  try {
   Directory directory=Util.getDirectory();
   IndexReader indexReader=Util.IndexReaderUtil(directory);
   
   IndexSearcher indexSearcher=new IndexSearcher(indexReader);
   
   QueryParser parser=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
   
   Query query=parser.parse("Java");
   //定义一个评分查询器
   FieldScoreQuery scoreQuery=new FieldScoreQuery("id",org.apache.lucene.search.function.FieldScoreQuery.Type.INT);
   //根据评分域和原来的query来构造一个query对象
   myFileCustomScoreQuery customScoreQuery=new myFileCustomScoreQuery(query,scoreQuery);
   TopDocs topDocs=indexSearcher.search(customScoreQuery, 100);
   
   ScoreDoc[] docs=topDocs.scoreDocs;
   System.out.println("总数:"+topDocs.totalHits);
   for (int i = 0; i < docs.length; i++) {
    //7.根据searcher和ScoreDoc对象获取具体Document对象
    Document d=indexSearcher.doc(docs[i].doc);
    //8.根据document对象获取需要的值
    System.out.println("id:"+d.get("id")+"boot:"+d.getBoost()+d.get("filename")+"["+d.get("path")+"]");
   }
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 public class myFileCustomScoreQuery extends org.apache.lucene.search.function.CustomScoreQuery{

  
  public myFileCustomScoreQuery(Query subQuery, ValueSourceQuery valSrcQuery) {
   super(subQuery, valSrcQuery);
   
  }

  @Override
  protected CustomScoreProvider getCustomScoreProvider(IndexReader reader)
    throws IOException {
   // TODO Auto-generated method stub
   return new myFileCustomScoreProvider(reader);
  }
 }
 
 public class myFileCustomScoreProvider extends CustomScoreProvider{
  String[] filenames=null;
  public myFileCustomScoreProvider(IndexReader reader) {
   super(reader);
   try {
    //得到缓存中的filename数据
    filenames=FieldCache.DEFAULT.getStrings(reader, "filename");
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

  @Override
  public float customScore(int doc, float subQueryScore, float valSrcScore)
    throws IOException {
   if(filenames[doc]!=null){
    //将一些.txt和.ssh结尾的文件放到前面
    if(filenames[doc].endsWith(".txt")||filenames[doc].endsWith(".ssh")){
     System.out.println("subQueryScore:"+subQueryScore);
     return subQueryScore*11.5f;
    }
    System.out.println("subQueryScore:"+subQueryScore);
   }
   return subQueryScore/11.5f;
  }
  
 }

0 0
原创粉丝点击