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

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

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

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

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

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

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

构建搜索引擎

步骤1,创建项目

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

cargo new shrimp_enginecd shrimp_enginecode .

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

步骤2,加入依赖项

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

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

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

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

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

步骤3,定义数据结构

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

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

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

步骤4,创建索引

使用tantivy,根据数据结构创建索引模式,然后将文档添加到索引中。4IF28资讯网——每日最新资讯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}

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

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

步骤5,搜索

实现一个搜索索引的函数。我们需要创建一个搜索器和查询解析器。4IF28资讯网——每日最新资讯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(())}

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

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

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

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

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

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

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

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

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

搜索引擎的核心机制

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

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

2,查询解析和执行

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

3,检索和显示结果

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

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

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

总结

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

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

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

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

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

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

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    8月5日消息,云存储服务商Backblaze发布了最新的硬盘故障率报告,年故障率有所上升。Backblaze发布的硬盘季度统计数据,其中包括故障率等重要方面。这些结
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
Top