C#+RedisSearch實(shí)現(xiàn)高性能全文搜索
Redis Search是一個(gè)Redis模塊,它使用壓縮的倒排索引來(lái)實(shí)現(xiàn)快速的索引和低內(nèi)存占用。Redis Search可以對(duì)Redis數(shù)據(jù)進(jìn)行精確短語(yǔ)匹配、模糊搜索、數(shù)值過(guò)濾、地理空間篩選等多種搜索功能。Redis Search還支持聚合、高亮、詞干提取、拼寫糾錯(cuò)等特性。
Redis Search文檔地址
https://redis.io/docs/interact/search-and-query/
RediSearch查詢語(yǔ)言類似于SQL,但更加簡(jiǎn)潔和靈活。你可以使用RediSearch命令來(lái)創(chuàng)建索引、添加文檔、搜索文檔、更新文檔、刪除文檔等。
與elasticsearch的比較
elasticsearch是另一個(gè)流行的開源搜索引擎,它也支持全文搜索和聚合功能。那么,Redis Search和elasticsearch有什么區(qū)別和優(yōu)勢(shì)呢?
- Redis Search是基于內(nèi)存的,它可以提供更高的性能和更低的延遲。elasticsearch則是基于磁盤的,它需要依賴緩存來(lái)提高速度。
- Redis Search是一個(gè)Redis模塊,它可以直接在Redis中運(yùn)行,無(wú)需額外的安裝和配置。elasticsearch則需要單獨(dú)部署和管理。
- Redis Search支持多種擴(kuò)展模塊,如RedisJSON(用于處理JSON文檔),RedisGraph(用于處理圖數(shù)據(jù)),RedisTimeSeries(用于處理時(shí)間序列數(shù)據(jù)),RediSearch(用于處理全文搜索)等。elasticsearch則需要依賴插件來(lái)擴(kuò)展其功能。
一、Redis Search的安裝
有多種方式可以安裝和使用Redis Search,最簡(jiǎn)單的方式是使用Redis Stack Docker鏡像,它已經(jīng)集成了Redis和多個(gè)模塊,包括Redis Search。只需運(yùn)行一條命令,就可以在本地創(chuàng)建一個(gè)RediSearch容器:
$ docker run -p 6379:6379 redis/redis-stack-server:latest
要連接到這個(gè)實(shí)例,運(yùn)行:
$ redis-cli
二、Redis Search的使用
要使用Redis Search,你首先需要在Redis數(shù)據(jù)上聲明索引,然后使用RediSearch查詢語(yǔ)言來(lái)查詢這些數(shù)據(jù)。
1、創(chuàng)建索引
要?jiǎng)?chuàng)建一個(gè)索引,你需要使用FT.CREATE命令,并指定索引名、索引選項(xiàng)和字段名。例如,要?jiǎng)?chuàng)建一個(gè)名為blog的索引,用于存儲(chǔ)博客文章的標(biāo)題、內(nèi)容和標(biāo)簽,你可以運(yùn)行:
127.0.0.1:6379> FT.CREATE blog ON HASH PREFIX 1 blog: SCHEMA title TEXT WEIGHT 5.0 content TEXT WEIGHT 1.0 tags TAG SEPARATOR ","
OK
這個(gè)命令會(huì)創(chuàng)建一個(gè)名為blog的索引,它會(huì)自動(dòng)索引所有以blog:為前綴的散列鍵。它還會(huì)指定三個(gè)字段:title(文本類型,權(quán)重為5.0),content(文本類型,權(quán)重為1.0)和tags(標(biāo)簽類型,分隔符為逗號(hào))。
2、添加文檔
要添加一個(gè)文檔到索引中,你需要使用FT.ADD命令,并指定文檔ID、字段值和分?jǐn)?shù)。例如,要添加一篇博客文章到blog索引中,你可以運(yùn)行:
127.0.0.1:6379> FT.ADD blog blog:1 1.0 FIELDS title "Hello Redis Search" content "This is a blog post about Redis Search, a query and full-text search engine for Redis." tags "redis,search"
OK
這個(gè)命令會(huì)添加一個(gè)ID為blog:1的文檔到blog索引中,并給它一個(gè)分?jǐn)?shù)為1.0(默認(rèn)為1.0)。它還會(huì)指定三個(gè)字段的值:title為"Hello Redis Search",content為"This is a blog post about Redis Search, a query and full-text search engine for Redis.“,tags為"redis,search”。
3、搜索文檔
要搜索一個(gè)文檔,你需要使用FT.SEARCH命令,并指定索引名和查詢表達(dá)式。你可以使用多種查詢語(yǔ)法,如精確匹配、模糊匹配、數(shù)值過(guò)濾、布爾運(yùn)算等。例如,要搜索blog索引中包含"redis"或"search"的文檔,你可以運(yùn)行:
127.0.0.1:6379> FT.SEARCH blog "redis|search"
1) (integer) 1
2) "blog:1"
3) 1) "title"
2) "Hello Redis Search"
3) "content"
4) "This is a blog post about Redis Search, a query and full-text search engine for Redis."
5) "tags"
6) "redis,search"
這個(gè)命令會(huì)返回一個(gè)結(jié)果集,包含匹配的文檔數(shù)量、文檔ID和字段值。你可以使用LIMIT選項(xiàng)來(lái)分頁(yè)查詢,或者使用RETURN選項(xiàng)來(lái)指定返回哪些字段。
4、更新文檔
要更新一個(gè)文檔,你需要使用FT.PARTIAL命令,并指定文檔ID和要更新的字段值。例如,要更新blog:1文檔的標(biāo)題和標(biāo)簽,你可以運(yùn)行:
127.0.0.1:6379> FT.PARTIAL blog blog:1 REPLACE FIELDS title "Hello RediSearch" tags "redis,search,full-text"
OK
這個(gè)命令會(huì)更新blog:1文檔的title和tags字段的值,并重新索引這些字段。
5、刪除文檔
要?jiǎng)h除一個(gè)文檔,你需要使用FT.DEL命令,并指定文檔ID。例如,要?jiǎng)h除blog:1文檔,你可以運(yùn)行:
127.0.0.1:6379> FT.DEL blog blog:1
(integer) 1
這個(gè)命令會(huì)從索引和數(shù)據(jù)庫(kù)中刪除blog:1文檔,并返回刪除的數(shù)量。
三、C#操作Redis Search結(jié)構(gòu)
這里使用了NRediSearch和StackExchange.Redis兩個(gè)庫(kù),實(shí)現(xiàn)在C#中使用Redis和RediSearch的功能。也可以把NRediSearch換為NRedisStack庫(kù),NRedisStack庫(kù)基于 StackExchange.Redis 構(gòu)建,旨在為 C# 生態(tài)系統(tǒng)提供對(duì) Redis Stack 命令的原生支持。
項(xiàng)目地址:
NRedisStack:https://github.com/redis/NRedisStack
NRediSearch:https://github.com/StackExchange/NRediSearch
StackExchange.Redis:https://github.com/StackExchange/StackExchange.Redis
以下demo中已添加詳細(xì)注釋,是基于本文中有關(guān)Redis Search使用樣例的C#實(shí)現(xiàn),大家可對(duì)比閱讀。
// 引入NRediSearch和StackExchange.Redis命名空間 using NRediSearch; using StackExchange.Redis; public class RediSearchDemoProgram { private static void Main(string[] args) { // 創(chuàng)建一個(gè)連接到本地Redis實(shí)例的連接器 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); // 獲取一個(gè)數(shù)據(jù)庫(kù)對(duì)象 IDatabase db = redis.GetDatabase(); // 創(chuàng)建一個(gè)名為blog的索引,用于存儲(chǔ)博客文章的標(biāo)題、內(nèi)容和標(biāo)簽 var client = new Client("blog", db); // 創(chuàng)建一個(gè)客戶端對(duì)象 client.CreateIndex(new Schema() // 創(chuàng)建一個(gè)索引對(duì)象 .AddTextField("title", 5.0) // 文本類型,權(quán)重為5.0 .AddTextField("content", 1.0) // 文本類型,權(quán)重為1.0 .AddTagField("tags", ","), new Client.ConfiguredIndexOptions()); // 標(biāo)簽類型,分隔符為逗號(hào) // 添加一篇博客文章到blog索引中 client.AddDocument( // 添加一個(gè)文檔對(duì)象 new Document("blog:1", new Dictionary<string, RedisValue> { { "title", "Hello Redis Search"},//設(shè)置標(biāo)題字段 { "content", "This is a blog post about Redis Search, a query and full-text search engine for Redis."}, // 設(shè)置內(nèi)容字段 { "tags", "redis,search"}, // 設(shè)置標(biāo)簽字段 })); // 搜索blog索引中包含"redis"或"search"的文檔 var result = client.Search(new Query("redis|search")); // 創(chuàng)建一個(gè)查詢對(duì)象 Console.WriteLine(result.TotalResults); // 打印匹配的文檔數(shù)量 foreach (var doc in result.Documents) { Console.WriteLine(doc.Id); // 打印文檔ID Console.WriteLine(doc["title"]); // 打印標(biāo)題字段 Console.WriteLine(doc["content"]); // 打印內(nèi)容字段 Console.WriteLine(doc["tags"]); // 打印標(biāo)簽字段 } // 更新blog:1文檔的標(biāo)題和標(biāo)簽 client.UpdateDocument("blog:1", new Dictionary<string, RedisValue> { { "title", "Hello RediSearch"},//更新標(biāo)題字段 { "tags", "redis,search,full-text"}, // 更新標(biāo)簽字段 }); // 刪除blog:1文檔 client.DeleteDocument("blog:1"); } }
到此這篇關(guān)于C#+RedisSearch實(shí)現(xiàn)高性能全文搜索的文章就介紹到這了,更多相關(guān)C# RedisSearch全文搜索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linq利用Distinct去除重復(fù)項(xiàng)問(wèn)題(可自己指定)
這篇文章主要介紹了Linq利用Distinct去除重復(fù)項(xiàng)問(wèn)題(可自己指定),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01C#使用NAudio錄音并導(dǎo)出錄音數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了C#如何使用NAudio實(shí)現(xiàn)錄音功能并導(dǎo)出錄音數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12C#比較兩個(gè)List集合內(nèi)容是否相同的幾種方法
本文詳細(xì)介紹了在C#中比較兩個(gè)List集合內(nèi)容是否相同的方法,包括非自定義類和自定義類的元素比較,對(duì)于非自定義類,可以使用SequenceEqual、排序后比較或HashSet來(lái)忽略重復(fù)元素,對(duì)于自定義類,需要重寫Equals和GetHashCode方法,然后使用相應(yīng)的比較方法2025-02-02C#中的問(wèn)號(hào)(?號(hào))用法小結(jié)
這篇文章主要介紹了C#中的問(wèn)號(hào)(?號(hào))用法小結(jié),本文介紹了3種用法,分別作為修飾符、運(yùn)算符的用法,需要的朋友可以參考下2014-07-07C#實(shí)現(xiàn)String字符串轉(zhuǎn)化為SQL語(yǔ)句中的In后接的參數(shù)詳解
在本篇文章中小編給大家分享的是一篇關(guān)于C#實(shí)現(xiàn)String字符串轉(zhuǎn)化為SQL語(yǔ)句中的In后接的實(shí)例內(nèi)容和代碼,需要的朋友們參考下。2020-01-01