欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#+RedisSearch實(shí)現(xiàn)高性能全文搜索

 更新時(shí)間:2023年07月30日 09:56:52   作者:猿惑豁  
Redis?Search是一個(gè)Redis模塊,它使用壓縮的倒排索引來(lái)實(shí)現(xiàn)快速的索引和低內(nèi)存占用,本文主要介紹了C#如何使用RedisSearch實(shí)現(xiàn)高性能全文搜索,希望對(duì)大家有所幫助

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)文章

  • VS2010下生成dll的方法

    VS2010下生成dll的方法

    這篇文章主要介紹了VS2010下生成dll的方法,需要的朋友可以參考下
    2018-01-01
  • C#純技術(shù)之Class寫入Json

    C#純技術(shù)之Class寫入Json

    這篇文章主要介紹了C#純技術(shù)之Class寫入Json問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Linq利用Distinct去除重復(fù)項(xiàng)問(wèn)題(可自己指定)

    Linq利用Distinct去除重復(fù)項(xiàng)問(wèn)題(可自己指定)

    這篇文章主要介紹了Linq利用Distinct去除重復(fù)項(xiàng)問(wèn)題(可自己指定),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#使用NAudio錄音并導(dǎo)出錄音數(shù)據(jù)

    C#使用NAudio錄音并導(dǎo)出錄音數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了C#如何使用NAudio實(shí)現(xiàn)錄音功能并導(dǎo)出錄音數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • C#仿QQ聊天窗口

    C#仿QQ聊天窗口

    這篇文章主要為大家詳細(xì)介紹了C#仿QQ聊天窗口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C#比較兩個(gè)List集合內(nèi)容是否相同的幾種方法

    C#比較兩個(gè)List集合內(nèi)容是否相同的幾種方法

    本文詳細(xì)介紹了在C#中比較兩個(gè)List集合內(nèi)容是否相同的方法,包括非自定義類和自定義類的元素比較,對(duì)于非自定義類,可以使用SequenceEqual、排序后比較或HashSet來(lái)忽略重復(fù)元素,對(duì)于自定義類,需要重寫Equals和GetHashCode方法,然后使用相應(yīng)的比較方法
    2025-02-02
  • 在C#中如何使用Dapper詳解(譯)

    在C#中如何使用Dapper詳解(譯)

    這篇文章主要給大家介紹了關(guān)于在C#中如何使用Dapper的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧
    2018-09-09
  • 詳解c# 類型轉(zhuǎn)換

    詳解c# 類型轉(zhuǎn)換

    這篇文章主要介紹了c# 類型轉(zhuǎn)換的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以學(xué)習(xí)
    2020-07-07
  • C#中的問(wèn)號(hào)(?號(hào))用法小結(jié)

    C#中的問(wèn)號(hào)(?號(hào))用法小結(jié)

    這篇文章主要介紹了C#中的問(wèn)號(hào)(?號(hào))用法小結(jié),本文介紹了3種用法,分別作為修飾符、運(yùn)算符的用法,需要的朋友可以參考下
    2014-07-07
  • C#實(shí)現(xiàn)String字符串轉(zhuǎn)化為SQL語(yǔ)句中的In后接的參數(shù)詳解

    C#實(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

最新評(píng)論