
纳西尔
用您的数据缩放的搜索引擎 .
Narsil是一个开源搜索引擎,在一个打入的索引上带有全文,矢量,杂交,和地心搜索. 您可以将 Narsil 嵌入到您的应用程序中, 即引擎在没有网络跳动的情况下进行搜索, 或者将它作为独立的搜索服务器, 配有 REST API, 写头日志, 以及批量 NDJSON 摄入 。 两种形式都包含同样的引擎,它以一种跨语言二进制格式存储索引(.nrsl),这样你就可以将一个索引从一个形式加载到另一个形式.
引擎分出跨工人的大指数,将分出的结果合并成一个排行榜. 此 TypeScript 软件包是该软件的参考执行 .nrsl 格式,以及 一个粗箱和一个去模块 用这些语言为程序设置相同的引擎.
在BEIR SciFact上,纳西尔的BM25排名得分为0.681分nDCG@10分,在0.679的安塞里尼参考数的0.002分以内. 弹性搜索分数为0.679分,OpenSearch分数为0.679分,查询相同. 在"SciFact"上,Narsil回答4200个关键词的查询,在它的高峰时为一秒,而"OpenSearch"则以3,027. 在DBpedia实体1M上,每个引擎被扣在0.99 record上,Narsil在其峰值时回答670个向量查询一秒,而OpenSearch则以869来领先. 随着每台引擎在同一集的推荐出产设置,纳西尔在峰值时回答1,154个向量查询一秒,而OpenSearch则跟随1,111. Narsil在20个关键词中的16个中拥有最高的吞吐量,矢量,以及最新收录的运行中的混合比分:每台引擎在等同的设置下为8个,每台引擎推荐的生产设置下为8个. 在2026-09-28年的运行中 20260928T002255ZGCP c3标准8硬件在我们的中央1-a,我们东1-b,我们西1-a主持发动机. 你会发现每个数据集,每个引擎的设置, 和全方法在 BENCHMARKS.md。 。 。 .
在浏览器中尝试 narsil.sondelali.com/demo 互联网档案馆的存檔,存档日期2013-12-02。在 narsil.sondelali.com/docs (中文(简体) )。 。 。 .
纳西尔 是托尔基安的魔戒之王埃伦迪尔之剑 被打碎后被重塑 名称符合设计,因为引擎将您的数据分割成一个分区,并持续一个分区,然后将结果合并为每个查询的排名列表.
目录
安装
pnpm add @delali/narsil
Narsil在Node.js 22或更新,而Bun,Deno,以及浏览器中工作. 这个 运行时间支持 表格覆盖每次运行的时间.
在macOS,Linux,或Windows下的arm64或x64机上,包管理器还将Narsil的原生搜索核心安装在C中作为可选的依赖,因此引擎通过它来分析文本并解答关键词和向量搜索. 如果您省略了可选的依赖性, Narsil 通过 Web Assembly 和 TypeScript 来完成,结果与浏览器中总是一样.
用编码代理添加 Narsil
这个 纳尔西尔技能 告诉编码代理是嵌入Narsil还是服务它,哪个包可以同时安装,哪个服务器设置可以保证公共地址的安全. 用 CLI 技术将技能安装到机器上的编码代理 :
npx skills add assetcorp/narsil
该技能使代理读取了您项目安装的"纳尔西尔"版本,并将代理发送到该版本的类型和文档. 打开 代理页面,您可以复制一个设置编码代理的提示,用于执行六个搜索任务中的一个.
快开始
import { createNarsil } from '@delali/narsil'
const narsil = await createNarsil()
await narsil.createIndex('products', {
schema: {
title: 'string',
description: 'string',
price: 'number',
inStock: 'boolean',
category: 'enum',
tags: 'string[]',
},
language: 'english',
})
await narsil.insert('products', {
title: 'Mechanical Keyboard',
description: 'Cherry MX Brown switches with PBT keycaps and USB-C connection',
price: 129.99,
inStock: true,
category: 'electronics',
tags: ['peripherals', 'typing', 'mechanical'],
})
const results = await narsil.query('products', {
term: 'mechanical keyboard',
filters: {
fields: {
inStock: { eq: true },
price: { lte: 200 },
},
},
boost: { title: 2.0 },
limit: 10,
})
每一次命中都持有文件,其ID,和其BM25分. 除了点击, results.count 持有匹配文件的总数, results.elapsed 以毫秒计的查询时间,以及 results.coverage 计算答案后面的分区,这样您就可以分辨一个集群何时从其部分数据中解答.
特征
寻取. 对于 全文搜索,引擎使用 BM25 的分数,并且支持场增分,模糊相匹配通过有界限的Levenshtein 相距,通过上字前缀相匹配进行搜索,以及术语覆盖和分数阈值. 您可以将查询与 过滤器、侧面、排序、分组、光标页和粘接结果在您声明的字段上 模式搜索中,过滤器可以在任何值内找到文本 contains,对照通配符模式测试整个值,寻找正则表达式的匹配值,并接受一个或两个在一个 eq 测试。 与 部分词搜索中,查询单词在较长的单词中也匹配,因此搜索 proof 发现 waterproof。 。 。 .
向量和混合检索. 对于 向量搜索,引擎通过同位素相似性,点出产物,或欧几利得距离来比较向量. 它精确地扫描一个字段,直到字段持有1,024个向量,一个您可以改变的计数,之后它会构建一个HNSW图,默认时使用最优化的分量. 在浏览器外,在 macOS 、 Linux 或 Windows 下的 arm64 或 x64 机器上,通过一个图像搜索引擎 c中的原生核,它返回与其WebAssembly搜索相同的结果。 对于 混合搜索,发动机通过对等级聚变或线性混合来导出BM25和矢量排名. 嵌入适配器 在插入和查询时将文本转换为向量,通过OpenAI,本地变换器。 js 模型,或您写的适配器. 查询可以 重新排序 它的顶部点击器是交叉编码器,通过Cohere兼容的再排序服务,本地变形器.js模型,或您所写的适配器.
地理学报. 地理过滤器 以半径匹配文档, 使用 Haversine 或 Vincenty 距离, 或多边形封装 。 您可以将地理过滤器与所有其他查询功能结合起来.
存储. 持久性适配器 在文件系统、索引数据库、内存或后端存储索引。 随着耐久性的提高,发动机保留有有定期检查站的写头日志,并会在坠机后自动恢复. 您可以将整个索引流入一个可移植快照档案, 或者导出其文档为 JSON Lines , 将索引移动到各个版本 。 与 设备同步,手机,笔记本电脑,或浏览器标签从服务器上保存一个索引的副本,在服务器下线时进行搜索并写入.
规模. 引擎将每个文档引导到 a 分区 由决定的散去。 当你打电话 rebalance(),引擎在网络上重塑分区,并缓冲收到的写入以写出头列. 一旦一个索引持有了1000个文档,该引擎就服务于工人复制品在工人线程上的一半的关键字查询,而HTTP服务器则接收持有这些线程上的请求.
行动. 这个 HTTP 服务器 子路径用健康探测器将一个引擎包裹在REST API中,散装NDJSON导入,快照并恢复端点,以及基于任务的长期操作. 这个 客户端 子路径从一个浏览器或从节点调用其中的每一条路由,以引擎自己的方法名. 这个 反应 子路径将读取的方法转换为钩子,可以调用同一页面中的客户端或引擎. 对于观察,你有 事件、插件和内存报告。 。 。 . 语言模块 包括指南所列语言,包括斯瓦希里语、约鲁巴语、豪萨语和其他非洲语言,每个模块都是单独的切入点.
文档
| 指南 | 它包含什么 |
|---|---|
| 配置 | 每个 createNarsil 选项、 工人调制、 分析重建、 以及示意器缓存 |
| 索引和文件 | Schemas,索引管理,插入,读取,更新,去除和分批操作 |
| 全文搜索 | 术语查询、模糊匹配、前缀补全、阈值、突出显示、评分模式和建议 |
| 过滤器、相片和相片 | 字段、阵列、存在和地理过滤器、平面计数、排序、分组、光标和定点 |
| 矢量搜索 | 矢量场、距离测量、HNSW推广、量化、本土搜索核心和图维护 |
| 混合搜索 | 文本和向量排列的对等分级组合和线性混合 |
| 地理搜索 | 半径和多边形过滤器,以及两个相距公式 |
| 嵌入适配器 | 自动嵌入插入和查询、 命名适配器、 捆绑的和自定义的 |
| 重新排队 | 用交叉编码器、捆绑的调整适配器和自定义适配器重排上下接键 |
| 持久性和持久性 | 存储后端、写头日志、检查站、恢复、快照、文件出口和早期发布的索引 |
| 分区和工人 | 分区路线,在线再平衡,工人副本,多站无效 |
| 语文支助 | 每个语言模块,分析修改和重建, 并命名标语器和停止单词 |
| HTTP 服务器 | 将引擎包入 REST API, 它所服务的每一条路由, 以及长期任务 |
| 集群模式 | 多节点索引:节点和角色、复制、路由书写、分布式搜索和阅读,以及集群中失败的呼叫 |
| 客户端 | 从浏览器或节点访问服务器, 执行任务, 以及它提出的代码 |
| Python 客户端 | 从 Python 到达服务器或集群, 以阻塞和同步形式, 以及故障规则 |
| 去客户端 | 从 Go 到达服务器或集群, 流出快照, 以及故障规则 |
| 原生反应 | IOS 或 Android app内部的引擎, 索引所生活的地方、快照、内存和出错 |
| 设备同步 | 搜索和写离线设备、同步路线、冲突以及快照上的索引副本 |
| 更改抓取 | 在后端服务的索引上,每个插入、更新和去除后端服务的种子、过滤器和再链接 |
| 大众查询建议 | 整个搜索,人们运行和点击, 计算每个人, 构建一个建议指数, 隐私权衡 |
| 反应 | 钩在页面中的客户端或引擎上,每个键一个共享请求,从组件装入一个元件 |
| 观察性 | 插件钩子、引擎事件和内存报告 |
| 错误 | 你最常处理的密码 还有三套 NarsilError.code 覆盖 |
这个 规格 定义 .nrsl 格式、分析程序以及每个执行必须坚持的复制变量.
实例
| 示例 | 显示什么 |
|---|---|
| HTTP 服务器 | 发射装置作为REST服务服务,具有耐久性,API-key auth,和多克包装等功能,而每个设置都来自环境. |
| 浏览器 | 该应用程序将引擎嵌入到一个有索引DB持久性和Web Worker搜索的浏览器中. |
| 服务器应用程序 | 该应用程序通过客户端SDK和React hooks将HTTP服务器称为装入corpora作为导入任务. 在其"问"观点中,你可以问关于那些蝎子的问题. |
分发
@delali/narsil/distribution 持有 Narsil 的多节点集群模式:节点和角色,复制,等同测试和进程内测试的可协调适配器,TCP和gRPC的传输与相互的TLS,以及分布式查询路由. 集群节点可以创建,放出,清除,写入,更新,搜索,列表,计数,并跨出每个分区提出建议,它可以改变一个索引的复制因子和分区计数. 一个有耐用目录的节点将它的ID保存在那里,跨越重启,而等效协调器通过TLS连接上一个用户和一个密码. HTTP服务器前方的节点报告集群的健康状况和节点的"Prometheus"度量衡. 这个 集群仪表板实例 启动三个对等的节点,并在剪切网络链接时显示每个分区的状态。 这个 分组指南 覆盖API,包括等协奏器和gRPC运输每个需要的软件包. 将每项执行必须维护的合同改为: packages/spec/distribution。 。 。 .
搜索质量
我们测量排名质量 比利时 《犯罪事实调查》,载有5 183份文件和300起与人有关的判决。 我们把纳西尔和奥拉玛和米尼塞克 在一个过程中进行比较 所有三个词都使用相同的33个Lucene English stop words和默认的BM25参数,虽然每个词的出自英语不同. Narsil拥有3个中最高的nDCG@10.
这些衡量标准的含义是:
- nDCG@10 (中文(简体) ) 衡量最相关的文件是否出现在结果的顶端。 得分1.0意味着完美的排名,而0.0则意味着前十名中没有相关文档出现.
- 页:1 是十大相关结果中的一小部分.
- 地图 跟踪显示相关文档的每个级别上的精确度。 一个更高的MAP表示相关文档集群接近排名的顶端.
- 母 权 衡量第一个相关结果何时出现。 较高的MRR意味着第一个相关文档出现在更接近顶部.
连续集成执行一个单独的 SciFact 回归测试 在同一个机构。 当质量低于校准阈值时,该测试失败了构建.
以 pnpm --filter benchmarks bench -- --tiers relevance。 。 。 . 银行 拥有所有三个引擎的全部质量,吞吐量和耐用表.
纳西尔还充当了搜索服务器. 在BEIR数据集上,我们将服务器与Elasticsearch,OpenSearch,Qdrant,Weaviaate,Tortyense,和Meilisearch进行对比,跨越关键词,矢量和混合检索. 见 全部基准 为这些结果.
运行时间支持
| 运行时间 | 货币 | 持久性 | 无效 |
|---|---|---|---|
| 节点.js | worker_threads | 文件系统 | 基于适应器 |
| 阿宝 | worker_threads | 文件系统 | 基于适应器 |
| 德诺 | 网络工人 | 文件系统 | 广播频道 |
| 浏览器 | 网络工人 | 索引数据库 | 广播频道 |
这个 浏览器示例 显示带有索引DB持久性的嵌入式引擎,而 服务器应用程序示例 在客户端SDK和反应钩上显示相同的接口.
其他语文
| 软件包 | 它会做什么 |
|---|---|
delali-narsil | Rust 箱子在 Rust 程序内创建、修改和搜索索引. |
github.com/assetcorp/narsil/packages/go/engine | Go引擎在Go程序内创建,修改并搜索索引. |
github.com/assetcorp/narsil/packages/go | Go客户端呼叫了Narsil服务器,或一个集群的每一个节点,来自Go. |
narsil-client | Python客户端呼叫一个Narsil服务器,或者一个集群的每一个节点,来自Python. |
@delali/narsil-react-native | 司机将引擎放入iOS或Android应用程序. |
Rust 箱子和 Go 引擎保存每个文件的布局与这个包相同,因此这个包可以打开一个任何一个保存的索引,而任何一个都可以打开这个包保存的索引. 只有这个包持有HTTP服务器和集群模式.
许可证
阿帕奇 - 2.0