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

使用Rust开发小型搜索引擎

一、概述

用Rust创建搜索引擎是探索该语言在性能和安全性方面具有优势的绝佳方式。
这个项目将索引和搜索概念转移到Rust的生态系统中,由于Rust独特的语法和范式,这是一个挑战,但也是有益的。

二、构建搜索引擎

步骤1,创建项目

使用如下命令创建一个Rust新项目:

cargo new shrimp_engine
cd shrimp_engine
code .

步骤2,加入依赖项

需要一些crate来帮助解析和数据处理。例如:
tantivy:用于索引和搜索文本(类似于Java世界中的Lucene)

serde和serde_json:用于JSON解析
将这两个库加入到Cargo.toml文件中:

[dependencies]
tantivy = "0.17"
serde = "1.0"
serde_json = "1.0"

步骤3,定义数据结构

定义我们要索引的文档的结构。定义一个简单的结构体,它表示带有标题和正文的文档。

use serde::{Serialize, Deserialize};#[derive(Serialize, Deserialize, Debug)]
struct Document {title: String,body: String,
}

步骤4,创建索引

使用tantivy,根据数据结构创建索引模式,然后将文档添加到索引中。

use tantivy::{doc, schema::*, Index};fn create_index() -> Index {// 定义Schemalet mut schema_builder = Schema::builder();schema_builder.add_text_field("title", TEXT | STORED);schema_builder.add_text_field("body", TEXT);let schema = schema_builder.build(); // 在目录中创建索引let index = Index::create_in_ram(schema.clone()); // 获取索引写入器let mut index_writer = index.writer(50_000_000).unwrap(); // 添加文档let title = schema.get_field("title").unwrap();let body = schema.get_field("body").unwrap();let doc = doc!(title => "Example Title", body => "This is the body of the document.");let _ = index_writer.add_document(doc); // 将文档提交到索引let _ = index_writer.commit();index
}

Schema定义索引的结构,指定应该索引哪些字段(这里是标题和正文)以及如何(例如,存储、文本分析)创建一个内存索引,并将文档添加到该索引中。添加的每个文档都由Document结构体定义,然后对其进行序列化以进行索引。将更改提交到索引中,使其可搜索。

步骤5,搜索

实现一个搜索索引的函数。我们需要创建一个搜索器和查询解析器。

use tantivy::query::QueryParser;
use tantivy::collector::TopDocs;fn search_index(index: &Index, query_str: &str) -> tantivy::Result<()> {let reader = index.reader()?;let searcher = reader.searcher();let schema = index.schema();let title = schema.get_field("title").unwrap();let body = schema.get_field("body").unwrap();let query_parser = QueryParser::for_index(index, vec![title, body]);let query = query_parser.parse_query(query_str)?;let top_docs = searcher.search(&query, &TopDocs::with_limit(10))?;for (_, doc_address) in top_docs {let retrieved_doc = searcher.doc(doc_address)?;println!("{:?}", retrieved_doc);}Ok(())
}

步骤6,测试搜索引擎,修改main函数

fn main() -> Result<(), TantivyError> {println!("Hello, Shrimp!");// 创建索引并存储它let index = create_index();// 在创建的索引中搜索search_index(&index, "Example")?;Ok(())
}

运行结果如下:

Hello, Shrimp!
Document { field_values: [FieldValue { field: Field(0), value: Str("Example Title") }] }
tantivy crate中的组件用于构建搜索引擎的核心功能,从创建索引到查询索引。

tantivy crate中的组件用于构建搜索引擎的核心功能,从创建索引到查询索引。

搜索引擎的核心机制

1,索引读取器和搜索器:

为了搜索索引,将实例化一个索引读取器,创建一个能够对索引执行查询的搜索器。

2,查询解析和执行

查询解析器解释查询的字符串,并根据已定义的Schema将其转换为查询对象。然后,搜索者使用该查询来查找相关文档并对其进行排序。

3,检索和显示结果

检索并显示最匹配的文档(在一定范围内)。基于搜索查询、提取和审查索引内容。

