📄 luceneindeximpl.java.svn-base
字号:
package com.suncms.service.lucene;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import com.suncms.domain.Article;
import com.suncms.domain.SearchResult;
import com.suncms.persistence.iface.ArticleDao;
import com.suncms.persistence.sqlmapdao.ArticleSqlMapDao;
import com.suncms.service.ibatis.ArticleService;
public class LuceneIndexImpl implements LuceneIndex{
private ArticleDao articleDao;
public ArticleDao getArticleDao() {
return articleDao;
}
public void setArticleDao(ArticleDao articleDao) {
this.articleDao = articleDao;
}
public void makeIndex(Document doc, String indexDir) {
List<Document> aList = new ArrayList<Document>();
aList.add(doc);
makeIndex(aList, indexDir);
}
public void makeIndex(List<Document> docs, String indexDir) {
if (null == docs) {
return;
}
boolean indexExist = indexExist(indexDir);
IndexWriter writer = null;
try {
StandardAnalyzer analyzer = new StandardAnalyzer();
if (indexExist) {
writer = new IndexWriter(indexDir, analyzer, false);
} else {
writer = new IndexWriter(indexDir, analyzer, true);
}
for (int i = 0; i < docs.size(); i++) {
Document doc = (Document) docs.get(i);
if (null != doc) {
writer.addDocument(doc);
}
}
writer.optimize();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != writer) {
writer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public boolean indexExist(String indexDir) {
return IndexReader.indexExists(indexDir);
}
public Document makeNewsSearchDocument(Article article) {
Document doc = new Document();
doc.add(new Field("nid", article.getRow_id(), Field.Store.YES,
Field.Index.UN_TOKENIZED));
doc.add(new Field("title", article.getArticle_title(), Field.Store.YES,
Field.Index.TOKENIZED));
// String content = parseHtmlContent(article.getArticle_content());
doc.add(new Field("content", article.getArticle_content(),
Field.Store.NO, Field.Index.TOKENIZED));
doc.add(new Field("file", article.getArticle_file(), Field.Store.YES,
Field.Index.UN_TOKENIZED));
doc.add(new Field("addtime", new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(article.getModify_time()),
Field.Store.YES, Field.Index.UN_TOKENIZED));
// doc.add(new Field("addtime", aNews.getAddtime()));
// doc.add(Field.UnStored("other", ""));
// String newsUrl = "/srun/news/viewhtml/" + aNews.getHtmlFilePath() +
// "/"
// + aNews.getNid() + ".htm";
// doc.add(Field.UnIndexed("visiturl", newsUrl));
return doc;
}
public void makeNewsInfoIndex(Article article, String indexDir) {
if (null == article) {
return;
}
makeIndex(makeNewsSearchDocument(article), indexDir);
}
public void deleteIndex(Term aTerm, String indexDir) {
List<Term> aList = new ArrayList<Term>();
aList.add(aTerm);
deleteIndex(aList, indexDir);
}
public void deleteIndex(List<Term> terms, String indexDir) {
if (null == terms) {
return;
}
if (!indexExist(indexDir)) {
return;
}
IndexReader reader = null;
try {
reader = IndexReader.open(indexDir);
for (int i = 0; i < terms.size(); i++) {
Term aTerm = (Term) terms.get(i);
if (null != aTerm) {
reader.deleteDocuments(aTerm);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != reader) {
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void deleteNewsInfoIndex(String nid, String indexDir) {
Term aTerm = new Term("nid", nid);
deleteIndex(aTerm, indexDir);
}
public void updateNewsInfoIndex(Article article, String indexDir) {
if (null == article) {
return;
}
deleteNewsInfoIndex(article.getRow_id(), indexDir);
makeNewsInfoIndex(article, indexDir);
}
public void makeAllNewsInfoIndex(List<Article> newsList,
String indexDir) {
List<Term> terms = new ArrayList<Term>();
List<Document> docs = new ArrayList<Document>();
for (int i = 0; i < newsList.size(); i++) {
Article aitem = (Article) newsList.get(i);
if (null != aitem) {
terms.add(new Term("nid", aitem.getRow_id()));
docs.add(makeNewsSearchDocument(aitem));
}
}
deleteIndex(terms, indexDir);
makeIndex(docs, indexDir);
}
public List<SearchResult> search(String searchText, String indexDir) {
// List<Document> docs = new ArrayList<Document>();
List<SearchResult> sr = new ArrayList<SearchResult>();
if (!indexExist(indexDir)) {
return sr;
}
Searcher searcher = null;
try {
StandardAnalyzer analyzer = new StandardAnalyzer();
QueryParser parser = new QueryParser("title", analyzer);
QueryParser parser1 = new QueryParser("content", analyzer);
// 处理检索条件
Query titleQuery = parser.parse(searchText);
Query contextQuery = parser1.parse(searchText);
BooleanQuery query = new BooleanQuery();
query.add(titleQuery, null);
query.add(contextQuery, null);
// 分页检索
searcher = new IndexSearcher(indexDir);
Hits hits = searcher.search(query);
// Scorer scorer = new QueryScorer(query);
for (int i = 1; i <= hits.length(); i++) {
Document docTemp = hits.doc(i - 1);
SearchResult sritem = new SearchResult();
sritem.setArt_title(docTemp.get("title"));
sritem.setArt_file(docTemp.get("file"));
sritem.setArt_time(docTemp.get("addtime"));
String row_id = docTemp.get("nid");
//ArticleSqlMapDao asd = new ArticleSqlMapDao();
Article art = articleDao.getArtById(row_id);
sritem.setArt_class_name(art.getArtclass_name());
String value= getTxtWithoutHTMLElement(art.getArticle_content());
// 对要高亮显示的字段格式化,这里只是加红色显示和加粗
SimpleHTMLFormatter sHtmlF = new SimpleHTMLFormatter(
"<b><font color='red'>", "</font></b>");
Highlighter highlighter = new Highlighter(sHtmlF,
new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(100));
if (value != null) {
TokenStream tokenStream = analyzer.tokenStream("content",
new StringReader(value));
String str = highlighter
.getBestFragment(tokenStream, value);
sritem.setArt_content(str);
}else{
sritem.setArt_content("");
}
sr.add(sritem);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != searcher) {
searcher.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return sr;
}
public String getTxtWithoutHTMLElement (String element)
{
if(null==element||"".equals(element.trim()))
{
return element;
}
Pattern pattern=Pattern.compile("<[^<|^>]*>");
Matcher matcher=pattern.matcher(element);
StringBuffer txt=new StringBuffer();
while(matcher.find())
{
String group=matcher.group();
if(group.matches("<[\\s]*>"))
{
matcher.appendReplacement(txt,group);
}
else
{
matcher.appendReplacement(txt,"");
}
}
matcher.appendTail(txt);
// repaceEntities(txt,"&","&");
// repaceEntities(txt,"<","<");
// repaceEntities(txt,">",">");
// repaceEntities(txt,""","\"");
// repaceEntities(txt," ","");
return txt.toString();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -