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)));

        

    }

}

 

你可能感兴趣的:(Lucene)