总结

本示例旨在为你提供构建搜索引擎的起点。Rust的所有权和并发模型,以及它的类型系统,为构建更复杂和高性能的搜索引擎提供了坚实的基础。
我们可以通过添加实时索引、高级文本处理和自定义评分算法等特性来扩展这个项目。

相关文章:

使用Rust开发小型搜索引擎

一、概述 用Rust创建搜索引擎是探索该语言在性能和安全性方面具有优势的绝佳方式。 这个项目将索引和搜索概念转移到Rust的生态系统中&#xff0c;由于Rust独特的语法和范式&#xff0c;这是一个挑战&#xff0c;但也是有益的。 二、构建搜索引擎 步骤1&#xff0c;创建项目…...

2024.3.13

1.顺序表去重 代码&#xff1a; //顺序表去重 void dele(seq_p L) {if(LNULL){printf("入参为空&#xff0c;请检查\n");return;}for(int i0;i<L->len-1;i){for(int ji1;j<L->len;j){if(L->data[i]L->data[j]){dele_data(L,L->data[j]);j--;}…...

schedule() , schedule_work() 以及schedule_timeout_interruptible()区别

schedule() 和 schedule_work() 是 Linux 内核中用于任务调度的两个函数&#xff0c;它们的作用和使用场景有所不同。 schedule() 函数&#xff1a; * 作用&#xff1a;将当前任务放入睡眠状态并调度其他可运行任务的函数。当调用 schedule() 时&#xff0c;当前任务会放弃 CPU…...

AWS入门实践-AWS CLI工具的使用介绍

AWS CLI&#xff08;Amazon Web Services Command Line Interface&#xff09;是一个强大的工具&#xff0c;它允许您直接从命令行与AWS服务进行交互。这不仅可以加快许多任务的处理速度&#xff0c;而且还可以通过脚本自动化。 一、AWS CLI工具的安装 1、Windows 安装下载…...

Xterminal:未来的终端体验

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…...

“光谱视界革新:ChatGPT在成像光谱遥感中的智能革命“

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能…...

Docker Register 搭建私有镜像仓库

1 安装 docker (1)更新软件源 sudo apt update (2)安装 docker 组件 sudo apt install docker.io (3)启动 docker 服务 sudo systemctl start docker (4)设置 docker 服务开机自启动 sudo systemctl enable docker (5)验证 docker 功能 sudo docker contai…...

蓝桥杯真题讲解:三国游戏(贪心)

蓝桥杯真题讲解&#xff1a;三国游戏&#xff08;贪心&#xff09; 一、视频讲解二、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;三国游戏&#xff08;贪心&#xff09; 二、正解代码 //三国游戏&#xff1a;贪心 #include<bits/stdc.h> #define int long lon…...

docker之自己制作jdk镜像

一&#xff0c;下载想要制作的镜像的对应jdk&#xff08;自行下载&#xff09;&#xff0c;本文使用jdk17&#xff08;因为自己的springboot项目时在jdk17下开发的&#xff0c;悲&#xff01;&#xff01;&#xff01;&#xff0c;再加上没有在官网上找到对应镜像&#xff0c;只…...

基于SpringBoot的农产品特色供销系统(蔬菜商城)

基于SpringBoot的农产品特色供销系统&#xff08;蔬菜商城&#xff09; 系统介绍 该系统使用Java、MySQL、Redis、Spring Boot和HTML等技术作为系统的技术支撑&#xff0c;实现了以下功能模块&#xff1a; &#xff08;1&#xff09;后台管理模块&#xff0c;包括权限、日志、…...

【性能】如何计算 Web 页面的 TTI 指标

什么是 TTI 指标 TTI&#xff08;Time To Interactive&#xff09;&#xff0c;即从页面加载开始到页面处于完全可交互状态所花费的时间。页面处于完全可交互状态时&#xff0c;满足以下 3 个条件&#xff1a; 页面已经显示有用内容。页面上的可见元素关联的事件响应函数已经…...

大模型交互-超拟人合成

