• Lucene自定义排序


     1 package com.lucene.search;
     2 
     3 import java.io.File;
     4 import java.io.FileNotFoundException;
     5 import java.io.FileReader;
     6 import java.io.IOException;
     7 
     8 import org.apache.lucene.document.Document;
     9 import org.apache.lucene.document.Field;
    10 import org.apache.lucene.document.NumericField;
    11 import org.apache.lucene.index.CorruptIndexException;
    12 import org.apache.lucene.index.IndexWriter;
    13 import org.apache.lucene.index.IndexWriterConfig;
    14 import org.apache.lucene.store.Directory;
    15 import org.apache.lucene.store.FSDirectory;
    16 import org.apache.lucene.util.Version;
    17 
    18 import com.chenlb.mmseg4j.Dictionary;
    19 import com.chenlb.mmseg4j.analysis.ComplexAnalyzer;
    20 
    21 public class IndexUtils {
    22 
    23     private static Directory directory=null;
    24     
    25     static{
    26         try {
    27             directory=FSDirectory.open(new File("E:/lucene/files"));
    28         } catch (IOException e) {
    29             e.printStackTrace();
    30         }
    31     }
    32     
    33     public static Directory getDirectory() {
    34         return directory;
    35     }
    36 
    37     /**
    38      * 创建索引
    39      */
    40     public static void createIndex(){
    41         IndexWriter writer=null;
    42         File file=new File("E:/lucene/resource");
    43         Document document=null;
    44         try {
    45             //创建IndexWriter   使用中文分词器
    46             Dictionary dic=Dictionary.getInstance(new File("F:/官方包/lucene-3.5.0/mmseg4j-1.8.5/data"));
    47             writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35,new ComplexAnalyzer(dic)));
    48             for(File f:file.listFiles()){
    49                 document=new Document();
    50                 document.add(new Field("filename", f.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
    51                 document.add(new Field("content",new FileReader(f)));
    52                 document.add(new NumericField("date", Field.Store.YES, true).setLongValue(f.lastModified()));
    53                 document.add(new NumericField("size", Field.Store.YES, false).setLongValue(f.length()/1000));
    54                 writer.addDocument(document);
    55             }
    56         } catch (FileNotFoundException e) {
    57             e.printStackTrace();
    58         } catch (CorruptIndexException e) {
    59             e.printStackTrace();
    60         } catch (IOException e) {
    61             e.printStackTrace();
    62         }finally{
    63             try {
    64                 writer.close();
    65             } catch (CorruptIndexException e) {
    66                 e.printStackTrace();
    67             } catch (IOException e) {
    68                 e.printStackTrace();
    69             }
    70         }
    71     }
    72     
    73 }
     1 package com.lucene.search;
     2 
     3 import java.io.IOException;
     4 import java.sql.Date;
     5 import java.text.SimpleDateFormat;
     6 
     7 import org.apache.lucene.analysis.standard.StandardAnalyzer;
     8 import org.apache.lucene.document.Document;
     9 import org.apache.lucene.index.CorruptIndexException;
    10 import org.apache.lucene.index.IndexReader;
    11 import org.apache.lucene.queryParser.ParseException;
    12 import org.apache.lucene.queryParser.QueryParser;
    13 import org.apache.lucene.search.IndexSearcher;
    14 import org.apache.lucene.search.Query;
    15 import org.apache.lucene.search.ScoreDoc;
    16 import org.apache.lucene.search.Sort;
    17 import org.apache.lucene.search.TopDocs;
    18 import org.apache.lucene.util.Version;
    19 
    20 public class SearchUtils {
    21 
    22     // 定义IndexReader,并使用静态块加载IndexReader
    23     private static IndexReader reader = null;
    24     static {
    25         try {
    26             reader = IndexReader.open(IndexUtils.getDirectory());
    27         } catch (CorruptIndexException e) {
    28             e.printStackTrace();
    29         } catch (IOException e) {
    30             e.printStackTrace();
    31         }
    32     }
    33 
    34     // 获取IndexSearcher
    35     private IndexSearcher getSearcher() {
    36         try {
    37             if (reader == null) {
    38                 reader = IndexReader.open(IndexUtils.getDirectory());
    39             } else {
    40                 IndexReader ir = IndexReader.openIfChanged(reader);
    41                 if (ir != null) {
    42                     reader.close();
    43                     reader = ir;
    44                 }
    45             }
    46             return new IndexSearcher(reader);
    47         } catch (CorruptIndexException e) {
    48             e.printStackTrace();
    49         } catch (IOException e) {
    50             e.printStackTrace();
    51         }
    52         return null;
    53     }
    54 
    55     /**
    56      * 排序查询
    57      * 
    58      * @param querystr
    59      *            查找匹配的字符串
    60      * @param domain
    61      *            查找内容的域
    62      * @param sort
    63      *            排序方式
    64      */
    65     public void SearchBySort(String querystr, String domain, Sort sort) {
    66         TopDocs docs = null;
    67         IndexSearcher searcher = this.getSearcher();
    68         try {
    69             QueryParser parser = new QueryParser(Version.LUCENE_35, domain,
    70                     new StandardAnalyzer(Version.LUCENE_35));
    71             Query query = parser.parse(querystr);
    72             if (sort == null) {
    73                 docs = searcher.search(query, 150);
    74             } else {
    75                 docs = searcher.search(query, 150, sort);
    76             }
    77 
    78             // 输出信息
    79             ScoreDoc[] sds = docs.scoreDocs;
    80             Document d = null;
    81             SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    82             for (ScoreDoc s : sds) {
    83                 d = searcher.doc(s.doc);
    84                 System.out.println(s.doc+"->"
    85                                     +s.score+"->"
    86                                     +d.get("filename")+"->"
    87                                     +d.get("size")+"->"
    88                                     +sdf.format(new Date(Long.valueOf(d.get("date")))));
    89             }
    90 
    91         } catch (ParseException e) {
    92             e.printStackTrace();
    93         } catch (IOException e) {
    94             e.printStackTrace();
    95         }
    96     }
    97 }
    package com.lucene.test;
    
    import org.apache.lucene.search.Sort;
    import org.apache.lucene.search.SortField;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.lucene.search.SearchUtils;
    
    public class TestSortSearch {
    
        private SearchUtils su=null;
        
        @Before
        public void init(){
            su=new SearchUtils();
        }
        
        @Test
        public void testSortSearch(){
            //无排序搜索,默认根据评分降序排序
            //su.SearchBySort("中国", "content", null);
            //通过doc的id进行排序
            //su.SearchBySort("中国", "content", Sort.INDEXORDER);
            //通过评分进行排序
            //su.SearchBySort("中国", "content", Sort.RELEVANCE);
            //根据SortField设置属性对filename进行升序排序
            //su.SearchBySort("中国", "content", new Sort(new SortField("filename", SortField.STRING)));
            //通过根据SortField设置最后一个属性进行降序排序
            su.SearchBySort("中国", "content", new Sort(new SortField("filename", SortField.STRING,true)));
            
        }
    }
  • 相关阅读:
    实验二
    实验一简单的加减乘除
    自我简介
    软件工程——第五次博客作业
    《软件测试》--第四次博客作业
    软件测试 第三次作业
    软件测试 第二次作业
    个人简介
    软件测试 第一次测评
    AE CC 装不上,安装程序检测到计算机重新启动的过程可能暂停。建议退出安装程序,重新启动计算机,然后再重试。
  • 原文地址:https://www.cnblogs.com/Laupaul/p/2464911.html
Copyright © 2020-2023  润新知