百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

C#+Redis Search:如何用Redis实现高性能全文搜索

mhr18 2024-11-30 12:28 21 浏览 0 评论

Redis Search是一个Redis模块,它使用压缩的倒排索引来实现快速的索引和低内存占用。Redis Search可以对Redis数据进行精确短语匹配、模糊搜索、数值过滤、理空间筛选等多种搜索功能。Redis Search还支持聚合、高亮、词干提取、拼写纠错等特性。

//Redis Search文档地址https://redis.io/docs/interact/search-and-query/

RediSearch查询语言类似于SQL,但更加简洁和灵活。你可以使用RediSearch命令来创建索引、添加文档、搜索文档、更新文档、删除文档等。

与elasticsearch的比较

elasticsearch是另一个流行的开源搜索引擎,它也支持全文搜索和聚合功能。那么,Redis Search和elasticsearch有什么区别和优势呢?

  • Redis Search是基于内存的,它可以提供更高的性能和更低的延迟。elasticsearch则是基于磁盘的,它需要依赖缓存来提高速度。

  • Redis Search是一个Redis模块,它可以直接在Redis中运行,无需额外的安装和配置。elasticsearch则需要单独部署和管理。

  • Redis Search支持多种扩展模块,如RedisJSON(用于处理JSON文档),RedisGraph(用于处理图数据),RedisTimeSeries(用于处理时间序列数据),RediSearch(用于处理全文搜索)等。elasticsearch则需要依赖插件来扩展其功能。


一、Redis Search的安装

有多种方式可以安装和使用Redis Search,最简单的方式是使用Redis Stack Docker镜像,它已经集成了Redis和多个模块,包括Redis Search。只需运行一条命令,就可以在本地创建一个RediSearch容器:

$ docker run -p 6379:6379 redis/redis-stack-server:latest

要连接到这个实例,运行:

$ redis-cli

二、Redis Search的使用

要使用Redis Search,你首先需要在Redis数据上声明索引,然后使用RediSearch查询语言来查询这些数据。


1、创建索引

要创建一个索引,你需要使用FT.CREATE命令,并指定索引名、索引选项和字段名。例如,要创建一个名为blog的索引,用于存储博客文章的标题、内容和标签,你可以运行:

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

这个命令会创建一个名为blog的索引,它会自动索引所有以blog:为前缀的散列键。它还会指定三个字段:title(文本类型,权重为5.0),content(文本类型,权重为1.0)和tags(标签类型,分隔符为逗号)。


2、添加文档

要添加一个文档到索引中,你需要使用FT.ADD命令,并指定文档ID、字段值和分数。例如,要添加一篇博客文章到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索引中,并给它一个分数为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命令,并指定索引名和查询表达式。你可以使用多种查询语法,如精确匹配、模糊匹配、数值过滤、布尔运算等。例如,要搜索blog索引中包含"redis"或"search"的文档,你可以运行:

127.0.0.1:6379> FT.SEARCH blog "redis|search"1) (integer) 12) "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"

这个命令会返回一个结果集,包含匹配的文档数量、文档ID和字段值。你可以使用LIMIT选项来分页查询,或者使用RETURN选项来指定返回哪些字段。


4、更新文档

要更新一个文档,你需要使用FT.PARTIAL命令,并指定文档ID和要更新的字段值。例如,要更新blog:1文档的标题和标签,你可以运行:

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

个命令会从索引和数据库中删除blog:1文档,并返回删除的数量。

三、C#操作Redis Search结构

这里使用了NRediSearch和StackExchange.Redis两个库,实现在C#中使用Redis和RediSearch的功能。也可以把NRediSearch换为NRedisStack库,NRedisStack基于 StackExchange.Redis 构建,旨在为 C# 生态系统提供对 Redis Stack 命令的原生支持。

//项目地址://NRedisStackhttps://github.com/redis/NRedisStack//NRediSearchhttps://github.com/StackExchange/NRediSearch//StackExchange.Redishttps://github.com/StackExchange/StackExchange.Redis

以下demo中已添加详细注释,是基于本文中有关Redis Search使用样例的C#实现,大家可对比阅读。

