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();
}
}
}