• Lucene 排序 Sort与SortField


     在sql语句中,有升序和降序排列。在Lucene中,同样也有。

    Sort里的属性 SortField里的属性 含义
    Sort.INDEXORDER SortField.FIELD_DOC 按照索引的顺序进行排序
    Sort.RELEVANCE SortField.FIELD_SCORE 按照关联性评分进行排序
    =========SortField类============
    //field是排序字段type是排序类型
    public SortField(String field, Type type);
    //field是排序字段type是排序类型reverse是指定升序还是降序
    //reverse 为true是降序  false为升序
    public SortField(String field, Type type, boolean reverse)
    
    =========Sort类============
    public Sort();//Sort对象构造方法默认是按文档评分排序
    public Sort(SortField field);//排序的一个SortField
    public Sort(SortField... fields)//排序的多个SortField可以传入一个数组

    前提,创建索引:

     1 import java.io.File;
     2 import java.io.FileReader;
     3 import java.io.IOException;
     4 import java.nio.file.Paths;
     5 import java.util.Random;
     6 
     7 import org.apache.lucene.analysis.standard.StandardAnalyzer;
     8 import org.apache.lucene.document.Document;
     9 import org.apache.lucene.document.Field;
    10 import org.apache.lucene.document.IntField;
    11 import org.apache.lucene.document.LongField;
    12 import org.apache.lucene.document.NumericDocValuesField;
    13 import org.apache.lucene.index.IndexWriter;
    14 import org.apache.lucene.index.IndexWriterConfig;
    15 import org.apache.lucene.store.Directory;
    16 import org.apache.lucene.store.FSDirectory;
    17 
    18 public class FileIndexUtils {
    19     private static Directory directory = null;
    20     static{
    21         try {
    22             directory = FSDirectory.open(Paths.get("D://lucene//document"));
    23         } catch (Exception e) {
    24             // TODO: handle exception
    25             e.printStackTrace();
    26         }
    27     }
    28     public static Directory getDirectory(){
    29         return directory;
    30     }
    31     /**
    32      * 创建索引
    33      * @param hasNew
    34      */
    35     @SuppressWarnings("deprecation")
    36     public static void createIndex(boolean hasNew){
    37         IndexWriter writer = null;
    38         try {
    39             writer = new IndexWriter(directory, new IndexWriterConfig(new StandardAnalyzer()));
    40             if(hasNew){
    41                 writer.deleteAll();
    42             }
    43         
    44             Document document = null;
    45             int index = 0;
    46             //随机数,为排序数字
    47             Random random = new Random();
    48             //为源文件创建索引
    49             File file = new File("D://text");
    50             for(File f:file.listFiles()){
    51                 int score = random.nextInt();
    52                 document = new Document();
    53                 document.add(new Field("id",String.valueOf(index++), Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
    54                 document.add(new Field("content",new FileReader(f)));
    55                 document.add(new Field("fileName",f.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED));
    56                 document.add(new Field("path",f.getPath(),Field.Store.YES,Field.Index.NOT_ANALYZED));
    57                 document.add(new IntField("score",score,Field.Store.YES));
    58                 document.add(new NumericDocValuesField("size",(long)f.length()));
    59                 document.add(new LongField("size", f.length(), Field.Store.YES));
    60                 document.add(new IntField("date",(int) f.lastModified(),Field.Store.YES));
    61                 writer.addDocument(document);
    62             }        
    63         } catch (Exception e) {
    64             // TODO: handle exception
    65             e.printStackTrace();
    66         }finally{
    67             if(writer!=null){
    68                 try {
    69                     writer.close();
    70                 } catch (IOException e) {
    71                     // TODO Auto-generated catch block
    72                     e.printStackTrace();
    73                 }
    74             }
    75         }
    76     }
    77 }
    View Code

    一,Sort排序

    getSearcher()

     1 private static IndexReader reader = null;
     2     static{
     3         try {
     4             reader = DirectoryReader.open(FileIndexUtils.getDirectory());
     5         } catch (Exception e) {
     6             // TODO: handle exception
     7             e.printStackTrace();
     8         }
     9     }
    10     
    11     public IndexSearcher getSearcher(){
    12         try {
    13             if(reader == null){
    14                 reader = DirectoryReader.open(FileIndexUtils.getDirectory());
    15             }else{
    16                 IndexReader tr = DirectoryReader.openIfChanged((DirectoryReader) reader);
    17                 if(tr!=null) {
    18                     reader.close();
    19                     reader = tr;
    20                 }
    21             }
    22             return new IndexSearcher(reader);
    23         } catch (Exception e) {
    24             // TODO: handle exception
    25             e.printStackTrace();
    26         }
    27         return null;
    28     }
    View Code
       /**
         * 排序Sort
         * @param queryStr
         * @param sort
         */
        public void searcherBySort(String queryStr,Sort sort) {
            try {
                IndexSearcher searcher = getSearcher();
                QueryParser parser = new QueryParser("content",new StandardAnalyzer());
                Query query = parser.parse(queryStr);
                TopDocs tds = null;
                if(sort!=null)
                    tds = searcher.search(query, 50, sort);
                else {
                    tds = searcher.search(query, 50);
                }
                for(ScoreDoc sd:tds.scoreDocs) {
                    Document d = searcher.doc(sd.doc);
                    System.out.println(sd.doc+":("+sd.score+")" +
                            "["+d.get("fileName")+"【"+d.get("path")+"】---"+d.get("score")+"--->"+
                            Integer.valueOf(d.get("size"))/1024+"-----");
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            } 
        }

    测试:

        @Test
        public void test01(){
            st.searcherBySort("select",Sort.RELEVANCE);
            System.out.println("------------");
            st.searcherBySort("select",null);
        }

    二、SortField

    /**
         * 排序SortField
         * @param sortField
         * @param reverse
         */
        public void searcherBySortField(String filename,boolean reverse){
            try {
                IndexSearcher searcher = getSearcher();
                SortField sortField = new SortField(filename,SortField.Type.LONG,reverse);
                Sort sort = new Sort(sortField);
                
                TopDocs tds = searcher.search(new MatchAllDocsQuery(),100,sort);
                for(ScoreDoc sd:tds.scoreDocs){
                    Document d = searcher.doc(sd.doc);
                    System.out.println("["+d.get("fileName")+"]【"+d.get("path")+"】---score:"+d.get("score")+"--->"+"size:"+d.get("size"));
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally{
                try {
                    if(reader!=null){
                        reader.close();
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    测试:

        @Test
        public void test02(){
            st.searcherBySortField("size", false);
            System.out.println("------------");
        }

    size根据大小排序。

  • 相关阅读:
    5G NR系列(四)物理下行共享信道(PDSCH)物理层过程详解
    5G NR系列(三)PDSCH的解调参考信号(DM-RS)
    Mac上重装pycharm打不开的解决方法
    Oracle parallel理解
    V$ASM_DISKGROUP视图信息解读
    深入了解 Oracle Flex ASM 及其优点
    使用typora和印象笔记高效输出
    Centos7.6部署k8s 集群
    DBA日常职责
    利用DCLI命令实现跨机器检查
  • 原文地址:https://www.cnblogs.com/invban/p/6226250.html
Copyright © 2020-2023  润新知