基础应用,在保存信息时调用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();
}
}
}