文件索引库和内存索引库的交互

package cn.itcast.lucene.directory;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;

import cn.itcast.lucene.domain.Article;
import cn.itcast.lucene.util.DocumentUtils;
import cn.itcast.lucene.util.LuceneUtils;
/**
 * 1.能不能设置多个索引库
 * 	    可以设置多个索引库   一个索引库对应一个IndexWriter
 * 2.索引库能不能合并
 * 	  如果是内存索引库  Directory ramDirectory = new RamDirectory(Directory d);
 *   这样就可以把一个索引库放入到内存索引库中
 *   利用IndexWriter.addIndexesNoOptimize方法可以把很多个索引库进行合并操作
 *   
 * 3.
 *   
 * @author lenovo
 *
 */
public class DirectoryTest {
	/**
	 * 内存索引库
	 *  1.速度比较快
	 *  2.数据时暂时的
	 *  3.内存索引库和文件索引库的特点正好互补
	 * @throws Exception 
	 */
	@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("百度,googled都是很好的");
	    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{
		/*
		 * 当应用程序启动的时候,把文件索引库的内容复制到内存库中
		 * 让内存索引库和应用程序交互
		 * 把内存索引库的内容同步到文件索引库
		 */
		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);//ture是进行覆盖操作  默认是FALSE 追加的
		// 在内存索引库中根据关键词查询
		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("上面的是从文件索引库中查询出来的");
		
	}
}

package cn.itcast.lucene.util;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;

import cn.itcast.lucene.domain.Article;


public class DocumentUtils {
	public static Document article2Document(Article article){
		Document document = new Document();
		Field idField = new Field("id",article.getId().toString(),Store.YES,Index.NOT_ANALYZED);
		Field titleField = new Field("title",article.getTitle(),Store.YES,Index.ANALYZED);
		Field contentField = new Field("content",article.getContent(),Store.YES,Index.ANALYZED);
		document.add(idField);
		document.add(titleField);
		document.add(contentField);
		return document;
	}
	
	public static Article document2Article(Document document){
		Article article = new Article();
		article.setId(Long.parseLong(document.get("id")));
		article.setTitle(document.get("title"));
		article.setContent(document.get("content"));
		return article;
	}
}
package cn.itcast.lucene.util;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class LuceneUtils {
	public static Directory directory;
	public static Analyzer analyzer;
	static{
		try {
			directory = FSDirectory.open(new File("./indexDir"));
			analyzer = new StandardAnalyzer(Version.LUCENE_30);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值