Lucene的一个简单的标准测试(Lucene包基于3.5版本的)
Lucene编程一般分为:索引、分词、搜索
索引源代码:
package lucene的一个标准测试; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.Date; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class TextFileIndexer { public static void main(String[] args) throws Exception { // 需要索引的源文件位置 File fileDir = new File("E:\\Lucene\\source"); // 存放索引的文件位置 File indexDir = new File("E:\\Lucene\\index"); // 把索引建立在硬盘中 Directory dir = FSDirectory.open(indexDir); // 建立一个标准分词器 Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_35); // IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35, luceneAnalyzer); // 每次执行都是创建新的索引而不是追加索引 iwc.setOpenMode(OpenMode.CREATE); // 创建一个索引器 IndexWriter indexWriter = new IndexWriter(dir, iwc); // 保存源文件的多个文件到数组File[]中 File[] textFiles = fileDir.listFiles(); // 索引的开始时间 long startTime = new Date().getTime(); // for循环遍历源目录下的文件 for (int i = 0; i < textFiles.length; i++) { if (textFiles[i].isFile() && textFiles[i].getName().endsWith(".txt")) { // 获取相对路径??? System.out.println("文件" + textFiles[i].getCanonicalPath() + "正在被索引..."); // 调用自定义读取文件内容的方法FileReaderAll() String temp = FileReaderAll(textFiles[i].getCanonicalPath(), "GBK"); // 打印读取到的内容 System.out.println(temp); // 为每一个文件的索引信息建立一个document对象 Document document = new Document(); // 文件路径索引:只是存储 不建立路径的索引,因为我们不需要对路径进行查询 Field fieldPath = new Field("path", textFiles[i].getPath(), Field.Store.YES, Field.Index.NO); // 文件内容索引: Field fieldBody = new Field("body", temp, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS); // 添加各域到document文档对象中 document.add(fieldPath); document.add(fieldBody); // 将文档写入索引 indexWriter.addDocument(document); } } // 关闭 indexWriter.close(); // 测试一下索引时间 long endTime = new Date().getTime(); //getPath,getAbsolutePath,getCanonicalPath的区别参考转载的文章 System.out.println("用时:" + (endTime - startTime) + "毫秒来把文档增加到索引里面去,"+fileDir.getPath()); System.out.println("用时:" + (endTime - startTime) + "毫秒来把文档增加到索引里面去,"+fileDir.getAbsolutePath()); System.out.println("用时:" + (endTime - startTime) + "毫秒来把文档增加到索引里面去,"+fileDir.getCanonicalPath()); } // 自定义读取文件内容的方法 FileReaderAll() public static String FileReaderAll(String FileName, String charset) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(FileName), charset));//知制定读取文件方式charset:GBK String line = new String(); String temp = new String(); while ((line = reader.readLine()) != null) { temp += line; } reader.close(); return temp; } }
搜索源代码:
package lucene的一个标准测试; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryParser.ParseException; 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.FSDirectory; import org.apache.lucene.util.Version; public class TestQuery { public static void main(String[] args) throws IOException,ParseException{ //搜索的索引路径 String index = "E:\\index"; IndexReader reader = IndexReader.open(FSDirectory.open(new File(index))); //定义在索引库中进行查询的searcher IndexSearcher searcher = new IndexSearcher(reader); ScoreDoc[] hits = null; //检索词 String queryString="绝对秋香"; //声明query对象 Query query = null; //分词器 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35); try { QueryParser qp = new QueryParser(Version.LUCENE_35,"body",analyzer); query = qp.parse(queryString); } catch (ParseException e) { e.printStackTrace(); } if(searcher!=null) { TopDocs results = searcher.search(query, 10); hits = results.scoreDocs; if(hits.length>0) { System.out.println("找到hits.length="+hits.length+"个结果\n"+"找到results.totalHits="+results.totalHits); } searcher.close(); } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。