首页/新闻资讯/正文详情

【DIY系列:自己动手写分布式搜索引擎】第30篇:查询过程总览与查询类型大观

发布时间:2026/11/5 2:00:42 来源:云帆数科 栏目:资讯中心
【DIY系列:自己动手写分布式搜索引擎】第30篇:查询过程总览与查询类型大观
上一篇【第29篇】索引文件格式详解Lucene 磁盘上的秘密下一篇【第31篇】词查询、模糊匹配与布尔查询摘要前面把索引怎么建、怎么存讲透了这回转到查询侧。一个查询从你敲的 “content:蓝牙 AND price:[100 TO 200]” 字符串到最后吐出带得分的文档列表中间要过 QueryParser 解析、Weight 预计算、Scorer 逐文档打分三道关。本文把这条链路画清楚再给你一张 Lucene 常用查询类型的菜单后面几篇就按这道菜单逐个点菜。一、一次查询的完整旅程用代码触发一次搜索只有一行searcher.search(query, n)但底下流水很长。我们拆成四步看// 第1步字符串 → Query 对象靠解析器QueryqnewQueryParser(content,analyzer).parse(蓝牙 AND 降噪);// 第2步Query → Weight预计算全局统计信息// 第3步Weight → Scorer逐文档打分器// 第4步Scorer 跑完TopDocs 收结果TopDocshitssearcher.search(q,10);把内部旅程画成图你写的字符串 │ QueryParser 解析语法树 → Query 对象 ▼ Query 对象 (如 BooleanQuery 包俩 TermQuery) │ createWeight()先读全局统计(df/totalTerm) ▼ Weight (携带预计算的 IDF 等) │ scorer()生成能遍历匹配文档的打分器 ▼ Scorer (逐文档给出 score) │ Collector 收集 TopN ▼ TopDocs(文档号 得分 列表)这套 Query → Weight → Scorer 的三段式是 Lucene 查询的骨架。理解它你后面看任何查询类型都不会迷路因为它们全是换个方式造 Weight 和 Scorer。二、Query查询的抽象表达Query 是个抽象类代表我要找什么样的文档。它不直接打分只描述查询意图。常见的子类TermQuery找一个词。BooleanQuery把多个子查询用 AND/OR/NOT 组合。PhraseQuery找连续的词序列带 slop 容差。RangeQuery / 数值范围找某个区间。FuzzyQuery带编辑距离容错的词查询。PrefixQuery / WildcardQuery前缀、通配。SpanQuery更精细的位置跨度约束。你手写代码时可以直接 new 这些 Query不依赖字符串也可以从 QueryParser 解析出来。生产里复杂查询往往直接构造 Query 对象避免字符串拼接出错。三、Weight查询的预算阶段Weight 是 Query 在真正打分前的准备阶段产物。它干的事主要是读取全局统计信息这个词在多少文档出现 df、总词频等把 IDF 这类不依赖具体文档的因子先算好。为什么要多这么一层因为打分公式比如 BM25里有一部分因子对所有文档通用IDF、queryNorm提前算一次比每篇文档都重算一遍划算得多。Weight 就是把公共部分预算出来的环节。这点在后面讲 BM25 和打分统计时会反复用到。【Weight 预计算了什么】 TermQuery(蓝牙) ├─ 读 df 蓝牙在多少文档出现 ├─ 算 IDF 越稀有越值钱 └─ 这些和具体文档无关先算好 → 给 Scorer 用四、Scorer逐文档打分的执行者Scorer 拿着 Weight 给的预算去倒排里遍历匹配的文档对每篇算出 score。它才是真正跑的部分。不同查询类型提供不同的 Scorer 实现TermQuery 的 Scorer 直接遍历该词的倒排链BooleanQuery 的 Scorer 把子 Scorer 按 MUST/SHOULD 组合起来求交求并再加权。Scorer 遍历时还有个聪明机制它不一定从文档 0 扫到末尾而是利用倒排链本身的有序性跳跃着取下一个匹配文档呼应咱们 017 篇手写的跳表求交。所以即使索引里有上亿文档只要匹配的少打分很快。五、常用查询类型大观菜单下面这张表是 Lucene 查询的菜单后面几篇会逐个上菜今天先混个脸熟查询类型一句话用途典型场景TermQuery精确找一个词最基础的单词检索BooleanQuery多条件 AND/OR/NOT 组合综合筛选PhraseQuery连续词序列容忍间隔上海交通大学短语RangeQuery区间数值/日期价格 100~200FuzzyQuery编辑距离容错拼写纠错PrefixQuery前缀输入联想WildcardQuery通配符模糊模式SpanQuery精细位置跨度词距约束MatchAllDocsQuery匹配全部遍历/统计【查询类型关系图】 Query(抽象) ┌──────┼───────┬────────┐ Term Boolean Phrase Range │ (组合子Query) (支持数值/日期) │ Fuzzy / Prefix / Wildcard (都是 Term 的变体)六、Collector谁来收结果Scorer 算出一篇篇带分的文档最终由 Collector 决定怎么收集。默认 TopScoreDocCollector 收集得分最高的 N 篇就是 search(q, 10) 的 10。但你也可以写自定义 Collector 干别的比如边遍历边做分组聚合、统计命中总数、或者收集某字段的去重值。Collector 是 Lucene 留给你的结果后处理扩展点后面 033 篇专门讲排序、Filter 和 Collector。【一次搜索的收尾】 Scorer 逐篇打分 → Collector 决定收哪些 ├─ TopScoreDocCollector留得分最高 N 篇 ├─ TotalHitCountCollector只数总数 └─ 自定义聚合 / 去重 / 分组本篇小结一个 Query 的旅程是 QueryParser 把字符串解析成 QueryQuery 经 createWeight 预计算全局统计得到 WeightWeight 生成 Scorer 逐文档打分最后 Collector 收成 TopDocs。这套 Query→Weight→Scorer→Collector 的链路是所有查询类型的共同骨架。今天也给你列了张查询菜单Term/Boolean/Phrase/Range/Fuzzy… 后面几篇就逐个点菜。下一篇先上最基础的三个词查询、模糊匹配与布尔查询。上一篇【第29篇】索引文件格式详解Lucene 磁盘上的秘密下一篇【第31篇】词查询、模糊匹配与布尔查询

