最近在做关于大数据量查询,发现Lucene是个不错的选择。关于Luncene3.5的代码在网上不是很多,参考网上一些代码并看API,做出如下代码,有什么问题,给留言。
1.数据库作为数据源,创建索引:
//创建索引
public void createIndex(OpenMode openMode,List<Authors> list){
try {
IndexWriter indexWriter=null;
try {
indexWriter=new LTes ().createIndexWriter(openMode);
} catch (Exception e) {
e.printStackTrace();
}
//List<Authors> list=new PersistenceFacade().query("from Authors where id=300");
for(Authors au:list){
Document doc=new Document();
doc.add(new Field("id",au.getId()+"",Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("authorName",au.getAuthorName(),Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("authorID",au.getAuthorID(),Field.Store.YES,Field.Index.NO));
doc.add(new Field("phone",au.getPhone(),Field.Store.YES,Field.Index.NO));
doc.add(new Field("Address",au.getAddress() ,Field.Store.YES,Field.Index.NO));
doc.add(new Field("City",au.getAuthorID(),Field.Store.YES,Field.Index.NO));
doc.add(new Field("status",au.getPhone(),Field.Store.YES,Field.Index.NO));
doc.add(new Field("zip",au.getPhone(),Field.Store.YES,Field.Index.NO));
//indexWriter.addDocument(doc);
if (indexWriter.getConfig().getOpenMode() == IndexWriterConfig.OpenMode.CREATE)
{
logger.info("OpenModel:CREATE");
indexWriter.addDocument(doc);
}
else
{
logger.info("OpenModel:APPEND");
indexWriter.updateDocument(new Term("id",String.valueOf(au.getId())), doc);
}
}
indexWriter.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
提示: indexWriter.updateDocument(new Term("id","123"), doc);
表示更新ID为123的索引,如果没有则新增。
/**
* 创建索引
* @return
*/
public IndexWriter createIndexWriter(OpenMode openMode)throws Exception{
//索引存放位置设置
Directory dir = FSDirectory.open(new File("E:\\index"));
// 索引配置类设置
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35,
new StandardAnalyzer(Version.LUCENE_35));
iwc.setOpenMode(openMode);
IndexWriter writer = new IndexWriter(dir, iwc);
return writer;
}
2.检索数据:
public List<Authors> search(String queryString) throws Exception{
String[] queryFields={"authorName"};
List<Authors> list=new ArrayList<Authors>();
IndexReader reader=IndexReader.open(FSDirectory.open(new File("E:\\index")));
IndexSearcher searcher=new IndexSearcher(reader);
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_35, queryFields,new StandardAnalyzer(Version.LUCENE_35));
Query query = parser.parse(queryString);
TopDocs results = searcher.search(query,null,1000);
ScoreDoc[] hits=results.scoreDocs;
for(ScoreDoc sd:hits){
int docID=sd.doc;
Document doc=searcher.doc(docID);
Authors authors=new Authors();
authors.setId(Integer.valueOf(doc.get("id")));
authors.setAddress(doc.get("Address"));
authors.setAuthorID(doc.get("authorID"));
authors.setAuthorName(doc.get("authorName"));
authors.setCity(doc.get("city"));
authors.setPhone(doc.get("phone"));
authors.setStatus(doc.get("status"));
authors.setZip(doc.get("zip"));
list.add(authors);
}
return list;
//System.out.println("总符合: " + results.totalHits + "条数!");
}
以上是Lucene3.5创建索引和检索索引的方法。