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