头歌Educoder答案 Lucene - 全文检索入门

作者:是犹橐籥日期:2025/10/2

第1关:使用lucene创建索引

任务描述
本关任务:使用lucene完成索引库的创建。

相关知识
如果你还没有接触过Lucene,那么强烈建议你查看背景知识了解Lucene的基础知识和开发环境的配置,如果你已经学习过Lucene那么你可以根据下列知识尝试完成本关任务。

1package step1;
2import java.io.File;
3import java.io.IOException;
4import org.apache.commons.io.FileUtils;
5import org.apache.lucene.analysis.Analyzer;
6import org.apache.lucene.analysis.standard.StandardAnalyzer;
7import org.apache.lucene.document.Document;
8import org.apache.lucene.document.Field;
9import org.apache.lucene.document.Field.Store;
10import org.apache.lucene.document.LongField;
11import org.apache.lucene.document.StoredField;
12import org.apache.lucene.document.TextField;
13import org.apache.lucene.index.IndexWriter;
14import org.apache.lucene.index.IndexWriterConfig;
15import org.apache.lucene.store.Directory;
16import org.apache.lucene.store.FSDirectory;
17import org.apache.lucene.util.Version;
18public class WriterIndex {
19    //创建索引
20    public static void createIndex() throws IOException{
21      /********** Begin **********/
22    //创建索引库
23        Directory dir = FSDirectory.open(new File("/temp/doc/1101/index"));
24        //创建标准分析器
25        Analyzer analyzer = new StandardAnalyzer();
26        //创建indexwriterConfig对象
27        //第一个参数:lucene的版本信息,可以选择对应的lucene版本也可以使用LATEST
28        //第二个参数:分析器对象
29        IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
30        //创建indexwriter对象
31        IndexWriter index = new IndexWriter(dir,config);
32        //原始文档的路径
33        File resource = new File("source/searchsource");
34        for (File f : resource.listFiles()) {
35            //文件名
36            String fileName = f.getName();
37            //文件内容
38            String fileContent = FileUtils.readFileToString(f);
39            //文件路径
40            String filePath = f.getPath();
41            //文件大小
42            long fileSize = FileUtils.sizeOf(f);
43            //创建文件名域
44            //第一个参数:域的名称
45            //第二个参数:域的内容
46            //第三个参数:是否存储
47            Field fileNameField = new TextField("filename", fileName, Store.YES);
48            //文件内容域
49            Field fileContentField = new TextField("content", fileContent, Store.YES);
50            //文件路径域(不分析、不索引、只存储)
51            Field filePathField = new StoredField("path", filePath);
52            //文件大小域
53            Field fileSizeField = new LongField("size", fileSize, Store.YES);
54            
55            //创建document对象
56            Document document = new Document();
57            //添加field
58            document.add(fileNameField);
59            document.add(fileContentField);
60            document.add(filePathField);
61            document.add(fileSizeField);
62            index.addDocument(document);
63        }
64        //关闭indexwriter
65        index.close();
66          /********** End **********/
67    }
68    
69}

第2关:查询索引

任务描述
本关任务:在索引库中查询指定索引,即在索引库中完成搜索功能。

相关知识
查询索引也是搜索的过程。搜索就是用户输入关键字,从索引(index)中进行搜索的过程。根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容(这里指磁盘上的文件)。

全文检索系统提供用户搜索的界面供用户提交搜索的关键字,搜索完成展示搜索结果。

1package step2;
2import java.io.File;
3import java.io.IOException;
4import javax.sql.rowset.serial.SerialArray;
5import org.apache.lucene.document.Document;
6import org.apache.lucene.index.DirectoryReader;
7import org.apache.lucene.index.IndexReader;
8import org.apache.lucene.index.Term;
9import org.apache.lucene.search.IndexSearcher;
10import org.apache.lucene.search.Query;
11import org.apache.lucene.search.ScoreDoc;
12import org.apache.lucene.search.TermQuery;
13import org.apache.lucene.search.TopDocs;
14import org.apache.lucene.store.Directory;
15import org.apache.lucene.store.FSDirectory;
16public class SearchIndex {
17    
18    public static void searchIndex() throws IOException{
19        /********** Begin **********/
20    //指定索引库存放的路径
21        Directory directory = FSDirectory.open(new File("/temp/doc/1101/index"));
22        //创建indexReader对象
23        IndexReader reader = DirectoryReader.open(directory);
24        //创建indexsearcher对象
25        IndexSearcher searcher = new IndexSearcher(reader);
26        //创建查询
27        Query query = new TermQuery(new Term("content","mybatis"));
28        //执行查询
29        //第一个参数是查询对象,第二个参数是查询结果返回的最大值
30        TopDocs topDocs = searcher.search(query, 10);
31        //查询结束的总条数
32        System.out.println("查询结果的总条数:" + topDocs.totalHits);
33        //遍历查询结果
34        //topDocs.scoreDocs 存储了document对象的id
35        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
36        for (ScoreDoc scoreDoc : scoreDocs) {
37            //sourceDoc.doc属性就是document对象的Id
38            //根据document的id找到document对象的id
39            //根据id获取document对象
40            Document document = searcher.doc(scoreDoc.doc);
41            System.out.println(document.get("path"));
42            System.out.println(document.get("content"));
43        }
44        reader.close();
45        /********** End **********/
46    }
47    
48}
49 

