lucene实例

基础应用,在保存信息时调用luceneDao中的save方法产生索引,搜索时调用search依据进行查询。

 

@Repository("luceneDao")
public class LuceneDao {
	/**
	 * 
	 * save: 产生索引
	 * 由于在通过IndexWriter对象操作索引库的时候,忘记关闭该对象流了。
	 * 当关闭时,程序退出自会上索引锁,所以在用IndexWriter进行
	 * 索引库操作的时候一定要记得关闭该对象流!  
	 * @param  @param message    设定文件   
	 * @return void    DOM对象   
	 * @throws    
	 * @since  search1.0
	 */
	public void save(Message message) {
		IndexWriter indexWriter = null;
		try {
			indexWriter = SearchUtils.getIndexWriter();
			indexWriter.addDocument(SearchUtils.parseMessageToDocument(message));
			indexWriter.setMergeFactor(4);
			indexWriter.optimize();
			indexWriter.commit();
		} catch (Exception e) {
			e.printStackTrace();   
		}finally{
			if(null != indexWriter){
				try {
					indexWriter.close();
				} catch (Exception e) {
					e.printStackTrace();   
				}
			}
		}
	}
	/**
	 * 
	 * search:查询   
	 *   
	 * @param  @param query
	 * @param  @return    设定文件   
	 * @return List<MessageBean>    DOM对象   
	 * @throws    
	 * @since  search1.0
	 */
	public List<MessageBean> search(String query) {
		List<MessageBean> messageBeans = new ArrayList<MessageBean>();
		IndexSearcher indexSearcher = SearchUtils.getIndexSearch();
		String[] fields = {"title", "content"};
		MultiFieldQueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, fields, SearchUtils.analyzer);
		try {
			Query luceneQuery = queryParser.parse(query);
			TopDocs topDocs = indexSearcher.search(luceneQuery, 100);
			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
			
			Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
			QueryScorer scorer = new QueryScorer(luceneQuery);
			Highlighter highlighter = new Highlighter(formatter, scorer);
			
			Fragmenter fragmenter = new SimpleFragmenter(20);
			highlighter.setTextFragmenter(fragmenter);
			
			for(ScoreDoc scoreDoc : scoreDocs){
				Document doc = indexSearcher.doc(scoreDoc.doc);
				String title = highlighter.getBestFragment(SearchUtils.analyzer, "title", doc.get("title"));
				String content = highlighter.getBestFragment(SearchUtils.analyzer, "content", doc.get("content"));
				if( null != title){
					doc.getField("title").setValue(title);
				}
				if( null != content){
					doc.getField("content").setValue(content);
				}
				messageBeans.add(SearchUtils.parseDocumentToMessageBean(doc));
			}
		} catch (Exception e) {
			e.printStackTrace();   
		}finally{
			if(null != indexSearcher){
				try {
					indexSearcher.close();
				} catch (IOException e) {
					e.printStackTrace();   
				}
			}
		}
		return messageBeans;   
	}
}

 

 

 public class SearchUtils {
	public static IKAnalyzer analyzer;
	public static Directory directory;
	
	static {
		File file = new File("./indexs/");
		try {
			directory = FSDirectory.open(file);
			analyzer = new IKAnalyzer();
		} catch (IOException e) {
			e.printStackTrace();   
		}
	}
	/**
	 * 
	 * getIndexWriter:return indexwriter
	 *   
	 * @param  @return    设定文件   
	 * @return IndexWriter    DOM对象   
	 * @throws    
	 * @since  search1.0
	 */
	public static IndexWriter getIndexWriter(){
		IndexWriter indexWriter = null;
		try {
			//字段设置为有限长度
			indexWriter = new IndexWriter(directory, analyzer, 

MaxFieldLength.LIMITED);
			//indexWriter.setMaxFieldLength(100);设置最大长度
		} catch (Exception e) {
			e.printStackTrace();   
		}
		return indexWriter;
	}
	
	/**
	 * 
	 * getIndexSearch:return indexsearcher
	 *   
	 * @param  @return    设定文件   
	 * @return IndexSearcher    DOM对象   
	 * @throws    
	 * @since  search1.0
	 */
	public static IndexSearcher getIndexSearch(){
		IndexSearcher indexSearcher = null;
		try {
			indexSearcher = new IndexSearcher(directory);
		} catch (Exception e) {
			e.printStackTrace();   
		}
		return indexSearcher;
	}
	
	public static IndexReader getIndexReader(){
		IndexReader reader = null;
		try {
			reader = IndexReader.open(directory);
		} catch (Exception e) {
			e.printStackTrace();   
		}
		return reader;
	}
	
	/**
	 * 
	 * parseToObject:from document to Object
	 *   
	 * @param  @param document
	 * @param  @return    设定文件   
	 * @return Lucene    DOM对象   
	 * @throws    
	 * @since  search1.0
	 */
	public static Lucene parseToObject(Document document) {
		Lucene lucene = new Lucene();
		lucene.setTitle(document.get("title"));
		lucene.setUrl(document.get("url"));
		lucene.setDigest(document.get("digest"));
		return lucene;   
		
	}
	
	/**
	 * 
	 * parseMessageToDocument:parse message to document
	 *   
	 * @param  @param message
	 * @param  @return    设定文件   
	 * @return Document    DOM对象   
	 * @throws    
	 * @since  search1.0
	 */
	public static Document parseMessageToDocument(Message message){
		Document doc = new Document();
		doc.add(new Field("id", message.getId(), Store.YES, Index.NOT_ANALYZED));
		doc.add(new Field("title", message.getTitle(), Store.YES, Index.ANALYZED));
		doc.add(new Field("author", message.getAuthor(), Store.YES, Index.ANALYZED));
		doc.add(new Field("keywords", message.getKeywords(), Store.YES, 

Index.ANALYZED));
		doc.add(new Field("content", message.getContent(), Store.YES, 

Index.ANALYZED));
		return doc;
	}
	
	/**
	 * 
	 * parseDocumentToMessageBean:parse document to message
	 *   
	 * @param  @param doc
	 * @param  @return    设定文件   
	 * @return MessageBean    DOM对象   
	 * @throws    
	 * @since  search1.0
	 */
	public static MessageBean parseDocumentToMessageBean(Document doc){
		MessageBean messageBean = new MessageBean();
		messageBean.setId(doc.get("id"));
		messageBean.setTitle(doc.get("title"));
		messageBean.setAuthor(doc.get("author"));
		messageBean.setKeywords(doc.get("keywords"));
		messageBean.setContent(doc.get("content"));
		return messageBean;
	}
	
	/**
	 * 
	 * unLock:unlock   
	 *   
	 * @param      设定文件   
	 * @return void    DOM对象   
	 * @throws    
	 * @since  search1.0
	 */
	public static void unLock(){
		try {
			if (IndexWriter.isLocked(directory)) {
				IndexWriter.unlock(directory);
			}
		} catch (IOException e) {
			e.printStackTrace();   
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值