使用 Lucene 搜索你的 Bean — 索引
作者来自 Elastic David Pilato在上一篇文章中我们将 Lucene 添加到了 Maven 中选择了一个 analyzer并将TrackBean 映射为一个可用于搜索的LuceneDocument。这只是故事的一半你仍然需要一个用于管理索引的小型类 — — 同时你还应该了解对于像bob这样的 token 来说“倒排”究竟意味着什么。管理索引生命周期将 Lucene 的底层类型封装在一个专门用于你的Bean 的类中。创建 directory 和 writer重新构建索引或进行修改并在进程关闭时关闭所有资源。这个 playground 也使用内存中的ByteBuffersDirectory来完成相同的操作 — — 直接使用addDocument(doc)暂时还不进行 facet 重写Directory dir new ByteBuffersDirectory(); // Create the index writer with the analyzer IndexWriter writer new IndexWriter(dir, new IndexWriterConfig(analyzer)); // Create Lucene doc for track #255465792: Ultra Naté - Free (Bob Sinclar Remix) Document doc255465792 mapper.toDocument(Tracks.trackFrom(255465792)); writer.addDocument(doc255465792); // Index track #172523747: Daft Punk - Around The World Document doc172523747 mapper.toDocument(Tracks.trackFrom(172523747)); writer.addDocument(doc172523747); // Index track #106352474: Claude François - Cette année-là Document doc106352474 mapper.toDocument(Tracks.trackFrom(106352474)); writer.addDocument(doc106352474); // Commit all the documents that have been indexed so far writer.commit();对于完整的库在一个写锁下清空并重新加载public void rebuild(ListTrack tracks) throws IOException { synchronized (writeLock) { writer.deleteAll(); for (Track track : tracks) { writer.addDocument(TrackDocumentMapper.toDocument(track)); } writer.commit(); } }ByteBuffersDirectory将整个索引保存在堆中——非常适合在进程启动时重新构建本地库。如果需要在重启后保留数据则可以换成FSDirectory.open(path)。按 id 执行 Upsert / 删除public void upsert(Track track) throws IOException { synchronized (writeLock) { writer.updateDocument( new Term(TrackDocumentMapper.ID, track.id()), TrackDocumentMapper.toDocument(track)); writer.commit(); } } public void deleteById(String trackId) throws IOException { synchronized (writeLock) { writer.deleteDocuments(new Term(TrackDocumentMapper.ID, trackId)); writer.commit(); } }Closewriter.close(); directory.close(); // order matters — writer first如果索引由多个请求线程共享请使用锁来串行化 mutation。保持索引处于热状态并保持一致在启动时从事实来源重新构建一次。对于单行编辑优先使用按 id 执行 upsert / delete对于批量操作或同步失败则使用完整重建。永远不要将 Lucene 视为权威数据源。实际数据~4k 条 track在一个包含4,322条 track 的本地音乐库中使用内存中的ByteBuffersDirectory一次完整重建的情况如下指标值文档数4,322耗时~400 ms使用的内存~1.1 MB因此对于几千个 Bean 来说完整重建的成本足够低可以在启动时执行 — — 即使增量同步失败也可以将其作为回退方案。如果稍后添加 suggest dictionary它会存放在自己的Directory中并额外占用少量 RAM。倒排索引统一技术术语和中英文格式修正双破折号的排版格式字段title上的 termbob包含该 token 的文档的 posting list。提交后Lucene不会在每个文档中保存一个单词集合。它保存的是一个倒排映射term → 文档posting list。在title上输入bob你会读取每个标题 token 化为bob的 track — — 包括Free (Bob Sinclar Remix)。artist上也是同样的原理。经过分析后6 个 track 对应 4 个不同的名称文档Artist存储值1、3Bob Sinclar2Bob Marley4、5Claude François6François ValeryLucene 不会存储这张表。它存储的是排序后的倒排映射 — — 转换为小写并进行 ASCII 折叠François→francoisartist:bob → 1, 2, 3 artist:claude → 4, 5 artist:francois → 4, 5, 6 artist:marley → 2 artist:sinclar → 1, 3 artist:valery → 6这个 posting list 就是你进行搜索时所使用的内容。我们将在下一篇文章中详细介绍这一点。完整演示代码位于 GitHublucene-search-tracks。原文Search your beans with Lucene — Index | David Pilato

相关新闻

Altium Designer投板必看:Gerber、钻孔、BOM、坐标文件输出全攻略

Altium Designer投板必看:Gerber、钻孔、BOM、坐标文件输出全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:06:07 阅读更多 →
期刊投稿前夜必查的 10 个格式细节,一文讲清(建议收藏

期刊投稿前夜必查的 10 个格式细节,一文讲清(建议收藏

论文被期刊编辑部退回修改,最冤的理由不是学术问题,而是格式问题——参考文献著录不规范、图表编号错乱、AIGC 占比超标。这篇把投稿前夜该自查的细节整理成清单,照着勾一遍再点"提交"。特别提醒:各期刊格式要求不一&am…

2026/10/7 15:05:06 阅读更多 →
电竞论文别硬熬:从开题到问卷数据,我会这样搭一套 AI 辅助组合 [特殊字符]

电竞论文别硬熬:从开题到问卷数据,我会这样搭一套 AI 辅助组合 [特殊字符]

如果你读的是电子竞技运动与管理,大概率会遇到一种很典型的“毕业论文分裂感”: 平时聊赛事、俱乐部、选手、观众运营头头是道,可真要写《城市主场电竞赛事现场观众满意度与重访意愿研究》这类题目时,马上要同时面对文献综述、问卷…

2026/10/7 15:05:06 阅读更多 →

最新新闻

FPGA时序收敛必会:report_timing参数详解与实战路径定位

FPGA时序收敛必会:report_timing参数详解与实战路径定位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:41:00 阅读更多 →
Livox MID360与Fast-LIO2固态激光雷达建图实战部署指南

Livox MID360与Fast-LIO2固态激光雷达建图实战部署指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:41:00 阅读更多 →
水果图像识别实战:小数据集下的PyTorch轻量分类方案

水果图像识别实战:小数据集下的PyTorch轻量分类方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:41:00 阅读更多 →
set_data_check本质:数据有效性窗口的硬性断言

set_data_check本质:数据有效性窗口的硬性断言

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:41:00 阅读更多 →
AI工程化实战:Agent容错、AI编程与测试开发核心方法

AI工程化实战:Agent容错、AI编程与测试开发核心方法

1. 今日热榜速览:AI圈这个假期前夜在讨论什么2026年9月30日,工作日的最后一天,AI圈却一点没有要放假的意思。早上翻完订阅的行业频道、GitHub Trending和几个技术群,消息列表依旧刷得飞快。今天的高频词集中在几个方向&#xff1a…

2026/10/7 15:41:00 阅读更多 →
JavaWeb博客系统毕设源码使用指南:从环境配置到答辩拿高分

JavaWeb博客系统毕设源码使用指南:从环境配置到答辩拿高分

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:39:59 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:13 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →