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