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

来源:互联网 发布:网购网络诈骗 编辑:程序博客网 时间:2024/04/28 07:42
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  */@Testpublic 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());}}/** * 文件索引库和内存索引库的结合 */@Testpublic 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();}}}


0 0
原创粉丝点击