lucene学习笔记2-查询索引

来源:互联网 发布:javascript动态特效 编辑:程序博客网 时间:2024/06/10 10:05
import java.io.File;import java.io.FileReader;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.index.IndexReader;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.queryParser.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 HelloLucene{    /**     * 创建index方法     */    public void index()    {        // IndexWriter使用完毕必须close        IndexWriter writer = null;        try        { // 1、创建directory            // 在内存中 Directory directory            // = new RAMDirectory();            // 硬盘中创建索引            Directory directory = FSDirectory.open(new File("D:\\workspace\\helloLucene\\helloIndex\\"));            // 2、创建IndexWriter            // 通过该对象写索引,设置版本号,和创建一个标准的分词器。            IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35,                                                          new StandardAnalyzer(Version.LUCENE_35));            writer = new IndexWriter(directory, iwc);            // 3、创建document对象,索引文档或数据库表,文档(路径、大小、文件名等等)或数据表中的每一个属性都是field            Document doc = null;            // 4、遍历要索引的文件,并为document添加field            File f = new File("D:\\workspace\\helloLucene\\doc");            for (File file : f.listFiles())            {                doc = new Document();                // 添加文件内容                doc.add(new Field("content", new FileReader(file)));                // 添加文件名称,Field.Store.YES把文件全名存储到索引中,Field.Index.NOT_ANALYZED是否进行分词(文件名不需要分词)                doc.add(new Field("filename",                                  file.getName(),                                  Field.Store.YES,                                  Field.Index.NOT_ANALYZED));                // 添加文件路径,Field.Store.YES把文件全名存储到硬盘,Field.Index.NOT_ANALYZED是否进行分词(文件名不需要分词)                doc.add(new Field("path",                                  file.getAbsolutePath(),                                  Field.Store.YES,                                  Field.Index.NOT_ANALYZED));                // 5、通过indexWriter添加文档到索引中。                writer.addDocument(doc);            }        }        catch (Exception e)        {            e.printStackTrace();        }        finally        {            try            {                if (writer != null)                {                    writer.close();                }            }            catch (Exception e)            {                e.printStackTrace();            }        }    }    /**     * 搜索     */    public void searcher()    {        try        {            // 1、创建directory,在什么地方搜索            Directory directory = FSDirectory.open(new File("D:\\workspace\\helloLucene\\helloIndex\\"));            // 2、创建IndexReader            IndexReader reader = IndexReader.open(directory);            // 3、根据IndexReader创建IndexSearcher            IndexSearcher searcher = new IndexSearcher(reader);            // 4、创建搜索的Parser来确定搜索文件的内容,通过该对象查索引,设置版本号,搜索的域(字段),和创建一个标准的分词器            QueryParser parser = new QueryParser(Version.LUCENE_35,                                                 "content",                                                 new StandardAnalyzer(Version.LUCENE_35));            // 创建query,表示搜索域为content中包含java的文档            Query query = parser.parse("java");            // 5、根据searcher搜索并返回TopDocs,返回10条            TopDocs tds = searcher.search(query, 10);            // 6、根据TopDocs获取ScoreDoc属性数组            ScoreDoc[] sds = tds.scoreDocs;            for (ScoreDoc sd : sds)            {                // 7、根据searcher和ScordDoc对象获取具体的document对象                Document d = searcher.doc(sd.doc);                // 8、根据document对象获取需要的值                System.out.println(d.get("filename") + " " + d.get("path"));            }            reader.close();        }        catch (Exception e)        {            e.printStackTrace();        }    }    public static void main(String[] args)    {        HelloLucene hl = new HelloLucene();       // hl.index();        hl.searcher();        System.out.println("end..");    }}


输出:

RUNNING.txt D:\workspace\helloLucene\doc\RUNNING.txt
end..