// 引入NRediSearch和StackExchange.Redis命名空间using NRediSearch;using StackExchange.Redis;
public class RediSearchDemoProgram{ private static void Main(string[] args) { // 创建一个连接到本地Redis实例的连接器 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); // 获取一个数据库对象 IDatabase db = redis.GetDatabase();
// 创建一个名为blog的索引,用于存储博客文章的标题、内容和标签 var client = new Client("blog", db); // 创建一个客户端对象 client.CreateIndex(new Schema() // 创建一个索引对象 .AddTextField("title", 5.0) // 文本类型,权重为5.0 .AddTextField("content", 1.0) // 文本类型,权重为1.0 .AddTagField("tags", ","), new Client.ConfiguredIndexOptions()); // 标签类型,分隔符为逗号
// 添加一篇博客文章到blog索引中 client.AddDocument( // 添加一个文档对象 new Document("blog:1", new Dictionary<string, RedisValue> { { "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"}, // 设置标签字段 }));
// 搜索blog索引中包含"redis"或"search"的文档 var result = client.Search(new Query("redis|search")); // 创建一个查询对象 Console.WriteLine(result.TotalResults); // 打印匹配的文档数量 foreach (var doc in result.Documents) { Console.WriteLine(doc.Id); // 打印文档ID Console.WriteLine(doc["title"]); // 打印标题字段 Console.WriteLine(doc["content"]); // 打印内容字段 Console.WriteLine(doc["tags"]); // 打印标签字段 }
// 更新blog:1文档的标题和标签 client.UpdateDocument("blog:1", new Dictionary<string, RedisValue> { { "title", "Hello RediSearch"},//更新标题字段 { "tags", "redis,search,full-text"}, // 更新标签字段 });
// 删除blog:1文档 client.DeleteDocument("blog:1"); }}

本文就到这里了,下一篇我们来探索如何通过Redis Search进行基于向量的搜索,实现文本相似度查询。相比之下,这种搜索方式可以保留文本中的语义、语法和情感信息。

相关推荐

Spring Boot 分布式事务实现简单得超乎想象

环境:SpringBoot2.7.18+Atomikos4.x+MySQL5.71.简介关于什么是分布式事务,本文不做介绍。有需要了解的自行查找相关的资料。本篇文章将基于SpringBoot...

Qt编写可视化大屏电子看板系统15-曲线面积图

##一、前言曲线面积图其实就是在曲线图上增加了颜色填充,单纯的曲线可能就只有线条以及数据点,面积图则需要从坐标轴的左下角和右下角联合曲线形成完整的封闭区域路径,然后对这个路径进行颜色填充,为了更美观...

Doris大数据AI可视化管理工具SelectDB Studio重磅发布!

一、初识SelectDBStudioSelectDBStudio是专为ApacheDoris湖仓一体典型场景实战及其兼容数据库量身打造的GUI工具,简化数据开发与管理。二、Select...

RAD Studio 、Delphi或C++Builder设计代码编译上线缩短开发时间

#春日生活打卡季#本月,Embarcadero宣布RADStudio12.3Athens以及Delphi12.3和C++Builder12.3,提供下载。RADStudio12.3A...

Mybatis Plus框架学习指南-第三节内容

自动填充字段基本概念MyBatis-Plus提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。原理自动填充功能通过实现com.baomidou.myba...

「数据库」Sysbench 数据库压力测试工具

sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以...

如何选择适合公司的ERP(选erp系统的经验之谈)

很多中小公司想搞ERP,但不得要领。上ERP的目的都是歪的,如提高效率,减少人员,堵住财务漏洞等等。真正用ERP的目的是借机提升企业管理能力,找出管理上的问题并解决,使企业管理更规范以及标准化。上ER...

Manus放开注册,但Flowith才是Agent领域真正的yyds

大家好,我是运营黑客。前天,AIAgent领域的当红炸子鸡—Manus宣布全面放开注册,终于,不需要邀请码就能体验了。于是,赶紧找了个小号去确认一下。然后,额……就被墙在了外面。官方解释:中文版...

歌浓酒庄总酿酒师:我们有最好的葡萄园和最棒的酿酒师

中新网1月23日电1月18日,张裕董事长周洪江及总经理孙健一行在澳大利亚阿德莱德,完成了歌浓酒庄股权交割签约仪式,这也意味着张裕全球布局基本成型。歌浓:澳大利亚年度最佳酒庄据悉,此次张裕收购的...

软件测试进阶之自动化测试——python+appium实例

扼要:1、了解python+appium进行APP的自动化测试实例;2、能根据实例进行实训操作;本课程主要讲述用python+appium对APP进行UI自动化测试的例子。appium支持Androi...

为什么说Python是最伟大的语言?看图就知道了

来源:麦叔编程作者:麦叔测试一下你的分析能力,直接上图,自己判断一下为什么Python是最好的语言?1.有图有真相Java之父-JamesGoshlingC++之父-BjarneStrou...

如何在Eclipse中配置Python开发环境?

Eclipse是著名的跨平台集成开发环境(IDE),最初主要用来Java语言开发。但是我们通过安装不同的插件Eclipse可以支持不同的计算机语言。比如说,我们可以通过安装PyDev插件,使Eclip...

联合国岗位上新啦(联合国的岗位)

联合国人权事务高级专员办事处PostingTitleIntern-HumanRightsDutyStationBANGKOKDeadlineOct7,2025CategoryandL...

一周安全漫谈丨工信部:拟定超1亿条一般数据泄露属后果严重情节

工信部:拟定超1亿条一般数据泄露属后果严重情节11月23日,工信部官网公布《工业和信息化领域数据安全行政处罚裁量指引(试行)(征求意见稿)》。《裁量指引》征求意见稿明确了行政处罚由违法行为发生地管辖、...

oracle列转行以及C#执行语句时报错问题

oracle列转行的关键字:UNPIVOT,经常查到的怎么样转一列,多列怎么转呢,直接上代码(sshwomeyourcode):SELECTsee_no,diag_no,diag_code,...

取消回复欢迎 发表评论: