/** * * @author Q.Wong [2010-12-17] * */ public class IndexManager { private static Logger logger = LogManager.getLogger(IndexManager.class); /** * return an IndexWriter with FSDirectory * * @param indexDir * @param analyzer * @return * @throws CorruptIndexException * @throws LockObtainFailedException * @throws IOException */ public static IndexWriter getFSDirectoryIndexWriter(String indexDir, Analyzer analyzer) throws CorruptIndexException, LockObtainFailedException, IOException { return new IndexWriter(FSDirectory.open(new File(indexDir)), analyzer, true, MaxFieldLength.LIMITED); } /** * return an IndexWriter with RamDir * * @param ramDir * @param analyzer * @return * @throws CorruptIndexException * @throws LockObtainFailedException * @throws IOException */ public static IndexWriter getRamDirIndexWriter(Directory ramDir, Analyzer analyzer) throws CorruptIndexException, LockObtainFailedException, IOException { return new IndexWriter(ramDir, analyzer, MaxFieldLength.UNLIMITED); } /** * return an IndexReader with FSDirectory * * @param indexDir * @return * @throws CorruptIndexException * @throws IOException */ public static IndexReader getFSDirectoryIndexReader(String indexDir) throws CorruptIndexException, IOException { return IndexReader.open(FSDirectory.open(new File(indexDir)), true); } /** * return an IndexReader with RamDir * * @param ramDir * @return * @throws CorruptIndexException * @throws IOException */ public static IndexReader getRamDirIndexReader(Directory ramDir) throws CorruptIndexException, IOException { return IndexReader.open(ramDir); } /** * 创建索引 * * @param f * @param writer * @throws CorruptIndexException * @throws IOException */ public static void indexDocs(File f, IndexWriter writer, Boolean storeContents) throws CorruptIndexException, IOException { if (!f.canRead()) { return; } if (f.isDirectory()) { String[] files = f.list(); if (null != files) { for (String file : files) { indexDocs(new File(f, file), writer, storeContents); } } } else { writer.addDocument(Document(f, storeContents)); logger.info("Indexed: [" + f.getPath() + "]"); } } /** * 根据File生成Document对象 * * @param f * @param storeContents * @return * @throws IOException */ private static Document Document(File f, Boolean storeContents) throws IOException { Document doc = new Document(); doc.add(new Field("path", f.getPath(), Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.add(new Field("modified", DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.NOT_ANALYZED)); if (storeContents) { doc.add(new Field("contents", readFile(f), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); } else { doc.add(new Field("contents", new FileReader(f))); } return doc; } /** * 读取文件内容 * * @param file * @return * @throws IOException */ public static String readFile(File file) throws IOException { Reader re = new FileReader(file); char[] chs = new char[1024]; int count; String content = ""; while ((count = re.read(chs)) != -1) { content = content + new String(chs, 0, count); } return content; } }