Lucene 6.5 demo

根据Lucene 6.5及JDK 1.8最新版本,写的Demo

package com.lyl.lucene.lucene;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.nio.file.FileSystems;
import java.nio.file.Path;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
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.index.IndexableField;
import org.apache.lucene.index.IndexableFieldType;
import org.apache.lucene.queryparser.classic.ParseException;
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.FSDirectory;
import org.apache.lucene.util.BytesRef;

public class LuceneTest {

    public void createIndex(){
        Path path = FileSystems.getDefault().getPath("F://lucene/index");
        try {
            //1:指定索引库的地址
            FSDirectory directory = FSDirectory.open(path);
            //2 创建分词器,标准分词器
            StandardAnalyzer analyzer = new StandardAnalyzer();
            //3:创建IndexWriterConfig
            IndexWriterConfig config = new IndexWriterConfig(analyzer);
            //4:创建IndexWriter
            IndexWriter writer = new IndexWriter(directory, config);
            writer.deleteAll();//清除以前的index
            File file = new File("F://lucene/data");

            File[] listFiles = file.listFiles();

            for (File f : listFiles) {
                Document document = new Document();
                document.add(new TextField("content",new FileReader(f)));
                document.add(new TextField("name", f.getName(), Field.Store.YES));
                document.add(new TextField("path",f.getAbsolutePath(),Field.Store.YES));

                writer.addDocument(document);
            }

            writer.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void doSearch(){
        Path path = FileSystems.getDefault().getPath("F://lucene/index");
        try {
            //1:指定索引库的地址
            FSDirectory directory = FSDirectory.open(path);
            // 2、创建IndexReader  
            DirectoryReader reader = DirectoryReader.open(directory);

            System.out.println(reader.getVersion());
            System.out.println(reader.maxDoc());
            System.out.println(reader.numDocs());
            // 3、根据IndexReader创建IndexSearch 
            IndexSearcher searcher = new IndexSearcher(reader);
            StandardAnalyzer analyzer = new StandardAnalyzer();
            // 使用QueryParser搜索时,需要指定分词器,搜索时的分词器要和索引时的分词器一致
            // 第一个参数:默认搜索的域的名称
            QueryParser parser = new QueryParser("content", analyzer);
            // 4、创建搜索的Query 
            // 创建Query表示搜索域为content包含hello的文档  
            Query query = parser.parse("hello");
            // 5、根据searcher搜索并且返回TopDocs
            TopDocs topDocs = searcher.search(query, 10);
             // 根据查询条件匹配出的记录总数
            int count = topDocs.totalHits;
            System.out.println("匹配出的记录总数:" + count);

            //6、根据TopDocs获取ScoreDoc对象  
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;

            for (ScoreDoc scoreDoc : scoreDocs) {
                int docID = scoreDoc.doc;
                // 7、根据searcher和ScoreDoc对象获取具体的Document对象
                Document doc = searcher.doc(docID);
                 // 8、根据Document对象获取需要的值  
                System.out.println(doc.get("content"));
                System.out.println(doc.get("name"));
                System.out.println(doc.get("path"));
            }

            reader.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值