上一篇: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的原理与基本使用