lucene索引创建与查询入门例子

来源:互联网 发布:淘宝三星官方旗舰店 编辑:程序博客网 时间:2024/06/05 10:38

一、创建索引

import java.io.File;
import java.io.FileReader;
import java.util.Date;


import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;


public class Indexer {


/**
* @param args
*/
public static void main(String[] args) throws Throwable{
//保存索引文件的地方  
        String indexDir = "F:\\testIndex";  
        //将要搜索TXT文件的地方  
        String dateDir = "F:\\testDoc";  
        IndexWriter indexWriter = null;  
        //创建Directory对象  
        Directory dir = new SimpleFSDirectory(new File(indexDir));  
        //创建IndexWriter对象,第一个参数是Directory,第二个是分词器,第三个表示是否是创建,如果为false为在此基础上面修改,第四表示表示分词的最大值,比如说new MaxFieldLength(2),就表示两个字一分,一般用IndexWriter.MaxFieldLength.LIMITED   
        indexWriter = new IndexWriter(dir,new StandardAnalyzer(Version.LUCENE_36),true,IndexWriter.MaxFieldLength.UNLIMITED);  
        File[] files = new File(dateDir).listFiles();  
        for (int i = 0; i < files.length; i++) {  
            Document doc = new Document();  
            //创建Field对象,并放入doc对象中  
            doc.add(new Field("contents", new FileReader(files[i])));   
            doc.add(new Field("filename", files[i].getName(),   
                                Field.Store.YES, Field.Index.NOT_ANALYZED));  
            doc.add(new Field("indexDate",DateTools.dateToString(new Date(), DateTools.Resolution.DAY),Field.Store.YES,Field.Index.NOT_ANALYZED));  
            //写入IndexWriter  
            indexWriter.addDocument(doc);  
        }  
        //查看IndexWriter里面有多少个索引  
        System.out.println("numDocs"+indexWriter.numDocs());  
        indexWriter.close();  
          
}


}


二、查询索引


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


import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.FieldSelector;
import org.apache.lucene.document.MapFieldSelector;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.FilteredQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;


public class Searcher {


/**
* @param args
*/
public static void main(String[] args) throws Throwable{
   //保存索引文件的地方  
        String indexDir = "F:\\testIndex";  
        Directory dir = new SimpleFSDirectory(new File(indexDir));  
        //创建 IndexSearcher对象,相比IndexWriter对象,这个参数就要提供一个索引的目录就行了  
        IndexSearcher indexSearch = new IndexSearcher(dir);  
        //创建QueryParser对象,第一个参数表示Lucene的版本,第二个表示搜索Field的字段,第三个表示搜索使用分词器  
        QueryParser queryParser = new QueryParser(Version.LUCENE_36,  
                "contents", new StandardAnalyzer(Version.LUCENE_36));  
        //生成Query对象  
        Query query = queryParser.parse("contents:book "); 
        Query queryFilter = queryParser.parse("indexDate:20130304");
        
        Filter filter = new QueryWrapperFilter(queryFilter);
        //在结果中找
        query = new FilteredQuery(query,filter);
        filter = new QueryWrapperFilter(queryParser.parse("filename:na*"));
        //搜索结果 TopDocs里面有scoreDocs[]数组,里面保存着索引值  
        TopDocs hits = indexSearch.search(query,filter, 10);  
        //hits.totalHits表示一共搜到多少个  
        System.out.println("找到了"+hits.totalHits+"个");  
        //循环hits.scoreDocs数据,并使用indexSearch.doc方法把Document还原,再拿出对应的字段的值  
        for (int i = 0; i < hits.scoreDocs.length; i++) {  
            ScoreDoc sdoc = hits.scoreDocs[i];  
            Document doc = indexSearch.doc(sdoc.doc); 
//            List<String> list = new ArrayList<String>();
//            list.add("indexDate");
//          //添加选择器,可选择加载哪些Field
//            FieldSelector selector = new MapFieldSelector(list);
//            doc = indexSearch.doc(sdoc.doc, selector);
            System.out.println(doc.get("filename"));  
//            System.out.println(doc.get("contents"));
//            System.out.println(doc.get("indexDate"));
//            for(Fieldable str :doc.getFields()){
//             System.out.println(str);
//            }
//            
//            System.out.println(sdoc);
        }         
        indexSearch.close(); 
}


}
原创粉丝点击