相关推荐

c++并发编程的转账案例
c++并发编程的转账案例

欢迎大家的道来你的焦虑来自优秀而不自知我们先把代码奉上&#xff0c;然后一一进行解答&#xff0c;最后整合一下逻辑#include <string> #include <algorithm> #include <memory> #include<mutex> #include<iostream> #include<vector> #… · 2026/11/5 2:00:42

光纤传感器采购比价:同参数报价差异的五步核对方法
光纤传感器采购比价:同参数报价差异的五步核对方法

适用读者&#xff1a;平台运营者、商家、项目方、软硬件采购人员&#xff0c;以及负责工业检测选型的工程技术人员。 > > 解决问题&#xff1a;两份光纤传感器参数表看起来一致&#xff0c;报价却明显拉开&#xff0c;如何判断价差是否合理、该选哪一份。 本文按五个步骤… · 2026/11/5 1:59:42

交接只给了 2 天,我把老师傅的话全录了下来
交接只给了 2 天,我把老师傅的话全录了下来

&#x1f4a1; 岗位交接的场景大同小异&#xff1a;文档一大摞&#xff0c;人只剩几天。但接手一段时间后你会发现&#xff0c;真正帮你少加班的&#xff0c;往往不是那摞文档&#xff0c;而是老师傅嘴里的话——"这个别用""急单找谁""这条流程为什么… · 2026/11/5 1:59:42

混合高斯模型(GMM)聚类算法原理与实战应用
混合高斯模型(GMM)聚类算法原理与实战应用

1. 混合高斯模型聚类实战指南在数据分析领域&#xff0c;聚类算法一直扮演着重要角色。不同于K-means这类硬聚类方法&#xff0c;混合高斯模型&#xff08;GMM&#xff09;通过概率分布的方式描述数据&#xff0c;能够更灵活地处理复杂的数据结构。最近我在一个客户细分项目中成… · 2026/11/5 2:38:01

高并发投票系统架构设计与运营策略解析
高并发投票系统架构设计与运营策略解析

1. 项目背景与活动解析"58万票&#xff01;星特杯投票进入冲刺阶段"这个标题背后反映的是一个典型的线上投票竞赛活动。这类活动在互联网时代已经成为品牌营销、用户互动和社群运营的常见手段。从标题中的"58万票"这个数据量级来看&#xff0c;这显然是一个… · 2026/11/5 2:38:01

NoSQL数据库核心类型与应用场景解析
NoSQL数据库核心类型与应用场景解析

1. NoSQL数据库概述&#xff1a;为什么它成为现代架构的必选项十年前&#xff0c;我们还在为MySQL的单表千万级数据发愁&#xff0c;为分库分表方案争论不休。如今&#xff0c;互联网应用的流量和数据量早已今非昔比——双十一的订单峰值达到每秒58.3万笔&#xff0c;抖音日活用… · 2026/11/5 2:38:01

ArkTS性能优化实战:从原理到HarmonyOS应用
ArkTS性能优化实战:从原理到HarmonyOS应用

1. 为什么你的ArkTS项目跑得慢&#xff1f;作为一名在HarmonyOS生态深耕多年的开发者&#xff0c;我见过太多团队把ArkTS简单地当作TypeScript的方言来写。直到性能问题爆发时&#xff0c;他们才意识到&#xff1a;ArkTS和TS虽然语法相似&#xff0c;但底层运行机制天差地别。最… · 2026/11/5 2:38:01

MIPS 54条多周期CPU:教学级处理器的慢动作解析
MIPS 54条多周期CPU:教学级处理器的慢动作解析

简介&#xff1a;本资源是面向计算机专业本科生的MIPS多周期CPU硬件设计实践项目&#xff0c;聚焦《计算机组成原理》课程核心能力训练&#xff0c;解决从指令集理解、数据通路构建到FPGA板级实现的全流程实践难点。压缩包共539个文件&#xff0c;26.94MB&#xff0c;涵盖66个V… · 2026/11/5 2:38:01

GitHub Copilot Agent模式提升开发效率实战
GitHub Copilot Agent模式提升开发效率实战

1. 项目概述作为一名长期使用VSCode进行开发的程序员&#xff0c;我发现GitHub Copilot的Agent模式正在彻底改变我们的编码方式。这个工具集不仅仅是简单的代码补全&#xff0c;它更像是一位24小时待命的编程助手&#xff0c;能够理解上下文、预测需求&#xff0c;甚至主动提出… · 2026/11/5 2:37:01

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时&#xff0c;Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门&#xff0c;我先说个结论&#xff1a;这事真不难&#xff0c;难的是资料太散、路线太多&#xff0c;今天这个框架明天那个工具&#xff0c;新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师&#xff0c;我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码&#xff0c;在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码