【Lucene】具体解释Lucene全文检索的信息写入与读取
Lucene的大致结构图:
信息写入索引库的过程:
读取信息的过程:
以下是一个向索引库写入信息与读取信息的样例:
public void testCreateIndex() throws Exception{
/**
* 1、创建一个student对象,而且把信息存放进去
* 2、调用indexWriter的API把数据存放在索引库中
* 3、关闭indexWriter
*/
// 创建一个Student对象。而且把信息存放进去
Student student = new Student();
student.setId(1L);
student.setName("张三");
// 调用indexWriter的API把数据存放在索引库中
/**
* 创建一个IndexWriter
* 參数三个 1、索引库, 指向索引库的位置 2、分词器
*/
// 创建索引库
Directory directory = FSDirectory.open(new File("./indexDir"));
// 创建分词器
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
IndexWriter indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED);
// 把一个student对象转化成document
Document document = new Document();
Field idField = new Field("id",student.getId().toString(),Store.YES,Index.NOT_ANALYZED);
Field nameField = new Field("name",student.getName(),Store.YES,Index.ANALYZED);
document.add(idField);
document.add(nameField);
indexWriter.addDocument(document);
// 关闭indexWriter
indexWriter.close();
}
public void testSearchIndex() throws Exception{
/**
* 1、创建一个IndexSearch对象
* 2、调用search方法进行检索
* 3、输出内容
*/
// 创建一个 IndexSearch对象
Directory directory = FSDirectory.open(new File("./indexDir"));
IndexSearcher indexSearcher = new IndexSearcher(directory);
// 调用search方法进行检索
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
QueryParser queryParser = new QueryParser(Version.LUCENE_30,"name",analyzer);
Query query = queryParser.parse("张"); // 要查找的关键词
TopDocs topDocs = indexSearcher.search(query, 2); // 前两条
int count = topDocs.totalHits; // 依据关键词查询出来的总的记录数
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
List<Student> studentList = new ArrayList<Student>();
for(ScoreDoc scoreDoc:scoreDocs){
float score = scoreDoc.score; // 关键词得分
int index = scoreDoc.doc; // 索引的下标
Document document = indexSearcher.doc(index);
// 把document转化成Student
Student student = new Student();
student.setId(Long.parseLong(document.get("id"))); // document.getField("id").stringValue()
student.setTitle(document.get("name"));
studentList.add(student);
}
for(Student student:studentList){
System.out.println(student.getId());
System.out.println(student.getName());
}
}
说明:
1、索引库的增、删、改是由indexWriter来操作的
2、同一个时刻内。同一个索引库,仅仅能同意一个indexWriter操作
3、当IndexWriter创建完毕以后,indexwriter所指向的索引库就被占据了。仅仅有当indexWriter.close时。才干释放锁的资源
4、当一个新的indexWriter想拥有索引库时,原来的indexWriter必须释放锁
5、仅仅要索引库中存在write.lock文件,说明上锁了
6、indexWriter.close有两层含义:1. 关闭IO资源; 2.释放锁
文件索引库和内存索引库的结合 :
1、能不能设置非常多个索引库
能够设置非常多个索引库
2、索引库能不能合并起来
假设是内存索引库
Directory ramDirectory = new RamDirectory(Directory d);
这样就能够把一个索引库放入到内存索引库中
利用IndexWriter.addIndexesNoOptimize方法能够把非常多个索引库进行合并操作
3、应用程序能不能在内存中和索引库进行交互
Author:顾故
Sign:别输给以前的自己
posted on 2017-05-11 14:11 cynchanpin 阅读(554) 评论(0) 收藏 举报
浙公网安备 33010602011771号