Java之Luence工具类-yellowcong
来源:互联网 发布:有气泡的软件 编辑:程序博客网 时间:2024/06/07 00:16
我们需要通过索引管理类,获取到索引读取文件,然后通过索引查询类,查询Luence建立的索引
索引查询类
package com.yellowcong.utils;import java.io.File;import java.io.IOException;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.Arrays;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.sql.DataSource;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.NumericField;import org.apache.lucene.document.NumericField.DataType;import org.apache.lucene.index.CorruptIndexException;import org.apache.lucene.index.IndexReader;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.index.Term;import org.apache.lucene.queryParser.MultiFieldQueryParser;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.Sort;import org.apache.lucene.search.SortField;import org.apache.lucene.search.TermQuery;import org.apache.lucene.search.TopDocs;import org.apache.lucene.search.highlight.Formatter;import org.apache.lucene.search.highlight.Highlighter;import org.apache.lucene.search.highlight.QueryScorer;import org.apache.lucene.search.highlight.SimpleHTMLFormatter;import org.apache.lucene.search.highlight.SimpleSpanFragmenter;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.store.jdbc.JdbcDirectory;import org.apache.lucene.store.jdbc.JdbcStoreException;import org.apache.lucene.util.Version;import org.springframework.beans.BeansException;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.chenlb.mmseg4j.analysis.MMSegAnalyzer;import com.yellowcong.model.Pager;import com.yellowcong.model.SystemContext;/** * 索引工具包 * 高亮显示的是我们的查询数据对象 * * 有个很神奇的问题,当我们导入了POI3.13的jar包的时候,解析docx的文档就会出现问题,真是菊花疼 * @author yellowcong * @date 2016年1月4日 * */public class IndexUtils { //定义索引文件地址 private static String indexPath = FileUtils.mkClassPathDir("index"); //字典目录 private static String dicPath = FileUtils.getClassPathFilePath("data"); private static IndexReader reader =null ; private static MMSegAnalyzer analyzer = null; //定义我们的字典地址 private IndexUtils(){ } /** * 获取我们的 IndexReader * @return */ public static IndexReader getIndexReader(){ if(reader == null){ try { reader = IndexReader.open(FSDirectory.open(new File(indexPath))); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } return reader; } /** * 获取IndexSearcher * 解决项目的同步更新的问题 * @return */ public static IndexSearcher getIndexSearch(){ try { if(reader == null){ reader = IndexReader.open(FSDirectory.open(new File(indexPath))); }else{ //如果改变了,会返回一个新的对象,如果没有改变,会是原来的对象 IndexReader tr = IndexReader.openIfChanged(reader); if(tr !=null){ //将以前的Reader 删除 reader.close(); reader = tr; } } } catch (Exception e) { throw new RuntimeException(new Date().toLocaleString()+" : IndexReader 获取失败"); } return new IndexSearcher(reader); } /** * 其中有些项目只有一个IndexWriter ,我们需要将 Writer 提交 * 获取我们的Writer * @return */ public static IndexWriter getIndexWriter(){ IndexWriter writer =null; try { writer = new IndexWriter(FSDirectory.open(new File(indexPath)), new IndexWriterConfig(Version.LUCENE_35,new MMSegAnalyzer(dicPath))); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } return writer; } /** * 写一篇文档数据 * @param document 一篇文档 */ public static void writer(Document document ){ try { getIndexWriter().addDocument(document, getAnalyzer()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 写我们的文档数据,写多篇文档 * @param documents 传入写入的数据几何 */ public static void writer(List<Document> documents ){ try { getIndexWriter().addDocuments(documents, getAnalyzer()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 获取分词器 * @return */ public static MMSegAnalyzer getAnalyzer(){ if(analyzer == null){ analyzer = new MMSegAnalyzer(dicPath); } return analyzer; } /** * 高亮显示 ,注意高亮显示不能操作没有存储的数据 * @param query 查询的Query 对象 * @param fieldName 查询的字段 * @param text 高亮的对象 * @return */ public static String highlighter(Query query,String fieldName,String text){ try { QueryScorer scorer = new QueryScorer(query); Formatter formatter = new SimpleHTMLFormatter("<span color='red'>", "</span>"); Highlighter lighter = new Highlighter(formatter,scorer); lighter.setTextFragmenter(new SimpleSpanFragmenter(scorer)); //获取高亮显示的结果 String result = lighter.getBestFragment(IndexUtils.getAnalyzer(), fieldName, text); return result; } catch (Exception e) { throw new RuntimeException("高亮显示不能操作未存储的索引数据"+new Date().toLocaleString()); } } /** * 写索引到硬盘中 *@param document */ public static void writeIndex(Document document){ try { IndexWriter writer = IndexUtils.getIndexWriter(); writer.addDocument(document); writer.close(); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } /** * 一个字段的 * 通过传入 字段 和 字段对应的 值 来查询索引 ,返回文档 * @param field 字段 id ,content,filename,name 类似 * @param val 传递过来的值 * @param sort 排序的字段 * @return */ public static List<Document> query(String field,String val,Sort sort){ return query(new String[]{field}, val,sort); } /** * 一个字段的 * 通过传入 字段 和 字段对应的 值 来查询索引 ,返回文档 * @param field 字段 id ,content,filename,name 类似 * @param val 传递过来的值 * @param isLight 是否高亮显示 * @param orderFields 排序字段 * @param reverse 是否倒叙 还是正顺序 * @return */ public static List<Document> queryByOrder(String [] fields,String val,boolean isLight,String [] orderFields,boolean reverse){ try { List<Document> docs = null; IndexSearcher searcher = IndexUtils.getIndexSearch(); QueryParser parser = null; //多个条件 和一个条件的情况 if(fields!= null && fields.length >1){ parser = new MultiFieldQueryParser(Version.LUCENE_35, fields, getAnalyzer()); }else{ parser =new QueryParser(Version.LUCENE_35, fields[0], IndexUtils.getAnalyzer()); } Query query = parser.parse(val); TopDocs topDocs = null; if(orderFields != null && orderFields.length >0){ //这个是查询的 条数,可以修改 topDocs = searcher.search(query, 10,getSort(fields, val, orderFields, reverse)); }else{ topDocs = searcher.search(query, 10); } if(topDocs.scoreDocs.length >0){ docs = new ArrayList<Document>(); for(ScoreDoc scoreDoc :topDocs.scoreDocs){ Document document = searcher.doc(scoreDoc.doc); if(isLight){ for(String field:fields){ //获取高亮的结果 String result = IndexUtils.highlighter(query, field, document.get(field)); //设定document 的数据,将默认数据修改为我们的高亮数据 document.getField(field).setValue(result); } } docs.add(document); } } return docs; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } } /** * 顺序查询数据 * @param fields 查询的字段 * @param val 查询的值 * @param isLight 是否高亮显示 高亮 现实的数据需要被 Store.YES 才可以设定高亮 * @param orderFields 排序的字段 * @return */ public static List<Document> queryByOrderASC(String field,String val,String orderField){ return queryByOrder(new String[]{field}, val, false,new String[]{orderField}, false); } /** * 顺序查询,带多条数据 * @param fields 查询的字段 * @param val 查询的值 * @param orderFields 排序的字段 * @return */ public static List<Document> queryByOrderASCLight(String field,String val,String orderField){ return queryByOrder(new String[]{field}, val, true,new String[]{orderField}, false); } /** * 顺序查询 多条数据 * @param fields 查询多条数据 * @param val 查询的值 * @param isLight 是否高亮显示 高亮 现实的数据需要被 Store.YES 才可以设定高亮 * @param orderFields 排序的字段 * @return */ public static List<Document> queryByOrderASC(String [] fields,String val,String orderField){ return queryByOrder(fields, val, false,new String[]{orderField}, false); } /** * 带高亮的顺序排序 * @param fields * @param val * @param orderField * @return */ public static List<Document> queryByOrderASCLight(String [] fields,String val,String orderField){ return queryByOrder(fields, val, true,new String[]{orderField}, false); } /** * 倒叙查询 * @param field 查询字段 * @param val 数据 * @param orderField 排序字段 * @return */ public static List<Document> queryByOrderDESC(String field,String val,String orderField){ return queryByOrder(new String[]{field}, val, false,new String[]{orderField}, true); } /** * 带高亮的倒序 * @param field * @param val * @param orderField * @return */ public static List<Document> queryByOrderDESCLight(String field,String val,String orderField){ return queryByOrder(new String[]{field}, val, true,new String[]{orderField}, true); } /** * 倒叙查询 多条数据 数组 * @param fields 数组 * @param val * @param orderField * @return */ public static List<Document> queryByOrderDESC(String [] fields,String val,String orderField){ return queryByOrder(fields, val, false,new String[]{orderField}, true); } /** * 带高亮显示 的排序 * @param fields * @param val * @param orderField * @return */ public static List<Document> queryByOrderDESCLight(String [] fields,String val,String orderField){ return queryByOrder(fields, val, true,new String[]{orderField}, true); } /** * 通过字段名称 * 来获取排序字段的 Sort类 * @param fields * @param val * @param sortFields 排序字段 为空时,使用默认字段 Sort.RELEVANCE * @param reverse 是否倒叙还是顺序 * @return */ private static Sort getSort(String [] fields, String val,String [] sortFields, boolean reverse){ List<Document> docs = query(fields, val); SortField [] sorts = null ; Sort sort = null; if(docs != null && docs.size()>0){ Document doc = docs.get(0); //获取到我们的字段类型 if(sortFields != null && sortFields.length >0 ){ sorts = new SortField[fields.length]; int index= 0; for(String field :sortFields){ //获取类 对象 String className = doc.getFieldable(field).getClass().getSimpleName(); //获取数据类型 String dataType = null; if(className.equals("NumericField")){ NumericField nf = (NumericField) doc.getFieldable(field); //是int 还是LONG //INT, LONG, FLOAT, DOUBLE; dataType = nf.getDataType().toString(); }if(className.equals("Field")){ //String类型的数据 dataType = "STRING"; //对于String类型的 排序 选哟是 按照 } Map<String,Integer> map = new HashMap<String,Integer>(); map.put(DataType.LONG.toString(), SortField.LONG); map.put(DataType.INT.toString(), SortField.INT); map.put(DataType.DOUBLE.toString(), SortField.DOUBLE); map.put(DataType.FLOAT.toString(), SortField.FLOAT); map.put("STRING", SortField.STRING); //设定Sort sorts[index] = new SortField(field, map.get(dataType),reverse); index ++; } sort = new Sort(sorts); }else{ //当没有设定排序的时候,我们的系统默认的排序方法 sort = Sort.RELEVANCE; } } return sort; } /** * 默认查询不带排序的查询 * 通过传入 字段 和 字段对应的 值 来查询索引 ,返回文档 * @param field 字段 id ,content,filename,name 类似 * @param val 传递过来的值 * @return */ public static List<Document> query(String field,String val){ return query(new String[]{field}, val,null); } /** * 不带高亮显示的查询 * @param fields 查询的字段 可以是数组 * @param val 查询的内容 * @param sort 排序 * @return */ public static List<Document> query(String [] fields,String val,Sort sort){ return query(fields, val,false,sort); } /** * 不带高亮显示的查询 * @param fields 查询的字段 可以是数组 * @param val 查询的内容 * @param sort 排序 * @return */ public static List<Document> query(String [] fields,String val){ return query(fields, val,false,null); } //queryWithLight 带有分页查询的方法 有四个 /** * 带高亮显示的查询 * @param fields 字段 * @param val 查询的数据 * @param sort 排序 * @return */ public static List<Document> queryWithLight(String [] fields,String val,Sort sort){ return query(fields, val,true,sort); } /** * 带高亮显示的查询 不带排序 * @param fields 字段 * @param val 查询的数据 * @return */ public static List<Document> queryWithLight(String [] fields,String val){ return query(fields, val,true,null); } /** * 带高亮显示的查询,不带排序 * @param fields 字段 * @param val 查询的数据 * @return */ public static List<Document> queryWithLight(String field,String val){ return query(new String[]{field},val,true,null); } /** * 带高亮显示的查询,不带排序 * @param fields 字段 * @param val 查询的数据 * @param sort 带排序 * @return */ public static List<Document> queryWithLight(String field,String val,Sort sort){ return query(new String[]{field},val,true,sort); } /** * 精确 比如通过id查询,有设定的 * 需要 设定不动的数据作为查询 NO_ANALYZE 才可以精确查询 * @param term 我们的查询数据 * @return */ public static List<Document> queryByTerm(Term term,Sort sort){ try { List<Document> docs = null; IndexSearcher searcher = IndexUtils.getIndexSearch(); Query query = new TermQuery(term); TopDocs topDocs =null; if(sort != null){ topDocs = searcher.search(query, 10,sort); }else{ topDocs = searcher.search(query, 10); } if(topDocs.scoreDocs.length >0){ docs = new ArrayList<Document>(); for(ScoreDoc scoreDoc :topDocs.scoreDocs){ Document document = searcher.doc(scoreDoc.doc); docs.add(document); } } return docs; } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } /** * 不带排序的查询 * @param term * @return */ public static List<Document> queryByTerm(Term term){ return queryByTerm(term, null); } /** * 多个查询条件的情况 * @param fields 字段 * @param val 值 * @param isLight 是否高亮显示 * @param sort 排序字段 * @return */ public static List<Document> query(String [] fields,String val,boolean isLight,Sort sort){ try { List<Document> docs = null; IndexSearcher searcher = IndexUtils.getIndexSearch(); QueryParser parser = null; //多个条件 和一个条件的情况 if(fields!= null && fields.length >1){ parser = new MultiFieldQueryParser(Version.LUCENE_35, fields, getAnalyzer()); }else{ parser =new QueryParser(Version.LUCENE_35, fields[0], IndexUtils.getAnalyzer()); } Query query = parser.parse(val); TopDocs topDocs = null; if(sort != null){ //这个是查询的 条数,可以修改 topDocs = searcher.search(query, 10,sort); }else{ topDocs = searcher.search(query, 10); } if(topDocs.scoreDocs.length >0){ docs = new ArrayList<Document>(); for(ScoreDoc scoreDoc :topDocs.scoreDocs){ Document document = searcher.doc(scoreDoc.doc); if(isLight){ for(String field:fields){ //获取高亮的结果 String result = IndexUtils.highlighter(query, field, document.get(field)); //设定document 的数据,将默认数据修改为我们的高亮数据 document.getField(field).setValue(result); } } docs.add(document); } } return docs; } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } /** * 分页查询数据 分页数据查询中,不可以添加排序功能 * 通过searchAfter 这个方法,查询的数据没有排序功能 * @param fields 字段 * @param val 值 * @param isLight 是否高亮 * @return */ public static Pager<Document> queryByPager(String [] fields,String val,boolean isLight){ //FIXME 搞定 分页查询 try { List<Document> docs = null; IndexSearcher searcher = IndexUtils.getIndexSearch(); QueryParser parser = null; Pager<Document> pager = null; Integer pageSize = SystemContext.getPageSize(); Integer pageNow = SystemContext.getPageNow(); if(pageSize == null || pageSize <= 0){ pageSize = 10; } if(pageNow == null || pageNow<= 0){ pageNow = 1; } int pageoffset = (pageNow-1)*pageSize; //多个条件 和一个条件的情况 if(fields!= null && fields.length >1){ parser = new MultiFieldQueryParser(Version.LUCENE_35, fields, getAnalyzer()); }else{ parser =new QueryParser(Version.LUCENE_35, fields[0], IndexUtils.getAnalyzer()); } Query query = parser.parse(val); TopDocs topDocs = null; topDocs = searcher.searchAfter(queryLastDoc(pageoffset,searcher, query),query, pageSize); if(topDocs.scoreDocs.length >0){ docs = new ArrayList<Document>(); for(ScoreDoc scoreDoc :topDocs.scoreDocs){ Document document = searcher.doc(scoreDoc.doc); if(isLight){ for(String field:fields){ //获取高亮的结果 String result = IndexUtils.highlighter(query, field, document.get(field)); //设定document 的数据,将默认数据修改为我们的高亮数据 //这个高粱的是 String类型数据,如果是int就会报错 document.getField(field).setValue(result); } } docs.add(document); } //设定Pager中的数据 pager = new Pager<Document>(); pager.setRowCount(topDocs.totalHits); pager.setPageCount((topDocs.totalHits - 1)/pageSize +1); pager.setData(docs); pager.setPageNow(pageNow); pager.setPageSize(pageSize); } return pager; } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } /** * 获取查询的 数目 * @return */ public static int getMaxCount(Query query){ try { IndexSearcher searcher = IndexUtils.getIndexSearch(); TopDocs topDocs = searcher.search(query, 1); return topDocs.totalHits; } catch (Exception e) { // TODO: handle exception } return 0; } /** * 分页查询 带排序字段操作的 * @param fields 字段 * @param val 值 * @param isLight 是否高亮 * @param sort 排序 * @return */ public static Pager<Document> queryByPager(String [] fields,String val,boolean isLight,Sort sort){ //FIXME 搞定 分页查询 try { List<Document> docs = null; IndexSearcher searcher = IndexUtils.getIndexSearch(); QueryParser parser = null; Pager<Document> pager = null; Integer pageSize = SystemContext.getPageSize(); Integer pageNow = SystemContext.getPageNow(); if(pageSize == null || pageSize <= 0){ pageSize = 10; } if(pageNow == null || pageNow<= 0){ pageNow = 1; } int start = (pageNow-1)*pageSize; int end = pageNow*pageSize; //多个条件 和一个条件的情况 if(fields!= null && fields.length >1){ parser = new MultiFieldQueryParser(Version.LUCENE_35, fields, getAnalyzer()); }else{ parser =new QueryParser(Version.LUCENE_35, fields[0], IndexUtils.getAnalyzer()); } Query query = parser.parse(val); TopDocs topDocs = null; topDocs = searcher.search(query,getMaxCount(query),sort); if(topDocs.scoreDocs.length >0){ docs = new ArrayList<Document>(); for(int i =start ;i<end;i++){ ScoreDoc scoreDoc = topDocs.scoreDocs[i]; Document document = searcher.doc(scoreDoc.doc); if(isLight){ for(String field:fields){ //获取高亮的结果 String result = IndexUtils.highlighter(query, field, document.get(field)); //设定document 的数据,将默认数据修改为我们的高亮数据 //这个高粱的是 String类型数据,如果是int就会报错 document.getField(field).setValue(result); } } docs.add(document); } } //设定Pager中的数据 pager = new Pager<Document>(); pager.setRowCount(topDocs.totalHits); pager.setPageCount((topDocs.totalHits - 1)/pageSize +1); pager.setData(docs); pager.setPageNow(pageNow); pager.setPageSize(pageSize); return pager; } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } /** * 一个字段的查询 * @param field 字段 * @param val 值 * @param isLight 是否高亮 * @return */ public static Pager<Document> queryByPager(String field,String val,boolean isLight){ return queryByPager(new String[]{field}, val, isLight); } /** * 获取文章后面的文档 获取后面的目标文档 * @param pageOffset pageNow xpageSize * @param searcher 查询 * @param query query对象 * @return */ private static ScoreDoc queryLastDoc(int pageOffset,IndexSearcher searcher,Query query){ try { if(pageOffset <= 0) return null; TopDocs docs = null; docs = searcher.search(query,pageOffset); return docs.scoreDocs[pageOffset-1]; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 查询数据.通过Reader 获取文档的数据 */ public static void getInfo(){ try { IndexReader reader = IndexUtils.getIndexReader(); System.err.println("--------------索引系统信息---------------------"); System.out.println("文档数量"+reader.numDocs()); //获取文档数量 System.out.println("文档总数"+reader.maxDoc());//最大的文档 System.out.println("删除的文档数-->"+reader.numDeletedDocs()); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } /** * 删除所有数据 */ public static void deleteAll(){ IndexWriter writer = null; try { writer = IndexUtils.getIndexWriter(); writer.deleteAll(); } catch (Exception e) { throw new RuntimeException(e.getMessage()); }finally{ closeWriter(writer); } } /** * 取消清空数据 */ public void undelete(){ IndexReader reader = null; try { reader = IndexReader.open(FSDirectory.open(new File(indexPath)),false); //指定reader only 为false reader.undeleteAll(); //设定恢复所有的删除数据 } catch (Exception e) { throw new RuntimeException(e.getMessage()); }finally{ closeReader(reader); } } /** * 精确删除数据 * @param term */ public static void deleteByTerm(Term term){ IndexWriter writer = null; try { writer = getIndexWriter(); writer.deleteDocuments(term); } catch (Exception e) { throw new RuntimeException(e.getMessage()); }finally{ closeWriter(writer); } } /** * 清空所有索引数据,不可以恢复 */ public static void forceDeletes(){ IndexWriter writer = null; try { writer = IndexUtils.getIndexWriter(); writer.forceMergeDeletes(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ closeWriter(writer); } } /** * 关闭writer * @param writer */ public static void closeWriter(IndexWriter writer){ try { if(writer != null){ writer.close(); } } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } /** * 关闭Reader * @param writer */ public static void closeReader(IndexReader reader){ try { if(reader != null){ reader.close(); } } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } /** * 判断索引表是否存在e * @param directory 文件 * @return */ public static boolean indexExists(JdbcDirectory directory){ boolean flag = false; try { PreparedStatement ps = directory.getDataSource().getConnection().prepareStatement("show tables"); ResultSet set = ps.executeQuery(); String tableName = directory.getTable().getName(); while(set.next()){ if(set.getString(1).equals(tableName)){ return true; } } } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 获取JDBCDirecotry * @return */ public static JdbcDirectory getJDBCDirecotry(){ try { AbstractApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); DataSource dataSource =(DataSource) context.getBean("dataSource"); //创建Directory JdbcDirectory directory = new JdbcDirectory(dataSource,"t_index"); boolean exists = IndexUtils.indexExists(directory); if(!exists){ directory.create(); } return directory; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 获取JDBC的IndexWriter * @return */ @SuppressWarnings("deprecation") public static IndexWriter getIndexWriter4JBCD(){ IndexWriter writer =null; try { Directory directory = IndexUtils.getJDBCDirecotry();// writer = new IndexWriter(directory, new MMSegAnalyzer(dicPath),false,IndexWriter.MaxFieldLength.UNLIMITED); writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new MMSegAnalyzer(dicPath))); } catch (Exception e) { e.printStackTrace(); } return writer; }}
索引管理类
package com.yellowcong.utils;import java.io.File;import java.io.IOException;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.index.CorruptIndexException;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.NRTManager;import org.apache.lucene.search.NRTManagerReopenThread;import org.apache.lucene.search.SearcherManager;import org.apache.lucene.search.SearcherWarmer;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.Version;import com.chenlb.mmseg4j.analysis.MMSegAnalyzer;/** * 建立索引管理的类 * @author yellowcong * @date 2016年1月4日 * */public class LuceneContext{ private static LuceneContext context = null; //定义索引文件地址 private static String indexPath = FileUtils.mkClassPathDir("index"); //字典目录 private static String dicPath = FileUtils.getClassPathFilePath("data"); //分词器 private static Analyzer analyzer; //版本 private static Version version; //写 private static IndexWriter writer; private static NRTManager nrtMgr; private static SearcherManager mgr; //索引存放的Directory private static Directory directory; private LuceneContext(){} /** * 获取实例化对象 * @return */ public static LuceneContext getInstance(){ if(context == null){ init(); context = new LuceneContext(); } return context; } /** * 初始化 */ private static void init() { try { directory = FSDirectory.open(new File(indexPath)); //版本 version = Version.LUCENE_35; //分词器 analyzer = new MMSegAnalyzer(dicPath); //IndexWriter writer = new IndexWriter(directory,new IndexWriterConfig(version,analyzer)); //NRTManager 这个包实现了所有的IndexWriter 的方法 nrtMgr = new NRTManager(writer, new SearcherWarmer() { @Override public void warm(IndexSearcher arg0) throws IOException {// System.out.println("重新开启"); } }); //获取SearchManager mgr = nrtMgr.getSearcherManager(true); NRTManagerReopenThread reopenThread = new NRTManagerReopenThread(nrtMgr, 5.0,0.025); reopenThread.setName("NRTManager 管理器"); //设定为后台线程 reopenThread.setDaemon(true); //启动线程 reopenThread.start(); } catch (IOException e) { e.printStackTrace(); } } /** * 获取我们的查询工具 * @return IndexSearcher */ public IndexSearcher getIndexSearcher(){ return mgr.acquire(); } /** * 释放资源 不能 直接至为Null * @param searcher */ public void releaseSearcher(IndexSearcher searcher) { try { mgr.release(searcher); } catch (IOException e) { e.printStackTrace(); } } /** * 提交索引 */ public void commitIndex() { try { writer.commit(); writer.forceMerge(3); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public NRTManager getNRTManager() { return nrtMgr; } /** * 获取版本 * @return */ public Version getVersion() { return version; } public Analyzer getAnalyzer() { return analyzer; } public void deleteAll(){ try { nrtMgr.deleteAll(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
阅读全文
0 0
- Java之Luence工具类-yellowcong
- Java之字符串工具类-yellowcong
- Java之日期工具类-yellowcong
- Java之文件工具类-yellowcong
- Java之图片裁剪工具类-yellowcong
- Java之Json工具类-yellowcong
- Java之颜色工具-yellowcong
- Java之请求发送工具类(HttpClientUtils,爬虫)-yellowcong
- JAVA之Java Decompiler反编译工具-yellowcong
- Oracle之JAVA数据导出工具-yellowcong
- luence的java工具类,通用类型解析,支持数据库
- Java之请求发送工具类(HttpRequestUtils,百度站长)-yellowcong
- Java之文件压缩工具类-yellowcong
- Java之文件下载工具类-yellowcong
- CentOS之Java安装-yellowcong
- Java之数字格式化-yellowcong
- Java之二维码工具包-yellowcong
- Java之二分查找-yellowcong
- Java之Json工具类-yellowcong
- 右值引用
- 线性表(List)---栈的链式存储
- C++中fill()、fill_n()与memset()函数的区别
- [错误笔记]Linux纪实
- Java之Luence工具类-yellowcong
- SSM高级整合案列教程(附源码)
- (es5)JavaScript——异步和单线程
- HTML_day02_lable
- Echarts使用心得总结——异步数据加载与更新(二)
- Ubuntu Linux完整安装与完全卸载MySQL环境
- html_day02_select&textarea
- 真Unity3d_AI四选一
- Ubuntu 开机自动开启数字键小键盘