日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

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

來源: 責(zé)編: 時間:2024-02-29 14:43:56 212觀看
導(dǎo)讀用Rust創(chuàng)建搜索引擎是探索該語言在性能和安全性方面具有優(yōu)勢的絕佳方式。這個項(xiàng)目將索引和搜索概念轉(zhuǎn)移到Rust的生態(tài)系統(tǒng)中,由于Rust獨(dú)特的語法和范式,這是一個挑戰(zhàn),但也是有益的。構(gòu)建搜索引擎步驟1,創(chuàng)建項(xiàng)目使用如下命

用Rust創(chuàng)建搜索引擎是探索該語言在性能和安全性方面具有優(yōu)勢的絕佳方式。KsH28資訊網(wǎng)——每日最新資訊28at.com

這個項(xiàng)目將索引和搜索概念轉(zhuǎn)移到Rust的生態(tài)系統(tǒng)中,由于Rust獨(dú)特的語法和范式,這是一個挑戰(zhàn),但也是有益的。KsH28資訊網(wǎng)——每日最新資訊28at.com

KsH28資訊網(wǎng)——每日最新資訊28at.com

KsH28資訊網(wǎng)——每日最新資訊28at.com

構(gòu)建搜索引擎

步驟1,創(chuàng)建項(xiàng)目

使用如下命令創(chuàng)建一個Rust新項(xiàng)目:KsH28資訊網(wǎng)——每日最新資訊28at.com

cargo new shrimp_enginecd shrimp_enginecode .

KsH28資訊網(wǎng)——每日最新資訊28at.com

步驟2,加入依賴項(xiàng)

需要一些crate來幫助解析和數(shù)據(jù)處理。例如:KsH28資訊網(wǎng)——每日最新資訊28at.com

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

將這兩個庫加入到Cargo.toml文件中:KsH28資訊網(wǎng)——每日最新資訊28at.com

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

KsH28資訊網(wǎng)——每日最新資訊28at.com

步驟3,定義數(shù)據(jù)結(jié)構(gòu)

定義我們要索引的文檔的結(jié)構(gòu)。定義一個簡單的結(jié)構(gòu)體,它表示帶有標(biāo)題和正文的文檔。KsH28資訊網(wǎng)——每日最新資訊28at.com

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

KsH28資訊網(wǎng)——每日最新資訊28at.com

步驟4,創(chuàng)建索引

使用tantivy,根據(jù)數(shù)據(jù)結(jié)構(gòu)創(chuàng)建索引模式,然后將文檔添加到索引中。KsH28資訊網(wǎng)——每日最新資訊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(); // 在目錄中創(chuàng)建索引    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}

KsH28資訊網(wǎng)——每日最新資訊28at.com

Schema定義索引的結(jié)構(gòu),指定應(yīng)該索引哪些字段(這里是標(biāo)題和正文)以及如何(例如,存儲、文本分析)創(chuàng)建一個內(nèi)存索引,并將文檔添加到該索引中。添加的每個文檔都由Document結(jié)構(gòu)體定義,然后對其進(jìn)行序列化以進(jìn)行索引。將更改提交到索引中,使其可搜索。KsH28資訊網(wǎng)——每日最新資訊28at.com

步驟5,搜索

實(shí)現(xiàn)一個搜索索引的函數(shù)。我們需要創(chuàng)建一個搜索器和查詢解析器。KsH28資訊網(wǎng)——每日最新資訊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(())}

KsH28資訊網(wǎng)——每日最新資訊28at.com

步驟6,測試搜索引擎,修改main函數(shù)KsH28資訊網(wǎng)——每日最新資訊28at.com

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

運(yùn)行結(jié)果如下:KsH28資訊網(wǎng)——每日最新資訊28at.com

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

KsH28資訊網(wǎng)——每日最新資訊28at.com

tantivy crate中的組件用于構(gòu)建搜索引擎的核心功能,從創(chuàng)建索引到查詢索引。KsH28資訊網(wǎng)——每日最新資訊28at.com

KsH28資訊網(wǎng)——每日最新資訊28at.com

KsH28資訊網(wǎng)——每日最新資訊28at.com

搜索引擎的核心機(jī)制

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

為了搜索索引,將實(shí)例化一個索引讀取器,創(chuàng)建一個能夠?qū)λ饕龍?zhí)行查詢的搜索器。KsH28資訊網(wǎng)——每日最新資訊28at.com

