Lucene-与索引库的交互

/**
 * 1、能不能设置很多个索引库
 *    可以设置很多个索引库
 * 2、索引库能不能合并起来
 *    如果是内存索引库
 *       Directory ramDirectory = new RamDirectory(Directory d);
 *          这样就可以把一个索引库放入到内存索引库中
 *    利用IndexWriter.addIndexesNoOptimize方法可以把很多个索引库进行合并操作
 * 3、应用程序能不能在内存中和索引库进行交互
 * @author Administrator
 *
 */
public class DirectoryTest {
	/**
	 * 内存索引库
	 *    *  速度比较快
	 *    *  数据是暂时的
	 *    *  内存索引库和文件索引库的特点正好互补 
	 */
	@Test
	public void testRam() throws Exception{
		Directory directory = new RAMDirectory();
		IndexWriter indexWriter = new IndexWriter(directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
		Article article = new Article();
		article.setId(1L);
		article.setTitle("lucene可以做搜索引擎");
		article.setContent("baidu,google都是很好的搜索引擎");
		indexWriter.addDocument(DocumentUtils.article2Document(article));
		indexWriter.close();
		this.showData(directory);
	}
	
	private void showData(Directory directory) throws Exception{
		IndexSearcher indexSearcher = new IndexSearcher(directory);
		QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30,new String[]{"title","content"},LuceneUtils.analyzer);
		Query query = queryParser.parse("lucene");
		TopDocs topDocs = indexSearcher.search(query, 10);
		ScoreDoc[] scoreDocs = topDocs.scoreDocs;
		List<Article> articleList = new ArrayList<Article>();
		for(ScoreDoc scoreDoc:scoreDocs){
			Document document = indexSearcher.doc(scoreDoc.doc);
			articleList.add(DocumentUtils.document2Article(document));
		}
		
		for(Article article:articleList){
			System.out.println(article.getId());
			System.out.println(article.getTitle());
			System.out.println(article.getContent());
		}
	}
	
	/**
	 * 文件索引库和内存索引库的结合
	 */
	@Test
	public void testRamAndFile() throws Exception{
		/**
		 * 1、当应用程序启动的时候,把文件索引库的内容复制到内存库中
		 * 2、让内存索引库和应用程序交互
		 * 3、把内存索引库的内容同步到文件索引库
		 */
		Directory fileDirectory = FSDirectory.open(new File("./indexDir"));
		Directory ramDirectory = new RAMDirectory(fileDirectory);
		IndexWriter ramIndexWriter = new IndexWriter(ramDirectory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
		IndexWriter fileIndexWriter = new IndexWriter(fileDirectory,LuceneUtils.analyzer,true,MaxFieldLength.LIMITED);
		/**
		 * 在内存索引库中根据关键词查询
		 */
		this.showData(ramDirectory);
		
		
		System.out.println("上面的是从内存索引库中查询出来的");
		
		/**
		 * 把一条信息插入到内存索引库
		 */
		Article article = new Article();
		article.setId(1L);
		article.setTitle("lucene可以做搜索引擎");
		article.setContent("baidu,google都是很好的搜索引擎");
		ramIndexWriter.addDocument(DocumentUtils.article2Document(article));
		ramIndexWriter.close();
		
		/*
		 * 把内存索引库中的内容同步到文件索引库中
		 */
		fileIndexWriter.addIndexesNoOptimize(ramDirectory);
		fileIndexWriter.close();
		this.showData(fileDirectory);
		System.out.println("上面的是从文件索引库中查询出来的");
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值