Lucene创建索引和搜索示例

引入的pom文件可以自己去maven中央仓库获取

创建索引和搜索代码

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.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.util.Version;
import java.io.File;
import java.io.FileReader;
 
/**
 * 创建索引和搜索
 * Created by Administrator on 14-3-12.
 */
public class HelloLucenes {
    /**
     * 创建索引
     */
    public void createIndex(){
        try
        {
        //1.创建Directory
        Directory directory=FSDirectory.open(new File("d:/lucene/index0"));
        //2.创建IndexWriter
        IndexWriterConfig iwc=new IndexWriterConfig(Version.LUCENE_47, new StandardAnalyzer(Version.LUCENE_47));
        IndexWriter writer=new IndexWriter(directory,iwc);
        //3.创建Document对象
        Document document=null;
        //4.为Document添加Field
         File file=new File("d:/lucene/data");
         for(File f:file.listFiles())
         {
             document=new Document();
             document.add(new StringField("path", f.getAbsolutePath(), Field.Store.YES));
             document.add(new StringField("filename",f.getName(), Field.Store.YES));
             document.add(new TextField("content",new FileReader(f)));
             //5.通过IndexWriter添加文档到索引中
             writer.addDocument(document);
         }
            writer.close();
        }catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
 
    /**
     * 创建搜索
     */
    public void createSearch()
    {
        try{
            //1、创建Directory
            Directory directory= FSDirectory.open(new File("d:/lucene/index0"));
            //2、创建IndexReader
            IndexReader reader=DirectoryReader.open(directory);
            //3、根据IndexReader创建IndexSearch
            IndexSearcher searcher=new IndexSearcher(reader);
            //4、创建搜索的Query(赤岸感觉Parser来去顶要搜索的文件的内容,第二个参数标示搜索的域)
            QueryParser parser=new QueryParser(Version.LUCENE_47,"content",new StandardAnalyzer(Version.LUCENE_47));
            Query query=parser.parse("father");
            //5、根据search搜索并且返回TopDocs
            TopDocs tds=searcher.search(query,10);
            //6、根据TOpDocs获取ScoreDoc对象
            ScoreDoc[] sds=tds.scoreDocs;
            for(ScoreDoc sd:sds)
            {
                //6、根据search和ScordDoc对象获取具体的Document对象
                Document d=searcher.doc(sd.doc);
                //8、根据Document对象获取需要的值
                System.out.println(d.get("filename")+"["+d.get("path")+"]");
            }
            //9、关闭reader
            reader.close();
 
        }catch (Exception ex){}
    }
}

创建测试类代码

import org.junit.Test;
 
/**
 * 单元测试类
 * Created by Administrator on 14-3-12.
 */
public class HelloLucenesTest {
 
    @Test
    public  void hello(){
        HelloLucenes hl=new HelloLucenes();
        hl.createIndex();
    }
 
    @Test
    public void search(){
        HelloLucenes hl=new HelloLucenes();
        hl.createSearch();
    }
}

使用lucene4.7.0版本创建索引和查询功能,创建索引过程中使用StringField,创建完成后怎么也查询不出内容,结果最后发现StringField的默认构造函数不会分词,所以换成TextField类就可以了。TextField类默认构造函数会分词

----EOF-----

Categories: search-engine Tags: search-engine