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

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

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

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

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

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

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

构建搜索引擎

步骤1,创建项目

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

cargo new shrimp_enginecd shrimp_enginecode .

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

步骤2,加入依赖项

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

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

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

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

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

步骤3,定义数据结构

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

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

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

步骤4,创建索引

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

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

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

步骤5,搜索

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

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

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

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

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

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

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

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

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

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

搜索引擎的核心机制

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

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

2,查询解析和执行

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

3,检索和显示结果

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

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

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

总结

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

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

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

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

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

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

标签:
  • 热门焦点
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    来源:视听观察永恒文希传媒作为一家MCN公司,说起它的名字来,可能大家会觉得有点儿陌生,但是说出来下面一串的名字之后,或许大家就会感到震惊,原来这么多网红,都签约这家公司了。根
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top