lucene实现简单的全文检索

本文介绍了Lucene实现全文检索的流程,主要包括通过获取文档、分析整理并建立索引库,以及从索引库中进行查询这两个关键步骤。在实际应用中,Lucene的索引库位置可自定义,通过代码示例展示了其实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Lucene实现全文检索的流程

由图可以看出,Lucene实现的全文检索核心就是索引库。索引就是为了快速查找而存在的,比如字典中的索引,关系型数据库中的索引。

Lucene的使用大概分为两个步骤:

  1. 获取文档,分析整理,写入索引库,索引库的存储位置可以自定义
  2. 从索引库中查询

2.代码

/**
 * lucene索引管理器
 */
public class IndexManager {
    private  Directory directory;
    //创建索引
    public  void createIndex(){
        try {
            //创建一个存储索引的目录,除此之外,索引还可以存储在内存中
            directory= FSDirectory.open(new File("E:\\in"));
            //创建一个标准的分析器
            Analyzer analyzer=new StandardAnalyzer();
            //支持中文的分析器
            //Analyzer analyzer=new IKAnalyzer();
            //创建IndexWriterConfig对象,第一个参数为Lucene版本信息,第二个参数为分析器对象
            IndexWriterConfig config=new IndexWriterConfig(Version.LATEST,analyzer);
            //创建IndexWriter对象
            IndexWriter indexWriter=new IndexWriter(directory,config);

            //读文件,这里测试的文件来源于硬盘,实际中可能来源于网络,数据库
            File files=new File("E:\\Test");
           for(File file:files.listFiles()){
               //文件名
               String fileName = file.getName();
               //文件内容
               String fileContent = FileUtils.readFileToString(file,"GBK");
               //fileContent=new String(fileContent.getBytes("GBK"),"UTF-8");
               //文件路径
               String filePath = file.getPath();
               //文件的大小
               long fileSize  = FileUtils.sizeOf(file);


               //创建文件名域,每个文件都可以拆分为不同的域
               //第一个参数:域的名称
               //第二个参数:域的内容
               //第三个参数:是否存储
               Field fileNameField = new TextField("filename", fileName, Field.Store.YES);
               //文件内容域
               Field fileContentField = new TextField("content", fileContent, Field.Store.YES);
               //文件路径域(不分析、不索引、只存储)
               Field filePathField = new StoredField("path", filePath);
               //文件大小域
               Field fileSizeField = new LongField("size", fileSize, Field.Store.YES);

               //创建document对象,
               Document document = new Document();
               document.add(fileNameField);
               document.add(fileContentField);
               document.add(filePathField);
               document.add(fileSizeField);
               //创建索引,并写入索引库
               indexWriter.addDocument(document);
           }

           //提交创建内容
           indexWriter.commit();
           indexWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    //根据关键词进行搜索
    public void searchIndex(){
        try {
            directory= FSDirectory.open(new File("E:\\in"));
            //创建IndexReader对象
            IndexReader indexReader= DirectoryReader.open(directory);
            //创建IndexSearcher对象
            IndexSearcher indexSearcher=new IndexSearcher(indexReader);
            //创建查询对象
            Query query=new TermQuery(new Term("content","发票"));
            //执行查询
            //第一个参数是查询对象,第二个参数是查询结果返回的最大值
            TopDocs topDocs = indexSearcher.search(query, 10);
            //查询结果的总条数
            System.out.println("查询结果的总条数:"+ topDocs.totalHits);

            //遍历查询结果,scoreDoc 存储了document对象的id
            for(ScoreDoc scoreDoc :topDocs.scoreDocs){
                //根据document的id找到document对象
                Document document = indexSearcher.doc(scoreDoc.doc);

                System.err.println(document.get("filename"));
                System.err.println(document.get("content"));
                System.err.println(document.get("path"));
                System.err.println(document.get("size"));
            }

            indexReader.close();

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

    //删除全部索引
   public void deleteAllIndex(IndexWriter indexWriter) throws Exception {
        //删除全部索引
        indexWriter.deleteAll();
        //关闭indexwriter
        indexWriter.close();
    }
}

主方法

public class Main {

    public static void main(String[] args) {
        IndexManager manager=new IndexManager();
        manager.createIndex();
        manager.searchIndex();
    }
}

项目中用到的jar包:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值