当前位置: 首页 > news >正文

搜索百科(1):Lucene —— 打开现代搜索世界的第一扇门

大家好,我是 INFINI Labs 的石阳。

这是《搜索百科》专栏系列文章,每天 5 分钟,带你速览一款搜索相关的技术或产品,同时还会带你探索它们背后的技术原理、发展故事及上手体验等。

搜索技术看似专业,但它早已深度融入我们的日常生活。无论是电商搜索、知识检索,还是 AI 语义搜索、RAG、向量检索,背后都有经典与新兴技术的结合。希望这个系列能帮大家建立更清晰的认知,也欢迎留言交流。

引言:为什么先写 Lucene?

如果你曾用 GitHub 搜代码、用电商网站搜商品,或者在日志平台里“捞”报错,你就已经享受了 Lucene 的红利——只是自己还不知道。今天,让我们认识下这位“幕后大佬”,看看它如何以一己之力,孵化了整个现代搜索江湖。没有它,就没有 Elasticsearch 的锋芒,也没有 Solr 的稳健。讲搜索,不从 Lucene 开始,就像讲武侠不提《易筋经》——根基都丢了。

诞生故事:一个程序员的“副业”成果

Lucene 的诞生颇具传奇色彩。它的创造者 Doug Cutting(后来也是 Hadoop 的创始人之一)在 1997 年开始开发 Lucene,最初是为了给他的个人项目——一个网络爬虫和搜索引擎——提供搜索能力。

当时,市面上并没有成熟的开源搜索库可用,Doug 决定自己写一个。他在业余时间一点点打磨,最终在 1999 年发布了第一个版本。2001 年,Lucene 加入了 Apache 软件基金会,成为 Apache 的第一个开源搜索项目。

有趣的是,Lucene 的名字并不是来自什么技术术语,而是取自 Doug Cutting 妻子的中间名——Lucene。这也让这个项目多了一丝浪漫的色彩。

Lucene 概述

Apache Lucene,是一个用 Java 编写的高性能、全文搜索引擎库。它不是那种你下载下来就能直接用的“搜索软件”,而是一个底层库,就像乐高积木里的基础砖块,虽然不起眼,但没有它,很多搜索产品根本搭不起来。

Lucene 提供了强大的索引和查询能力,支持分词、倒排索引、相关性评分、模糊查询、布尔查询等一系列功能。它是 Elasticsearch、Solr、Easysearch、OpenSearch 等现代搜索引擎的核心引擎。

  • 首次发布:1999 年
  • 最新版本:截至 2025 年 9 月,Lucene 已更新至 10.2.x 系列
  • 开源协议:Apache License 2.0(商业友好)
  • 官网:https://lucene.apache.org/
  • GitHub:https://github.com/apache/lucene

社区生态

虽然已经 25 岁"高龄",Lucene 的社区却依然活力满满。作为 Apache 软件基金会的顶级项目,它拥有:

  • 100+ 活跃贡献者
  • 每月都有新的 commit 和 issue 处理
  • 每年发布 2-4 个主要版本
  • 完善的文档和活跃的邮件列表

虽然不像 Elasticsearch 那样“出圈”,但在开发者和企业内部系统中仍有广泛使用。

功能亮点:为什么大家都爱它?

  • 高性能全文检索内核:倒排索引、短语/布尔/通配符/模糊查询、相关性打分。
  • 面向工程的可扩展分析链:分词器、过滤器、同义词、停用词、高亮、排序等。
  • 近邻向量检索(KNN):原生支持高维向量的最近邻搜索,为语义检索/RAG 奠基。 
  • 嵌入式 & 纯 Java:作为库嵌入任意 Java 应用,掌控细粒度行为与性能。
  • 成熟稳定的版本线:9.x 与 10.x 并行演进,兼顾稳定与新特性。

对比优势:Lucene vs 世界

产品类型与 Lucene 的关系
Elasticsearch分布式引擎基于 Lucene,提供分布式、RESTful 接口
Apache Solr搜索平台基于 Lucene,提供 Web 管理界面和更多功能
Meilisearch轻量引擎不基于 Lucene,用 Rust 编写,主打易用性

Lucene 是底层引擎,而其他产品是在它之上构建的完整解决方案。如果你想要完全控制搜索逻辑,Lucene 是最佳选择;如果你想要开箱即用的搜索服务,可以考虑 Elasticsearch 或 Solr。

快速上手:10 分钟体验 Lucene

虽然 Lucene 需要写一些 Java 代码,但其实入门并不复杂。

1. 环境准备

// Maven 依赖
<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>10.xx.xx</version>
</dependency>

2. 创建你的第一个索引

// 创建分析器(支持中文)
Analyzer analyzer = new StandardAnalyzer();// 创建索引
Directory directory = FSDirectory.open(Paths.get("index"));
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(directory, config);Document doc = new Document();
doc.add(new TextField("content", "欢迎来到 Lucene 的世界", Field.Store.YES));
writer.addDocument(doc);
writer.close();

3. 执行搜索