第3关:分词器的使用

任务描述
本关任务:使用分词器对一段文字进行分词处理,获取每一个单词的位置。

相关知识
要完成本关任务,你需要先学习分析器(Analyzer)的使用。

Analyzer
文本文件在被索引之前,需要经过Analyzer处理。Analyzer是由IndexWriter的构造方法来指定的,它负责从被索引文件中提取语汇单元,并提出剩下的无用信息。如果被索引内容不是纯文本文件,那就需要先将其转换为文本文档。

分析器的分析对象为文档,该文件包含一些分离的能被索引的域。

分析器(Analyzer)的执行过程

1package step3;
2import java.io.IOException;
3import org.apache.lucene.analysis.Analyzer;
4import org.apache.lucene.analysis.TokenStream;
5import org.apache.lucene.analysis.cjk.CJKAnalyzer;
6import org.apache.lucene.analysis.standard.StandardAnalyzer;
7import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
8import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
9public class AnalyzerTest {
10    public static void main(String[] args) throws IOException {
11        /********** Begin **********/
12        
13        
14            //创建一个标准分析器对象
15            Analyzer analyzer = new CJKAnalyzer();
16            //获得tokenStream对象
17            //第一个参数:域名,可以随便给一个
18            //第二个参数:要分析的文本内容
19            TokenStream tokenStream = analyzer.tokenStream("test", 
20                    "我喜欢在Educoder上学习");
21            //添加一个引用,可以获得每个关键词
22            CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
23            //添加一个偏移量的引用,记录了关键词的开始位置以及结束位置
24            OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);
25            //将指针调整到列表的头部
26            tokenStream.reset();
27            //遍历关键词列表,通过incrementToken方法判断列表是否结束
28            while(tokenStream.incrementToken()) {
29                //关键词的起始位置
30                System.out.println("start->" + offsetAttribute.startOffset());
31                //取关键词
32                System.out.println(charTermAttribute);
33                //结束位置
34                System.out.println("end->" + offsetAttribute.endOffset());
35            }
36            tokenStream.close();
37        
38        
39        /********** End **********/
40    }
41}

头歌Educoder答案 Lucene - 全文检索入门》 是转载文章,点击查看原文


相关推荐


《系统与软件工程功能规模测量IFPUG方法》(GB/T42449-2023)标准解读
2401_8653825010/1/2025

需注意的是,两类方法在功能点取值上存在差异:NESMA方法中,行标、国标及国际标准ILF默认取值为7,EIF默认取值为5,而北京地标《信息化项目软件开发费用测算规范》(DB11/T1010—2019)及之后的《中国软件行业基准数据》(CSBMK®)与大部分省市如湖南、广西、辽宁、安徽、海南、厦门等地费用标准采用ILF默认取10,EIF默认取7(对应IFPUG方法中功能复杂度为‘中’的情况),这会导致规模计算结果不同。若仅被引用且由其他应用程序识别为内部逻辑文件(ILF),归类为外部接口文件(EIF)。


ChatGPT模型降级事件深度解析:中国卖家的挑战与机遇,应对策略全指南
qmy7569/30/2025

本文深入剖析了ChatGPT模型降级事件对中国卖家的影响,提出了加强自主研发、多元化AI服务布局、深化用户沟通等应对策略,助力中国卖家在这场科技变革中抓住机遇。


[创业之路-643]:互联网与移动互联网行业与通信行业的关系
文火冰糖的硅基工坊2025/10/2

