Lucene実戦開発手記(六)---インデックスコードの検索、削除
4209 ワード
特別なところがなくて、知っている友达は見なくてもいいです.
/**
*
* @param keyword
* @param categoryKeyword
* @return
* @throws LuceneException
*/
public List searchIndex(String keyword, String categoryKeyword) throws LuceneException{
Analyzer analyzer = new CJKAnalyzer();
BooleanQuery query = new BooleanQuery();
BooleanClause.Occur[] flags = new BooleanClause.Occur[]{BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};
try {
Query multiQuery = MultiFieldQueryParser.parse(keyword, new String[] {
"topic", "contents" }, flags, analyzer);
query.add(multiQuery, BooleanClause.Occur.MUST);
QueryParser parse = new QueryParser("categoryId",analyzer);
query.add(parse.parse(categoryKeyword), BooleanClause.Occur.MUST);// QueryParser , Query
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new LuceneException();
}
return searchIndex(query);
}
/**
* ,
* @param query
* @return
* @throws LuceneException
*/
public List searchIndex(Query query) throws LuceneException{
List<KbIndexModel> resultList = new ArrayList<KbIndexModel>();
File indexDir = new File(INDEX_STORE_PATH);
Analyzer analyzer = new CJKAnalyzer();
IndexSearcher indexSearcher;
if (indexDir.exists() == false){
return resultList;
}
try {
indexSearcher = new IndexSearcher(IndexReader.open(indexDir));
System.out.println("
Query:"+query.toString()+"--------------------");
Hits hits = indexSearcher.search(query);
//
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(
"<span class=\"searchcontent\">", "</span>");
Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(CONTENTS_SHOW_LENGTH));
for (int i = 0; i < hits.length() && i < MAX_RESULT; i++)
{
Document doc = hits.doc(i);
KbIndexModel resultModel = new KbIndexModel();
resultModel.setId(doc.get("id"));
resultModel.setArticleId(doc.get("articleId"));
resultModel.setFileName(doc.get("fileName"));
resultModel.setCategory(doc.get("category"));
String topic = doc.get("topic");
//
TokenStream tokenStream = analyzer.tokenStream("topic", new StringReader(topic));
String topic2 = highlighter.getBestFragment(tokenStream, topic);
if (topic2 == null){
topic2 = topic;
}
resultModel.setTopic(topic2);
//
String contents = hits.doc(i).get("contents");
tokenStream = analyzer.tokenStream("contents", new StringReader(contents));
String contents2 = highlighter.getBestFragment(tokenStream, contents);
if(contents2 == null){
if (contents == null){
contents2 = "";
}
else if (contents.length() > CONTENTS_SHOW_LENGTH){
contents2 = contents.substring(0, CONTENTS_SHOW_LENGTH);
}
else{
contents2 = contents;
}
}
resultModel.setContents(contents2 + "...");
resultModel.setIndex(i+1);
resultList.add(resultModel);
indexSearcher.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new LuceneException();
}
return resultList;
}
/*
* ID
*/
public void delIndex(String id) throws LuceneException {
IndexReader indexReader;
try {
File indexDir = new File(INDEX_STORE_PATH);
if (indexDir.exists()){
indexReader = IndexReader.open(INDEX_STORE_PATH);
Term term = new Term("id", id);
indexReader.deleteDocuments(term);
indexReader.close();IndexWriter indexWriter = new IndexWriter(INDEX_STORE_PATH, new CJKAnalyzer(), false);
indexWriter.optimize();
indexWriter.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new LuceneException();
}
}