// 搜索 "Lucene"
Query query = new TermQuery(new Term("content", "lucene"));
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs results = searcher.search(query, 10);System.out.println("找到 " + results.totalHits + " 条结果");

几行 Java 代码,就能完成一个迷你搜索引擎。

结语

Apache Lucene 虽然不是面向最终用户的产品,但它是搜索技术的基石。几乎所有现代搜索引擎都离不开它。如果你对搜索技术有兴趣,学习 Lucene 是理解搜索引擎工作原理的最佳途径。


🚀 下期预告
下一篇,我将介绍 Lucene 的第一个"孩子"—— Apache Solr,看看这个基于 Lucene 的企业级搜索平台如何让搜索变得更简单。

💬 三连互动

  1. 你或公司最近在用 Lucene 吗?拿来做了什么场景?
  2. 你觉得 Lucene 最香 / 最坑的点是什么?
  3. 下一期想先看 Solr 还是 Elasticsearch ?留言告诉我,我来插队!

对搜索技术感兴趣的朋友,欢迎关注《搜索百科》专栏,一起探讨与学习!

原文:https://infinilabs.cn/blog/2025/search-wiki-1-lucene/


文章转载自:

http://PjY5dGH9.jzLkq.cn
http://vFpkiKP2.jzLkq.cn
http://2swz403i.jzLkq.cn
http://TKuCv47F.jzLkq.cn
http://NYc9LvQ4.jzLkq.cn
http://Os9boye8.jzLkq.cn
http://mWkRA04i.jzLkq.cn
http://U5Liz56Z.jzLkq.cn
http://0u6004QX.jzLkq.cn
http://znEtTrqr.jzLkq.cn
http://kJx3bBCZ.jzLkq.cn
http://K2pmxgXI.jzLkq.cn
http://HdOxCb5x.jzLkq.cn
http://uTUtuqPD.jzLkq.cn
http://CXR54oAt.jzLkq.cn
http://7H4MaBma.jzLkq.cn
http://vLeiAWYG.jzLkq.cn
http://cCOeepcA.jzLkq.cn
http://qzXPXnvl.jzLkq.cn
http://iG6jfrsG.jzLkq.cn
http://eiLztWhy.jzLkq.cn
http://GjKgphs9.jzLkq.cn
http://UMVqh5YM.jzLkq.cn
http://tuBFd7B6.jzLkq.cn
http://qpVjQDeL.jzLkq.cn
http://7YJFl0lW.jzLkq.cn
http://JoMRqu0p.jzLkq.cn
http://Jmfbe3Bz.jzLkq.cn
http://lCYlovZM.jzLkq.cn
http://s2Lkb5aQ.jzLkq.cn
http://www.dtcms.com/a/387534.html

相关文章:

  • 学习日记-JS+DOM-day57-9.17
  • Java异常处理最佳实践指南
  • Ansible简介
  • pytest使用总结笔记
  • 在VSCode中设置Qt开发环境
  • 斜杠命令Slash Commands:Roo Code 的自动化利器
  • 大数据毕业设计选题推荐-基于大数据的慢性肾病数据可视化分析系统-Spark-Hadoop-Bigdata
  • 基于红尾鹰优化的LSTM深度学习网络模型(RTH-LSTM)的一维时间序列预测算法matlab仿真
  • TDengine IDMP 基本功能——数据可视化(2. 柱状图)
  • Python与Google Earth Engine (GEE) 实现地理空间数据自动化处理:高效分析与批量任务执行
  • Dify Agent + AntV 实战:从 0 到 1 打造数据可视化解决方案
  • 系统架构设计师备考第25天——软件测试
  • 十、vue3后台项目系列——登录页面的搭建
  • 在博主内容推送系统中,通过RabbitMQ异步解耦及消息持久化+重试机制,使推送效率提升300%,成功率提升至99.9%的原理及实现
  • 【FreeRTOS】二值信号量vs互斥量核心差异
  • 记一次golang结合前端的axios进行预签名分片上传遇到403签名错误踩坑
  • LeetCode 面试经典 150_哈希表_单词规律(41_290_C++_简单)
  • 微信小程序修改页面导航标题的方式
  • Torch-Rechub学习笔记-task1
  • LightTools照明光学系统设计
  • 从技术探索到社区共建:程宇翔的隐私计算开源之路
  • 【Redis】云原生时代Redis高可用新范式:多活架构+异地容灾 生成详细内容
  • JsonCpp: 一个好用且轻量级的JSON解析库
  • 【设计模式】桥接模式
  • ACP(五):优化提示词(Prompt),精细地控制大模型的输出
  • Egg.js 性能测试全解析:从压力测试到深度调优
  • 自制脚本,解决Ubuntu20.04 键盘会突然失灵、键盘延迟突然很大问题
  • 172.在vue3中使用openlayers:引用 hover 效果,展示各种鼠标 cursor 样式
  • SpringBoot Oracle
  • LLMs之IR:《MUVERA: Multi-Vector Retrieval via Fixed Dimensional Encodings》的翻译与解读