1、超拟人合成&#xff1a;将文字转化为自然流畅的人声&#xff0c;在实时语音合成的基础上&#xff0c;精准模拟人类的副语言现象&#xff0c;如呼吸、叹气、语速变化等&#xff0c;使得语音不仅流畅自然&#xff0c;更富有情感和生命力。 2、唤醒的持久运行--->合成能力加…...

第十四届蓝桥杯蜗牛

蜗牛 线性dp 目录 蜗牛 线性dp 先求到达竹竿底部的状态转移方程 求蜗牛到达第i根竹竿的传送门入口的最短时间​编辑 题目链接&#xff1a;蓝桥杯2023年第十四届省赛真题-蜗牛 - C语言网 关键在于建立数组将竹竿上的每个状态量表示出来&#xff0c;并分析出状态转移方程 in…...

分布式定时任务调度xxl-job

1. xxl-job基本介绍 1.1 Quartz的体系结构 Quartz中最重要的三个对象:Job&#xff08;作业&#xff09;、Trigger&#xff08;触发器&#xff09;、Scheduler&#xff08;调度器&#xff09;。 xxl-job的调度原理:调度线程在一个while循环中不断地获取一定数量的即将触发的Tr…...

自动化运维利器Ansible基础(环境部署)

Ansible 介绍及安装 1. 介绍 Ansible 是⼀个 IT ⾃动化⼯具。它能配置系统、部署软件、编 排更复杂的 IT 任务&#xff0c;如连续部署或零停机时间滚动更新。 Ansible ⽤ Python 编写&#xff0c;尽管市⾯上已经有很多可供选择的 配置管理解决⽅案&#xff08;例如 Salt、Pupp…...

微服务自动化管理初步认识与使用

目录 一、ETCD 1.1、ETCD简介 对于实施工程师&#xff1a; 1.2、特点 1.3. 使用场景 1.4、 关键字 1.5 工作原理 二、ETCD的安装 2.1、下载路径 2.2、介绍 2.3、具体操作 安装服务端 安装etcd客户端 测试 三、ETCD使用 3.1、前奏具体操作 3.2、 常用操作 一、ET…...

使用Docker管理linux容器

文章目录 一、使用docker管理镜像 二、使用docker管理容器 一、使用docker管理镜像 1、安装操作系统&#xff0c;我安装的是centOS 7 &#xff0c;因为centos7有着非常丰富的软件仓库&#xff0c;方便后续安装与docker相关的软件。 2、初始化设置&#xff0c; 关闭防火墙 关闭…...

CTR之行为序列建模用户兴趣:DIEN

前言 在上一篇文章中 CTR之行为序列建模用户兴趣&#xff1a;DIN&#xff0c;开启了用户行为序列建模用户兴趣的篇章。DIN引入了Attention机制&#xff0c;对于不同的候选item&#xff0c;可以根据用户的历史行为序列&#xff0c;动态地学习用户的兴趣表征向量。但是&#xff…...

1960-2020年全球双边迁移数据库(Global Bilateral MigrationDatabase)

1960-2020年全球双边迁移数据库&#xff08;Global Bilateral MigrationDatabase&#xff09; 1、时间&#xff1a;1960-2000年&#xff0c;每10年一次具体为&#xff1a;1960年、1970年、1980年、1990年、2000年 2、来源&#xff1a;世界银行 3、指标&#xff1a;Country O…...

OpenGL-贴纸方案

OpenGL-贴纸方案 普通贴纸&#xff08;缩放、Z轴旋转、平移&#xff09; OpenGL环境说明 OpenGL渲染区域使用正交投影换算,正常OpenGL坐标是vertexData,这样的 Matrix.orthoM 进行换算 //顶点坐标&#xff08;原点为显示区域中心店&#xff09;private final float[] vertex…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

虚幻基础:角色旋转

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 移动组件使用控制器所需旋转&#xff1a;组件 使用 控制器旋转将旋转朝向运动&#xff1a;组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转&#xff1a;必须移动才能旋转&#xff0c;不移动不旋转控制器…...