IT技术互动交流平台

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

来源:IT165收集  发布日期:2015-06-11 19:55:16

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、应用程序能不能在内存中和索引库进行交互

延伸阅读:

Tag标签: 全文检索   信息  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规