【Lucene】详解Lucene全文检索的信息写入与读取

来源:互联网 发布:powerdesigner ubuntu 编辑:程序博客网 时间:2024/05/16 01:25

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对象转化成documentDocument 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);// 关闭indexWriterindexWriter.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转化成StudentStudent 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:别输给曾经的自己




0 0
原创粉丝点击