2,查詢解析和執(zhí)行

查詢解析器解釋查詢的字符串,并根據(jù)已定義的Schema將其轉(zhuǎn)換為查詢對象。然后,搜索者使用該查詢來查找相關(guān)文檔并對其進(jìn)行排序。KsH28資訊網(wǎng)——每日最新資訊28at.com

3,檢索和顯示結(jié)果

檢索并顯示最匹配的文檔(在一定范圍內(nèi))?;谒阉鞑樵?、提取和審查索引內(nèi)容。KsH28資訊網(wǎng)——每日最新資訊28at.com

KsH28資訊網(wǎng)——每日最新資訊28at.com

KsH28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

本示例旨在為你提供構(gòu)建搜索引擎的起點(diǎn)。Rust的所有權(quán)和并發(fā)模型,以及它的類型系統(tǒng),為構(gòu)建更復(fù)雜和高性能的搜索引擎提供了堅(jiān)實(shí)的基礎(chǔ)。KsH28資訊網(wǎng)——每日最新資訊28at.com

我們可以通過添加實(shí)時索引、高級文本處理和自定義評分算法等特性來擴(kuò)展這個項(xiàng)目。KsH28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-75364-0.html用Rust制作一個小型搜索引擎

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: .NET中Enum的應(yīng)用你知道多少,它的作用和優(yōu)點(diǎn)是什么?

下一篇: 2023年需求最高的八大編程語言

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 5月安卓手機(jī)好評榜:魅族20 Pro奪冠

    性能榜和性價(jià)比榜之后,我們來看最后的安卓手機(jī)好評榜,數(shù)據(jù)來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內(nèi)市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 十個可以手動編寫的 JavaScript 數(shù)組 API

    JavaScript 中有很多API,使用得當(dāng),會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進(jìn)行一次小總結(jié)?,F(xiàn)在開始吧。1.forEach()forEach()用于遍歷數(shù)組接收一參
  • SpringBoot中使用Cache提升接口性能詳解

    環(huán)境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應(yīng)用程序提供了透明式添加緩存的支持。和事務(wù)支持一樣,抽象緩存允許一致地使用各
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強(qiáng)大而靈活的功能,用于修改或增強(qiáng)函數(shù)或類的行為。裝飾器本質(zhì)上是一個函數(shù),它接受另一個函數(shù)或類作為參數(shù),并返回一個新的函數(shù)或類。它們通常用
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯(lián)網(wǎng)那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 消息稱小米汽車開始篩選交付中心:需至少120個車位

    IT之家 7 月 7 日消息,日前,有微博簡介為“汽車行業(yè)從業(yè)者、長三角一體化擁護(hù)者”的微博用戶 @長三角行健者 發(fā)文表示,據(jù)經(jīng)銷商集團(tuán)反饋,小米汽車目前
  • 華為和江淮汽車合作開發(fā)百萬元問界MPV?雙方回應(yīng)來了

    8月1日消息,郭明錤今天在社交平臺發(fā)文稱,華為正在和江淮汽車合作,開發(fā)售價(jià)在100萬元的問界MPV,預(yù)計(jì)在2024年第2季度量產(chǎn),銷量目標(biāo)為上市首年交付5萬輛。
  • iQOO 11S新品發(fā)布會

    iQOO將在7月4日19:00舉行新品發(fā)布會,推出杭州亞運(yùn)會電競賽事官方用機(jī)iQOO 11S。
  • OPPO K11采用全方位護(hù)眼屏:三大護(hù)眼能力減輕視覺疲勞

    日前OPPO官方宣布,全新的OPPO K11將于7月25日正式發(fā)布,將主打旗艦影像,和同檔位競品相比,其最大的賣點(diǎn)就是將配備索尼IMX890主攝,堪稱是2000檔位影像表
Top 主站蜘蛛池模板: 襄汾县| 菏泽市| 海南省| 铜梁县| 富蕴县| 左云县| 湖北省| 沐川县| 筠连县| 上虞市| 辉县市| 临西县| 闸北区| 西贡区| 胶南市| 泾川县| 江城| 南投市| 宁南县| 余干县| 永宁县| 新宁县| 潮州市| 拉萨市| 金塔县| 高清| 武邑县| 聂荣县| 万源市| 广德县| 河间市| 大埔区| 仙桃市| 邹平县| 宁津县| 仁化县| 上栗县| 蒙自县| 抚顺县| 洪洞县| 陇南市|