互联网、移动互联网与通信行业三者之间存在着深度嵌套、相互依存、协同发展的关系。它们不是并列的平行产业,而是构成现代信息社会基础设施的“网络之网”。下面从定义、关系结构、产业链角色和技术演进角度系统解析三者之间的关系。 一、基本定义 行业定义通信行业(Telecommunications)提供信息传输通道的基础服务行业,包括语音、数据、视频等信号的物理传输和网络连接能力。核心是“通路”——让信息从A传到B。互联网(Internet)基于TCP/IP协议族构建的全球性计算机网络系统,通过通信网


Android Studio | 设置国内代理(SDK 设置国内代理(阿里云镜像))
指针不南2025/10/2

Android Studio 相关下载设置国内代理(阿里云镜像)(Android Git 仓库 国内代理/阿里云镜像) 简介 Android 上的 Git 存储库。 下载地址 阿里云镜像:https://mirrors.aliyun.com/android.googlesource.com/ 相关链接 官方主页 使用方法 打开设置(settings)。进入“外观与行为”(Appearance & Behavior)。选择“系统设置”(System Settings)。点击“HTT


首屏加载优化总结
excel2025/10/4

一、什么是首屏加载 首屏时间(First Contentful Paint,FCP) :浏览器从输入网址到 首屏内容渲染完成 的时间。 不需要整个网页都渲染完,但首屏区域必须显示内容。 重要性:是衡量用户体验最关键的性能指标之一。 计算方式 监听 DOMContentLoaded document.addEventListener('DOMContentLoaded', () => { console.log('first contentful painting'); });


数据仓库和商务智能考试考点及关系梳理
轩哥Up2025/10/5

一、核心考点分类及具体内容 (一)基础定义与核心区别(高频基础考点) 核心定义 概念 核心含义 关键目标 数据仓库(Data Warehouse, DW) 面向主题、集成、稳定、时变的结构化数据存储系统,通过整合多个数据源(OLTP系统、文件、API等)的历史数据,为企业决策提供统一的数据基础 1. 数据整合:消除数据孤岛,形成企业级统一数据视图; 2. 历史存储:保留长期历史数


Oracle云基础设施强势崛起:AI驱动的新一代云计算竞争格局
qife1222025/10/6

Beyond Stargate: Oracle OCI提升云基础设施吸引力 Oracle与前沿AI模型制造商达成了震撼市场的交易,但专家表示,该公司也加强了对云计算三巨头在企业IaaS领域的挑战。 无论企业AI最终是福音还是泡沫,IT买家现在都需要考虑Oracle云基础设施这个新的主要参与者。Oracle本月频频登上头条,包括9月9日发布的强劲云收入预测,这主要得益于来自前沿模型公司的投资,例如OpenAI和软银的Stargate合资企业,该企业于6月与Oracle签署了4.5吉瓦数据中心协议。


Flutter 应用生命周期:使用 AppLifecycleListener 阻止应用崩溃
JarvanMo2025/10/8

当我刚开始进行 Flutter 开发时,应用生命周期(App Life Cycle)感觉就像一个神秘的黑盒子。为什么我点击 Home 键时我的计时器会停止?为什么我恢复应用时相机有时会崩溃?朋友们,答案就在于应用生命周期。 欢迎关注我的微信公众号:OpenFlutter,感谢。 作为一名 Flutter 开发者,掌握应用生命周期不仅仅是一个好主意——它是构建专业应用的必不可少的条件。它能让你防止应用崩溃、节省用户的电量,并保护他们宝贵的数据。 本指南将详细解析这些关键状态,并使用 AppLif


基于Hadoop的车辆二氧化碳排放量分析与可视化系统|基于Spark的车辆排放量实时监控与预测系统|基于数据挖掘的汽车排放源识别与减排策略系统
计算机源码社2025/10/9

💕💕作者:计算机源码社 💕💕个人简介:本人八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流! 💕💕学习资料、程序开发、技术解答、文档报告 💕💕如需要源码,可以扫取文章下方二维码联系咨询 💕💕Java项目 💕💕微信小程序项目 💕💕Android项目 💕💕Python项目 💕💕PHP项目 💕💕ASP.NET项目 💕�


从0到1微调DeepSeek大模型,LoRA+4位量化让24GB显卡也能玩转
陈敬雷-充电了么-CEO兼CTO2025/10/10

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》(跟我一起学人工智能)【陈敬雷编著】【清华大学出版社】 清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷】 文章目录 GPT多模态大模型与AI Agent智能体系列二百一十六从0到1微调DeepSeek大模型,LoRA+4位量化让24GB显卡也能玩转一、为什么要微调DeepSeek?从“通才”到“专家”的蜕变二、微调核心原理:从损失函数到数据策略

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0