Lucene4入门

来源:互联网 发布:淘宝上几十元的麦克风 编辑:程序博客网 时间:2024/06/05 18:45


Lucene4.4入门(1)

Lucene主要分为三大块:

1、创建索引

2、分词

3、读取并查询索引

我们今天的入门主要讲创建索引和读取查询索引,使用的Lucene的版本是4.4。

第一步:创建一个java工程添加lucene-core-4.4.0.jar、lucene-analyzers-common-4.4.0.jar和lucene-queryparser-4.4.0.jar三个jar文件

一个核心jar文件、一个标准分词文件和一个查询的jar文件。完成后的工程图如下:

第二步:在java工程中创建两个文件夹用来分别放原文件和索引文件(content、index)在content文件夹 中放一些txt文件,完成后的工程图:

第三步:创建一个java类命名为ReaderAndWriterIndex.java并创建两个方法,createindex()用来创建索引,searcher()用来查询,

代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package com.cqn;
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import org.apache.lucene.analysis.standard.StandardAnalyzer; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.document.Field; 
import org.apache.lucene.document.FieldType; 
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader; 
import org.apache.lucene.index.FieldInfo.IndexOptions;
import org.apache.lucene.index.IndexReader; 
import org.apache.lucene.index.IndexWriter; 
import org.apache.lucene.index.IndexWriterConfig; 
import org.apache.lucene.queryparser.classic.ParseException; 
import org.apache.lucene.queryparser.classic.QueryParser; 
import org.apache.lucene.search.IndexSearcher; 
import org.apache.lucene.search.Query; 
import org.apache.lucene.search.ScoreDoc; 
import org.apache.lucene.search.TopDocs; 
import org.apache.lucene.store.Directory; 
import org.apache.lucene.store.FSDirectory; 
import org.apache.lucene.util.Version;
public class ReaderAndWriterIndex { 
 public static void createindex(){ 
  IndexWriter writer = null;
        try 
            //创建Directory对象有多种方式,使用FSDirectory.open()创建它会选择最优的方式获得 
            //Directory对象,Directory实现类包括SimpleFSDirectory和RAMDirectory两个类 
            //其中RAMDirectory是在内存中创建索引对象 
            //1、创建Directory对象来保存索引,index为刚才创建的index目录 
            Directory dir = FSDirectory.open(new File("index"));
            //2、创建IndexWriter对象需要IndexWriterConfig和Analyzer对象,这里使用标准分词器 
            IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47, new StandardAnalyzer(Version.LUCENE_47)); 
            writer = new IndexWriter(dir, config);
            //3、创建Document对象 
            Document doc = null;
            File file = new File("content"); 
            //创建一个索引存储分词的FieldType 
            //在这里FieldType对象只是为了说明,下面并没有使用。 
            FieldType index_store_tokeniz = new FieldType(); 
            index_store_tokeniz.setIndexed(true); 
            index_store_tokeniz.setIndexOptions(IndexOptions.DOCS_ONLY); 
            index_store_tokeniz.setStored(true); 
            index_store_tokeniz.setTokenized(true); 
            index_store_tokeniz.freeze();
            for(File f : file.listFiles()){ 
                //4、根据索引内容创建Field对象并添加到Document中 
                doc = new Document();
                //为Documnet对象添加需要索引或保存的合适的Field对象 
                //TextField是一个索引分词可以存储的Field实现
                doc.add(new TextField("filename", f.getName(), Field.Store.YES));
                //StringField是一个索引可以存储但不分词的Field实现 
                doc.add(new StringField("filepath",f.getPath(),Field.Store.YES));
                //TextField是一个索引分词可以存储的Field实现
                //使用filename+Reader的构造是不存储的 
                doc.add(new TextField("content",new FileReader(f)));
                //6、把Document对象添加到IndexWriter对象中 
                writer.addDocument(doc); 
             }
        catch (IOException e) { 
            e.printStackTrace(); 
        finally
            try 
                if(writer != null){ 
                    //6、关闭IndexWriter对象 
                    writer.close(); 
                
            catch (IOException e) { 
                e.printStackTrace(); 
            
        
    }
    public static void searcher(){ 
        try 
         //1、创建Directory 
            Directory dir = FSDirectory.open(new File("index"));
            //2、创建IndexReader 
            IndexReader reader = DirectoryReader.open(dir); 
            //3、根据IndexReader创建IndexSearcher 
            IndexSearcher searcher = new IndexSearcher(reader); 
            //4、创建QueryParser 
            QueryParser parser = new QueryParser(Version.LUCENE_47, "content"new StandardAnalyzer(Version.LUCENE_47)); 
            //5、根据QueryParser创建Query,并传递需要查询的词 
            Query query = parser.parse("Lucene"); 
            //6、根据query使用IndexSearcher创建TopDocs 
            TopDocs tds = searcher.search(query, 10); 
            //7、通过TopDocs获得ScoreDoc对象 
            ScoreDoc[] sds = tds.scoreDocs; 
            for(ScoreDoc sd : sds){ 
                //8、通过IndexSearcher和ScoreDoc.doc获得Document对象 
                Document d = searcher.doc(sd.doc); 
                //9、关键Document对象获得值 
                System.out.println(d.get("filename") + "===" + d.get("filepath")); 
            
            //10、关闭IndexReader 
            reader.close(); 
        catch (IOException e) { 
             e.printStackTrace(); 
        catch (ParseException e) { 
             e.printStackTrace(); 
        
    
}

第四步:为工程添加JUnit并编写测试类测试上面的两个方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.cqn;
import org.junit.Test;
public class IndexReaderMethodTest { 
    /** 
     * 测试创建索引方法 
     * */ 
    @Test  
    public void testIndex(){ 
        ReaderAndWriterIndex.createindex(); 
    
    /** 
     * 测试查询索引方法 
     * */ 
    @Test  
    public void testReader(){ 
        ReaderAndWriterIndex.searcher(); 
    
}

首先执行indexTest()测试方法,运行完成后刷新java工程会在index目录中创建一些索引文件:

然后在执行查询方法会在控制台打印出包含Lucene词的文件,输出如图:

出处:http://my.oschina.net/MrMichael/blog/220684



0 0
原创粉丝点击