手写Lucene工具类的简单封装与使用

上一篇:Lucene的原理与基本使用

package com.baizhi.util;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import com.baizhi.entity.Si;
import com.baizhi.entity.SiWen;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.IntField;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;



public class LuceneUtil {
	
	private static Version version;//版本
	private static IndexWriterConfig indexConfig;
	private static Analyzer analyzer;//分词器
	private static Directory directory;//文件存放位置
	private static ThreadLocal<IndexWriter> t = new ThreadLocal<IndexWriter>();
	static {
		try {
			directory = FSDirectory.open(new File("F://indexDB"));
			version = Version.LUCENE_44;
			analyzer = new IKAnalyzer();
			indexConfig = new IndexWriterConfig(version, analyzer);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 创建索引库
	 * @param guruWen
	 * @throws Exception
	 */
	public static void createIndexDB(SiWen guruWen) throws Exception{
		IndexWriter indexWriter = getIndexWriter();
		//对象转换为document文件
		Document doc = getDocument(guruWen);
		indexWriter.addDocument(doc);

	}
	/*
	* 索引库的检索  分页
	* keysword 关键字
	* */
	public static  Map<String,Object> findIndexDB(String keysword, Integer page, Integer rows) throws Exception{
	    IndexSearcher indexSearcher = new IndexSearcher(IndexReader.open(directory));
		//根据对象的属性查询
	    String[] fields = {"siNickname","wzName","wzContent"};
		QueryParser queryParser = new MultiFieldQueryParser(version, fields, analyzer);

		Query query = queryParser.parse(keysword);

		Formatter formatter = new SimpleHTMLFormatter("<font color='red'><b>", "</b></font>");
		Scorer scorer = new QueryScorer(query);
		Highlighter highlighter = new Highlighter(formatter, scorer);
		TopDocs search = indexSearcher.search(query, 100000);
		List<SiWen> siWenList = new ArrayList<SiWen>();
		//ScoreDoc 索引标号数组
		ScoreDoc[] scoreDocs = search.scoreDocs;
		int start = (page-1)*rows ;
		int end =  Math.min(scoreDocs.length,page*rows);
		for (int i = start; i < end; i++) {
			int num = scoreDocs[i].doc;
			Document doc = indexSearcher.doc(num);
			highlighter.getBestFragment(analyzer, "wzName", doc.get("wzName"));
			String wz_id = doc.get("wzId");
			String wz_name = highlighter.getBestFragment(analyzer, "wzName", doc.get("wzName"));
			if(wz_name==null){
				wz_name = doc.get("wzName");
			}
			String wz_image = doc.get("wzImage");
			String wz_content = highlighter.getBestFragment(analyzer, "wzContent", doc.get("wzContent"));
			if(wz_content==null){
				wz_content = doc.get("wzContent");
			}
			String guruName = highlighter.getBestFragment(analyzer, "siNickname", doc.get("siNickname"));

			if(guruName==null){
				guruName = doc.get("siNickname");

			}

			String wz_date = doc.get("wzDate");
			Long valueOf = Long.valueOf(wz_date);
			Date date = new Date(valueOf);
			String wz_count = doc.get("wzCount");
			/*GuruWen guruWen = new GuruWen();
			Guru guru = new Guru();*/
			SiWen siWen=new SiWen();
           /* Si si=  new Si();*/
           // si.setSiNickname(guruName);
            //System.out.println("电风扇"+si.getSiNickname());
            /*siWen.setSi(si);*/
            siWen.setWzContent(wz_content);
            siWen.setWzCount(Integer.valueOf(wz_count));
            siWen.setWzDate(date);
            siWen.setWzId(wz_id);
            siWen.setWzImage(wz_image);
            siWen.setWzName(wz_name);
            siWen.setSiNickname(guruName);
            System.out.println("双方都"+siWen);
			siWenList.add(siWen);
		}
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("rows", siWenList);
		map.put("total", search.totalHits);
		return map;
	}

	/**
	 * 索引库的更新
	 * @param
	 * @throws Exception
	 */
	public static void updateIndexDB(SiWen siWen) throws Exception{
		IndexWriter indexWriter = getIndexWriter();
		Document doc = getDocument(siWen);
		indexWriter.updateDocument(new Term("wzId",siWen.getWzId()), doc);
		indexWriter.commit();
	}

	/**
	 * 索引库的 批量删除
	 * @param ids
	 * @throws Exception
	 */
	public static void deleteIndexDB(String[] ids) throws Exception{
		IndexWriter indexWriter = getIndexWriter();
		Term[] terms = new Term[ids.length];
		for (int i=0;i<ids.length;i++) {
			Term term = new Term("wzId",ids[i]);
			terms[i] = term;
		}
		indexWriter.deleteDocuments(terms);
		indexWriter.commit();
	}

	/**
	 * 删除所有
	 * @throws Exception
	 */
	public static void deleteIndexDB() throws Exception{
		IndexWriter indexWriter = getIndexWriter();
		indexWriter.deleteAll();
		indexWriter.commit();
	}

	/**
	 * JavaBean 转换为 Doc
	 * @param
	 * @return
	 */
	public static Document getDocument(SiWen siWen){
		Document doc = new Document();
		doc.add(new StringField("wzId",siWen.getWzId(),Store.YES));
		doc.add(new TextField("wzName",siWen.getWzName(),Store.YES));
		doc.add(new StringField("wzImage",siWen.getWzImage(),Store.YES));
		doc.add(new StringField("wzContent",siWen.getWzContent(),Store.YES));
		//doc.add(new TextField("si",siWen.getSi().getSiNickname(),Store.YES));
        doc.add(new TextField("siNickname",siWen.getSiNickname(),Store.YES));
		doc.add(new LongField("wzDate",siWen.getWzDate().getTime(),Store.YES));
		doc.add(new IntField("wzCount",siWen.getWzCount(),Store.YES));
		return doc;
	}

	/**
	 * 获取indexWriter
	 * @return
	 * @throws Exception
	 */
	private static IndexWriter getIndexWriter()throws Exception{
		IndexWriter indexWriter = t.get();
		if(indexWriter==null){
			indexWriter = new IndexWriter(directory, indexConfig);
			t.set(indexWriter);
		}
		return indexWriter;
	}

	/**
	 * 关闭资源
	 */
	public static void closeAndComit(){
		IndexWriter indexWriter = t.get();
		if(indexWriter!=null){
			try {
				indexWriter.commit();
				indexWriter.close();
				t.remove();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	 
}


上一篇:Lucene的原理与基本使用

猜你喜欢

转载自blog.csdn.net/qq_42806727/article/details/89041280
今日推荐