📄 lucenesearcher.java
字号:
/*
* Created on 2004-11-1
* Author: Xuefeng, Copyright (C) 2004, Xuefeng.
*/
package org.crystalblog.search;
import java.io.*;
import java.util.*;
import org.springframework.core.io.Resource;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.*;
import org.crystalblog.domain.*;
import org.crystalblog.web.filter.HighlightFilter;
/**
* Lucene searcher facade.
*
* @author Xuefeng
*/
public class LuceneSearcher {
private int optimize = 20;
private String directory; // lucene base directory
private Analyzer analyzer = new StandardAnalyzer();
public void setDirectory(Resource resource) {
try {
directory = resource.getFile().getPath();
if(!new File(directory).isDirectory())
throw new Exception("Directory is not exist: " + directory);
System.out.println("[INFO] Lucene indexer directory: " + directory);
}
catch(Exception e) {
throw new RuntimeException("[WARNING] Failed in init lucene. Message: " + e.getMessage());
}
}
// search: num is [10, 100]
public SearchResult search(String q, int num, int page) {
if(q==null || page<=0 || num<10 || num>100)
return SearchResult.EMPTY;
q = q.trim();
if(q.equals(""))
return SearchResult.EMPTY;
Searcher searcher = null;
try {
searcher = new IndexSearcher(directory);
Query query = QueryParser.parse(q, "content", new StandardAnalyzer());
Hits hits = searcher.search(query);
if(hits != null){
int results = hits.length();
if(results==0)
return SearchResult.EMPTY;
System.out.println("found " + results + " results.");
// how many pages:
int pages = results / num + (results%num==0 ? 0 : 1);
// start from:
int start = num * (page-1);
if(start>=results) { // out of page
page = 1;
start = 0;
}
// and end at:
int end = start + num;
if(end>=results)
end = results-1;
// load all result items:
List resultItems = new ArrayList(end-start+1);
String[] keywords = q.split("[+ ]");
for(int i = start;i <= end; i++) {
Document doc = hits.doc(i);
resultItems.add(new ResultItem(
doc.get("articleId"),
doc.get("title"),
doc.get("summary"),
/* if we want to highlight the keyword */
HighlightFilter.highlight(doc.get("content"), keywords),
doc.get("createdDate"),
doc.get("updatedDate")
)
);
System.out.println("[Result] " + i + ": in article " + doc.get("articleId"));
}
return new SearchResult(q, results, start+1, end+1, num, page, pages, resultItems);
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(searcher!=null) {
try { searcher.close(); } catch(Exception e) {}
}
}
return SearchResult.EMPTY;
}
public SearchResult searchByAccount(int accountId, String q, int num, int page) {
//
return null;
}
// index the article:
public void index(Article article) {
System.out.println("[INFO] Try to index article: " + article.getTitle());
System.out.println("article content:\n" + article.getContent());
IndexWriter indexWriter = null;
try {
indexWriter = new IndexWriter(directory, new StandardAnalyzer(), false);
Document doc = new Document();
doc.add(Field.Keyword("articleId", "" + article.getArticleId()));
doc.add(Field.Keyword("accountId", "" + article.getAccountId()));
doc.add(Field.Keyword("createdDate", article.getCreatedDate().toString()));
doc.add(Field.Keyword("updatedDate", article.getUpdatedDate().toString()));
doc.add(Field.Text("title", article.getTitle()));
doc.add(Field.Text("summary", article.getSummary()));
doc.add(Field.Text("content", article.getContent()));
indexWriter.addDocument(doc);
if(article.getArticleId() % optimize == 0)
indexWriter.optimize();
}
catch(IOException ioe) {
ioe.printStackTrace();
}
finally {
if(indexWriter!=null) {
try { indexWriter.close(); } catch(Exception e) {}
}
}
}
// unindex the article:
public void unindex(int articleId) {
System.out.println("[INFO] Try to unindex article: ");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -