当前位置:首页 > 科技  > 软件

用Rust制作一个小型搜索引擎

来源: 责编: 时间:2024-02-29 14:43:56 304观看
导读用Rust创建搜索引擎是探索该语言在性能和安全性方面具有优势的绝佳方式。这个项目将索引和搜索概念转移到Rust的生态系统中,由于Rust独特的语法和范式,这是一个挑战,但也是有益的。构建搜索引擎步骤1,创建项目使用如下命

用Rust创建搜索引擎是探索该语言在性能和安全性方面具有优势的绝佳方式。EDc28资讯网——每日最新资讯28at.com

这个项目将索引和搜索概念转移到Rust的生态系统中,由于Rust独特的语法和范式,这是一个挑战,但也是有益的。EDc28资讯网——每日最新资讯28at.com

EDc28资讯网——每日最新资讯28at.com

EDc28资讯网——每日最新资讯28at.com

构建搜索引擎

步骤1,创建项目

使用如下命令创建一个Rust新项目:EDc28资讯网——每日最新资讯28at.com

cargo new shrimp_enginecd shrimp_enginecode .

EDc28资讯网——每日最新资讯28at.com

步骤2,加入依赖项

需要一些crate来帮助解析和数据处理。例如:EDc28资讯网——每日最新资讯28at.com

  • tantivy:用于索引和搜索文本(类似于Java世界中的Lucene)
  • serde和serde_json:用于JSON解析

将这两个库加入到Cargo.toml文件中:EDc28资讯网——每日最新资讯28at.com

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

EDc28资讯网——每日最新资讯28at.com

步骤3,定义数据结构

定义我们要索引的文档的结构。定义一个简单的结构体,它表示带有标题和正文的文档。EDc28资讯网——每日最新资讯28at.com

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

EDc28资讯网——每日最新资讯28at.com

步骤4,创建索引

使用tantivy,根据数据结构创建索引模式,然后将文档添加到索引中。EDc28资讯网——每日最新资讯28at.com

use tantivy::{doc, schema::*, Index};fn create_index() -> Index {    // 定义Schema    let 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}

EDc28资讯网——每日最新资讯28at.com

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

步骤5,搜索

实现一个搜索索引的函数。我们需要创建一个搜索器和查询解析器。EDc28资讯网——每日最新资讯28at.com

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(())}

EDc28资讯网——每日最新资讯28at.com

步骤6,测试搜索引擎,修改main函数EDc28资讯网——每日最新资讯28at.com

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

运行结果如下:EDc28资讯网——每日最新资讯28at.com

Hello, Shrimp!Document { field_values: [FieldValue { field: Field(0), value: Str("Example Title") }] }

EDc28资讯网——每日最新资讯28at.com

tantivy crate中的组件用于构建搜索引擎的核心功能,从创建索引到查询索引。EDc28资讯网——每日最新资讯28at.com

EDc28资讯网——每日最新资讯28at.com

EDc28资讯网——每日最新资讯28at.com

搜索引擎的核心机制

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

为了搜索索引,将实例化一个索引读取器,创建一个能够对索引执行查询的搜索器。EDc28资讯网——每日最新资讯28at.com

2,查询解析和执行

查询解析器解释查询的字符串,并根据已定义的Schema将其转换为查询对象。然后,搜索者使用该查询来查找相关文档并对其进行排序。EDc28资讯网——每日最新资讯28at.com

3,检索和显示结果

检索并显示最匹配的文档(在一定范围内)。基于搜索查询、提取和审查索引内容。EDc28资讯网——每日最新资讯28at.com

EDc28资讯网——每日最新资讯28at.com

EDc28资讯网——每日最新资讯28at.com

总结

本示例旨在为你提供构建搜索引擎的起点。Rust的所有权和并发模型,以及它的类型系统,为构建更复杂和高性能的搜索引擎提供了坚实的基础。EDc28资讯网——每日最新资讯28at.com

我们可以通过添加实时索引、高级文本处理和自定义评分算法等特性来扩展这个项目。EDc28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-75364-0.html用Rust制作一个小型搜索引擎

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: .NET中Enum的应用你知道多少,它的作用和优点是什么?

下一篇: 2023年需求最高的八大编程语言

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的&ldquo;在线鉴别&rdquo;,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 自研Exynos回归!三星Galaxy S24系列将提供Exynos和骁龙双版本

    年初,全新的三星Galaxy S23系列发布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三个版本,全系搭载超频版骁龙8 Gen 2,虽同样采用台积电4nm工艺制
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top