XERJ 搜索 Jupyter Notebook:按 Markdown 标题分区索引 .ipynb 与同目录 .py 文件
【免费下载链接】xerjXERJ is the new way for AI to search data. Its autoindex capability activates agents to know your data without the token waste of grep and sed. One command indexes code, docs, logs and PDFs for search, RAG, security audits and agent memory, using 40x fewer tokens than grep. Elasticsearch compatible, so existing clients just work.项目地址https://gitcode.com/GitHub_Trending/xe/xerj点击查看免费下载导读本文介绍 XERJ 如何将 Jupyter Notebook.ipynb与它旁边的.py脚本放进同一个索引让你用一句match查询就能找回几个月前写在 Notebook 里的函数——命中结果不仅告诉你在哪个文件还直接给出 Markdown 标题路径、起始单元格编号cell和可跳转的定位符ax_locator。读完本文你将掌握一条命令完成 Notebook 文件夹的索引、如何查询只有执行过的单元格才出现的输出文本、Notebook 各字段的类型与可过滤方式以及 XERJ 在源码层面如何识别与切分 Notebook。本文内容以 search-jupyter-notebook-cells.mdXERJ 官方捕获运行记录RUN-C为核心骨架并结合仓库源码 extract/ipynb.rs 与 sniff.rs 展开实现细节。一次运行2 个 Notebook 和 1 个 .py 进入同一索引XERJ 的xerj autoindex folder会对文件夹做内容识别 提取 索引。捕获运行中一个包含 2 个 Notebook 和 1 个.py文件的目录被读入同一个数据集jp-docs共产生11 个文档、0 个垃圾文件。xerj autoindex ./notebooks --url http://127.0.0.1:9200 --prefix jp --progress plain命令行参数说明来源cli.rs参数作用默认值--url UES 兼容端点http://localhost:9200--prefix P索引前缀搜索时用jp-*通配ax--progress MODEstderr 上的进度形态auto/plain/json/noneauto--progress-interval SECS进度节拍秒合法范围 1..3600终端下 1否则 5--workers N内容哈希/嗅探与索引两个阶段的并发数每核一个值得注意的约定stdout 是结果stderr 是进度管道场景下两者应分开处理--progress plain强制以每行一条的形态输出进度适合 CI、管道和 Agent 消费。捕获运行中的 2 个 Notebook 来自一个 fixture 生成器按nbformat 4.5写入包含 Markdown 单元格、代码单元格、一个打印输出、一个图片输出和一个错误整个索引过程没有启动任何 Notebook 服务XERJ从不执行 Notebook。提取单元是Markdown 标题分区与每个 cell 一条记录的朴素做法不同XERJ 的 Notebook 提取器以 Markdown 标题为界切分分区每个分区从某个 Markdown 标题开始包含直到下一个标题之前的所有单元格。这样一次命中就能同时返回文件名、分区标题、标题路径以及分区起始的单元格编号。field示例值类型ax_pathokapi-retrieval-sweep.ipynbkeywordax_locatorc3-s0keywordheadingRun the sweepkeywordheading_pathOkapi retrieval sweep Run the sweeptextcell3longlanguagepythonkeywordtitle取自 Notebook 的第一个一级标题无一级标题时取任意级首个标题再退回到文件名 stemlanguage取自内核kernelspec.language缺省时回退到language_info.name再回退到根据内核名推断的语言因此 R、Julia 的 Notebook 会如实标注语言。源码层面分区逻辑在 extract/ipynb.rs 的open_heading中实现遇到 ATX 标题#到######CommonMark 风格最多 3 个空格缩进、#后必须有空格或行尾时把当前分区收尾压入sections再按标题层级维护一个stack用于生成heading_path。三个细节值得注意单元格中间出现标题同样切分第二个 Notebook 以# Evaluation notes开头同一个单元格里还有## Findings于是Findings获得定位符c1.2-s0。定位符必须全局唯一定位符同时作为记录 ID 的键。当同一单元格里开出多个分区时第 2 个及以后的分区使用c{cell}.{k}形式如c3.2-s0避免记录互相覆盖——这正是 ipynb.rs 中prev_cell/k计数所保证的。标题清洗clean_heading会去掉*强调符、代码标记和简单 HTML 标签Notebook 里常见的a id…/a锚点折叠空白但保留_因为 Notebook 中_更常是标识符的一部分如create_app而非斜体标记。c3-s0这类定位符的格式是c{cell}-s{section}c3表示分区从第 3 个单元格1 基开始s0表示该分区的第 0 个切片超长分区按split_sections拆成多片第 2 片起附带section数字字段。Markdown、代码与输出共处一个 body每个分区的body按阅读顺序拼接Markdown 原文保留代码放进以内核语言为语言的代码围栏如python文本输出则以无标签围栏跟在所属单元格之后。捕获运行中Run the sweep分区包含 2 个单元格其 body 里出现了okapi accuracy 0.9137 corpus labelled-20源码 ipynb.rs 中的output_text规定了哪些输出会进入 bodystreamv4/ v3 的stream、pyout、display_data中的text字段先strip_ansi剥掉 ANSI 转义序列再用collapse_redraws折叠进度条重绘\r分隔的同一行只保留最后一次重绘内容text/plain结果execute_result/display_data的data.text/plainerror/pyerr以ename: evalue形式记录如KeyError: missingtraceback 不索引图片输出整体跳过包括图片旁边的text/plain占位文本如Figure size 640x480 with 1 Axes纯 HTML 输出不索引如text/html表格。捕获运行在同一个索引上执行了 4 个查询结果如下queryhits命中的内容matchonbodyforokapi_transform43 个 Notebook 分区 okapi_utils.py的代码文档match_phraseonbodyforokapi experiment notes2两个 Notebook 的开篇分区match_phraseonbodyforokapi accuracy 0.91371Run the sweepcell 3仅来自已执行单元格的存储输出match_phraseonbodyforKeyError q-4041Okapi retrieval sweep Plot the curve A failing runcell 7第 3 个查询最有价值打印的准确率数字只存在于已执行单元格的存储输出里而命中结果直接给出了产生它的分区和单元格curl -s -XPOST http://127.0.0.1:9200/jp-*/_search \ -H content-type: application/json \ -d {query:{match_phrase:{body:okapi accuracy 0.9137}},size:5,_source:[ax_path,ax_locator,heading_path,cell],track_total_hits:true}查询okapi_transform同时命中 Notebook 分区与同目录okapi_utils.py的代码文档说明一个autoindex命令指向同时含 Notebook 与脚本的目录即可让两者进入同一数据集——这正是把 Notebook 与脚本当作一个项目来搜的用法。识别靠内容而非扩展名XERJ 对 Notebook 的判定从不信任文件扩展名。在 sniff.rs 的嗅探流水线中looks_like_notebook在 JSON 分类器之前被调用命中即归入Family::Ipynb。其判定规则源码 ipynb.rsJupyter 与 VS Code 写出的 Notebook 键是排序的因此cells通常是第一个键且首个单元格内会出现cell_type——此时要求前缀中出现cell_typeColab 写出的 Notebook 以nbformat开头nbformat 3 则以metadata开头——此时要求同时存在nbformat版本号与cells或worksheets列表普通 JSON 即便带cells键如电子表格导出、游戏关卡数据没有cell_type不会被误判。仓库测试notebooks_are_recognized_by_content_and_plain_json_is_not验证了这一点名为analysis.json的 Notebook 被嗅探为Ipynb而带cells键的普通 JSONgrid.json仍归为Json。扩展名无关的识别意味着改名、放在任何目录、甚至.json后缀的 Notebook 都能被正确索引。什么内容不会被索引捕获运行明确验证了以下几类内容不进索引图片输出及其旁边的text/plain占位文本如Figure size 640x480 with 1 AxesHTML-only 输出查询图片占位文本、图片数据、HTML 表格均返回 0 命中。输出文本还有三道防线常量定义见 ipynb.rs每条输出最多 40 行MAX_OUTPUT_LINES 40超出部分以… (N more lines)截断——长训练日志不会喧宾夺主占据整个分区同时受4 KiB 字节上限MAX_OUTPUT_BYTES约束行数与字节数两者先到先截终端颜色被剥除、进度条只保留最终状态\r重绘折叠。此外整个 Notebook 的提取文本还有 64 MiB 总上限MAX_BODY_BYTES与 DOCX/PPTX/EPUB 的整文件解析上限一致每个文件最多产出 4096 条记录MAX_RECORDS_PER_FILE。测试outputs_lose_ansi_and_progress_redraws_and_are_capped直接断言了这些行为200 行 epoch 日志只保留前 40 行并追加… (160 more lines)ANSI 序列消失进度条只剩100%|##########|。对内核语言与 nbformat 版本的兼容内核语言优先kernelspec.language其次language_info.name。对于 Colab 这类只写{name: python3}的 Notebooklanguage_of_kernel会根据内核名推断python*→pythonir→Rjulia*→juliadeno→typescript。代码围栏使用该语言标注例如 R Notebook 的代码写进R围栏。nbformat 3worksheets结构、input字段、独立的heading单元格、pyout/pyerr输出都能读取测试nbformat_3_notebooks_are_read_too覆盖。v3 的heading单元格按level字段夹在 1..6切分并写回# {text}原文。标题只在 Markdown 中识别代码围栏里的# 注释、无空格的#hashtag、4 空格缩进的# code都不会被当作标题测试a_hash_in_code_fences_or_without_a_space_is_not_a_heading。遇到~~~围栏同样跳过。纯标题分区折叠# Title后紧跟## Intro这类正文只有标题行的分区其标题行会被并入下一个分区保留各自的标题与起始单元格测试colab_shapes_title_language_and_heading_only_sections验证这正好处理 Colab 教程常见的##### 版权横幅# 标题形态。本捕获未覆盖的边界仅索引了 2 个 Notebook本次运行演示的是提取单元与定位符而非 Notebook 规模下的吞吐行为XERJ不运行、不渲染、不转换Notebook也不通过网络抓取任何内容R Markdown.Rmd、Quarto.qmd以及 Jupytext / marimo 的.pyNotebook 不会按 Notebook 读取本次为单节点运行无副本、无故障转移XERJ 默认嵌入器是词法特征哈希lexical feature hashing384 维混合词法向量查询与改写若无共享词则不会匹配神经嵌入需通过--embed-mode neural显式启用详见 local-embeddings-without-openai-api 中关于嵌入后端的选择说明。以上数字来自RUN-C捕获于 2026-10-05基于main分支 v1.0.0-rc.82 之后的一次构建commit06185966Notebook 提取能力不在 v1.0.0-rc.82 发布版本身中。该二进制为quickprofile 构建因此本次运行不发布任何墙钟性能数字。相关阅读search-json-and-jsonl-logs同属文件与格式主题处理 JSON/JSONL 日志的索引与查询local-embeddings-without-openai-api本地嵌入方案与--embed-mode的选择give-chatgpt-claude-local-file-access将本地索引暴露给 AI 助手的方式。如果你需要复现先启动一个本地 XERJ 节点然后按本文开头命令索引你的 Notebook 目录即可用curl或任意 ES 兼容客户端查询jp-*索引。赞分享【免费下载链接】xerjXERJ is the new way for AI to search data. Its autoindex capability activates agents to know your data without the token waste of grep and sed. One command indexes code, docs, logs and PDFs for search, RAG, security audits and agent memory, using 40x fewer tokens than grep. Elasticsearch compatible, so existing clients just work.项目地址https://gitcode.com/GitHub_Trending/xe/xerj点击查看免费下载相关推荐CMake 环境变量 CMAKE_GENERATOR_TOOLSET 完全指南跨生成器的原生工具集指定机制CMake 环境变量 CMAKE_GENERATOR_TOOLSET 完全指南跨生成器的原生工具集指定机制 本文以 CMake 官方文档 Help/envvaSukiUI Button 控件完整指南样式体系、主题色变体与 Busy/Loading 加载状态实战SukiUI Button 控件完整指南样式体系、主题色变体与 Busy/Loading 加载状态实战 SukiUI 是面向 AvaloniaUI 的开源 UDiskover社区版开源文件索引与搜索引擎Diskover社区版开源文件索引与搜索引擎 项目介绍 Diskover社区版 是一款强大的开源文件索引、文件搜索引擎以及数据管理和分析工具它利用Elast上一篇哪些数据会离开你的MacOpenOats录音同意与隐私合规完全指南下一篇foobox foobar2000 皮肤安装指南亮暗双主题歌词与简介面板全内置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考