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