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

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

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

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

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

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

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

构建搜索引擎

步骤1,创建项目

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

cargo new shrimp_enginecd shrimp_enginecode .

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

步骤2,加入依赖项

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

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

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

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

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

步骤3,定义数据结构

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

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

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

步骤4,创建索引

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

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

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

步骤5,搜索

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

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

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

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

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

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

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

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

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

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

搜索引擎的核心机制

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

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

2,查询解析和执行

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

3,检索和显示结果

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

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

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

总结

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

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

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

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

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

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

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 造车两年股价跌六成,小米的估值逻辑变了吗?

    如果从小米官宣造车后的首个交易日起持有小米集团的股票,那么截至2023年上半年最后一个交易日,投资者将浮亏59.16%,同区间的恒生科技指数跌幅为52.78%
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
  • 华为Mate60系列模具曝光:采用硕大圆形后置相机模组+拼接配色方案

    据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将迎来更新,有望在9-10月份带来全新的华为Mate60
Top