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(); } }