Lucene 6.10 初级 创建索引库和利用索引库进行搜索!

本文介绍如何使用Lucene创建全文检索索引库,并演示了基于关键词的文档搜索过程。包括索引创建步骤、搜索实现方法及示例结果。

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

Lucene是一个全文检索工具包
笔者这几天刚好在学,做了一些笔记。

首先创建索引库

package per.cr.lucene;

import java.io.File;
import java.nio.file.FileSystems;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;

public class IndexMangers{
    @Test
    public void testCreatLucene() throws Exception {
    //0.创建list来保存多个document
    List<Document> doclist = new ArrayList<Document>();

    // 1.指定文件所在路径
    File files = new File("F:\\dic"); 

    // 2.抓取此文件夹中的所有文件
    for (File file : files.listFiles()) {

        // 3.抓取文件名称
        String fileName = file.getName(); 

        // 4.抓取文件内容
        String fileContext = FileUtils.readFileToString(file);
        // 5.抓取文件大小
        Long fileSize = file.length(); 

        // 6.获取到文件全部信息后,创建文档来保存他们的信息。
        Document doc = new Document(); 

        // 7.将文本文件所有信息转化成键值对的格式
        TextField nameField = new TextField("fileName", fileName, Store.YES);
        TextField contextField = new TextField("fileContext", fileContext, Store.YES);
        TextField sizeField = new TextField("fileSize", fileSize.toString(), Store.YES); 

        // 8.将转化好的对象加入文档中
        doc.add(nameField);
        doc.add(contextField);
        doc.add(sizeField); 

        //9.将doc文档加入到doclist中去
        doclist.add(doc);
    } 

    //10.创建标准分词器对已转化的文档进行分词,标准分词器对英文支持好,中文只能分成一个字
    Analyzer analyzer = new StandardAnalyzer(); 

    //12.创建分词文件存放路径
    FSDirectory dictionary = FSDirectory.open(FileSystems.getDefault().getPath("F:\\dir")); 

    //13.创建indexWrite对象的配置对象
    IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer); 

    //11.创建索引和文档写对象
    IndexWriter indexWriter = new IndexWriter(dictionary,indexWriterConfig); 

    //14.将文档加入索引对象完成对文档的索引
    for(Document doc : doclist){
        indexWriter.addDocument(doc);
    } 

    //15.提交
    indexWriter.commit(); 

    //16.关闭
    indexWriter.close();
}

}

建立好了索引库后可以用Luke查看索引库中的内容
接下来我们利用Lucene中的方法来进行搜索。

package per.cr.lucene;

import java.nio.file.FileSystems;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
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.junit.Test;

public class IndexSearch {
    @Test
    public void search() throws Exception {

        //1.创建分词器,分词器必须与你创建索引库时所使用的分词器一致
        StandardAnalyzer standardAnalyzer = new StandardAnalyzer();

        //2.设置默认搜索域 
        //作用:如果搜索时如果没有指定域只有搜索关键词这时系统会从默认搜索域中搜索
        String Defsearch = "fileContext";

        //3.获取查询对象 
        QueryParser queryParser = new QueryParser(Defsearch, standardAnalyzer);

        //4.创建查询语句
        Query query = queryParser.parse("fileName:2017");

        //5.指定索引库
        FSDirectory dictionary = FSDirectory.open(FileSystems.getDefault().getPath("F:\\dir"));

        //6.创建读取索引库对象
        DirectoryReader directoryReader = DirectoryReader.open(dictionary);

        //7.创建索引库搜索对象
        IndexSearcher indexSearcher = new IndexSearcher(directoryReader);

        //8.开始搜索
        //设置结果数目限制
        int resNum = 10;
        TopDocs topDocs = indexSearcher.search(query, resNum);

        //9.将搜索结果拆分获取结果集
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;

        //10.打印搜索结果
        for(ScoreDoc scoreDoc : scoreDocs){
            //获取结果的文档编号
            int docId = scoreDoc.doc;
            //通过编号去获取对应文档
            Document document = directoryReader.document(docId);
            //打印文档内容
            System.out.println("fileName: "+ document.get("fileName"));
            System.out.println("fileSize: "+ document.get("fileSize"));
            System.out.println("============================================");
        }
    }
}

结果为

fileName: localhost_access_log.2017-01-03.txt
fileSize: 12500
============================================
fileName: localhost_access_log.2017-01-04.txt
fileSize: 114411
============================================
fileName: localhost_access_log.2017-01-05.txt
fileSize: 183246
============================================
fileName: localhost_access_log.2017-01-06.txt
fileSize: 7599
============================================
fileName: localhost_access_log.2017-01-07.txt
fileSize: 318111
============================================
fileName: localhost_access_log.2017-01-08.txt
fileSize: 11173
============================================
fileName: localhost_access_log.2017-02-13.txt
fileSize: 27185

成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值