Redisearch简单使用

Redisearch 是一个基于 Redis 的高性能搜索引擎,可以在 Redis 数据结构上实现全文搜索功能。下面是一个简单的教程,介绍如何使用 Redisearch 进行中文搜索,并使用 PHP 语言进行一些简单的DEMO示例

安装 Redisearch

首先,你需要在 Redis 服务器上安装 Redisearch 模块。请参考 Redisearch 的 GitHub 页面 获取安装说明。

使用 Docker 安装 RedisSearch 非常简单。以下是步骤:

1. 获取 RedisSearch Docker 镜像

首先,确保系统已安装 Docker,然后运行以下命令来拉取 RedisSearch 镜像:

docker pull redislabs/redisearch

2. 启动 RedisSearch 容器

使用以下命令运行 RedisSearch 容器,并将 Redis 服务映射到本地的 6379 端口:

docker run -it -d -p 6379:6379 --name redis-search redislabs/redisearch:latest 

3. 验证安装

通过以下命令检查 Redis 模块是否安装成功。出现 search 模块表示成功:

127.0.0.1:6379> MODULE LIST
1) 1) "name"
   2) "ReJSON"
   3) "ver"
   4) (integer) 999999
2) 1) "name"
   2) "search"
   3) "ver"
   4) (integer) 20613

创建索引

使用 Redisearch 进行搜索之前,需要先为数据创建索引。下面是一个使用 Redis 命令行工具创建索引的示例:

FT.CREATE myIndex SCHEMA title TEXT WEIGHT 1.0 content TEXT WEIGHT 0.5

这个命令会创建一个名为 myIndex 的索引,包含两个字段:titlecontent,并为这些字段分配不同的权重。

添加文档

接下来,你可以向索引中添加文档。下面是一个使用 Redis 命令行工具添加文档的示例:

FT.ADD myIndex doc1 1.0 FIELDS title "中文搜索" content "这是一个关于中文搜索的文档"

当然如果出现中文无法查询内容的情况,可以试下

FT.ADD myIndex doc1 1.0 language "chinese" FIELDS title "中文搜索" content "这是一个关于中文搜索的文档"

注意:这里必须要设置语言编码为中文,也就是 language "chinese",默认是英文编码,如果不设置则无法支持中文查询

这个命令会向 myIndex 索引中添加一个 ID 为 doc1 的文档,包含 titlecontent 两个字段。

执行搜索

现在,你可以使用 Redisearch 进行搜索了。下面是一个使用 Redis 命令行工具执行搜索的示例:

FT.SEARCH myIndex "中文搜索"

这个命令会返回包含 "中文搜索" 关键词的所有文档。

删除索引的数据

FT.DEL myIndex doc1

我们使用索引加文档 ID 就可以实现删除数据的功能

删除索引

我们可以使用ft.drop关键字删除整个索引,执行命令如下:

FT.DROP myIndex

查询索引详细信息

我们可以使用ft.info关键查询索引相关信息

使用 PHP 进行操作

PHP 中,你可以使用 phpredis 扩展来操作 RedisRedisearch。下面是一个使用 PHP 进行上述操作的示例:

<?php
// 连接到 Redis 服务器
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 创建索引
$redis->rawCommand('FT.CREATE', 'myIndex', 'SCHEMA', 'title', 'TEXT', 'WEIGHT', 1.0, 'content', 'TEXT', 'WEIGHT', 0.5);

// 添加文档
$redis->rawCommand('FT.ADD', 'myIndex', 'doc1', 1.0, 'FIELDS', 'title', '中文搜索', 'content', '这是一个关于中文搜索的文档');

// 执行搜索
$result = $redis->rawCommand('FT.SEARCH', 'myIndex', '中文搜索');
print_r($result);

这个 PHP 脚本会连接到 Redis 服务器,创建索引,添加文档,并执行搜索。请注意,你需要先安装并启用 phpredis 扩展才能运行此脚本。


与 ElasticSearch 对比

性能对比

为了提供一个清晰的性能对比,下面是一个RedisSearch与Elasticsearch在几个关键性能指标上的比较表格。请注意,这些数据基于特定测试条件下的结果,实际应用中的表现可能会根据具体配置和使用场景有所不同。

指标RedisearchElasticsearch备注
索引速度221秒(5.6百万文档)349秒(5.6百万文档)Redisearch快58%
查询速度12.5K ops/sec3.1K ops/secRedisearch快4倍
查询延迟8毫秒10毫秒Redisearch表现更佳
内存使用通常更高,因为数据存储在内存中主要存储在磁盘,内存用于缓存和索引
写入性能高效,适用于实时写入和更新适合高并发写入场景
查询性能单机环境下查询速度快通过分片分布查询负载,支持近实时搜索
扩展性受限于内存大小水平可扩展,轻松增加节点处理更多数据
易用性简单,与Redis一致的API功能强大但学习曲线陡峭

产品对比

特性/工具RedisSearchElasticsearch
数据存储内存中,支持持久化到磁盘磁盘上,基于Lucene索引技术
索引类型全文搜索,数值、地理空间等全文搜索,结构化、非结构化数据
性能极低延迟,适用于实时查询优秀的分布式搜索性能,适合大规模数据集
扩展性支持通过Redis Cluster进行水平扩展强大的集群管理功能,易于水平扩展至PB级数据
易用性配置简单,对于熟悉Redis的用户友好功能丰富但设置较为复杂,学习曲线较陡
API与语言支持REST API, 提供多种客户端库RESTful API, 多种编程语言的官方及第三方客户端库
查询能力基本的全文检索和过滤复杂的聚合、脚本、过滤器等高级查询
社区支持开源社区活跃,作为Redis的一部分得到维护非常活跃的开源社区,有商业版本提供企业级支持
典型应用场景实时应用、缓存层、小到中等规模的数据集日志分析、大数据处理、电子商务搜索引擎
成本考虑主要是硬件成本(内存),因为它是内存数据库包括硬件(主要是存储)、软件许可费(如果使用X-Pack)
运维复杂度相对较低,依赖于Redis本身的稳定性和监控工具较高,需要专门的运维团队来管理和优化集群

注意

  • 数据存储一栏中,RedisSearch主要依赖于Redis的内存存储机制,虽然它也提供了持久化选项,但是默认情况下数据是保存在内存中的。而Elasticsearch则是基于磁盘存储,并利用了Lucene来创建高效的索引。
  • 性能方面,RedisSearch由于其内存操作的特点,在响应时间上有优势;Elasticsearch则是在大规模分布式环境下表现出色。
  • 易用性方面,RedisSearch对于已经熟悉Redis的人来说更加直观容易上手;而Elasticsearch虽然强大,但是它的配置和使用相对更复杂一些。
  • 社区支持反映了两种工具背后的开发者社区活动程度以及是否有商业支持可供选择。
  • 成本考虑不仅包含了软件本身的成本,还包括了运行这些系统所需的硬件资源的成本。
  • 运维复杂度则指出了日常维护和管理这两种系统的难易程度。

标签: PHP, Redis

相关文章

Typecho博客系统的xmlrpc的使用附PHP示例代码

XML-RPC 是一种远程过程调用(RPC)协议,它使用 XML 编码请求和响应,并通过 HTTP 进行传输。XML-RPC 允许客户端调用远程服务器上的方法,并获取返回结果。这种协议简单、轻量...

php+mysql中如何处理嵌套(子)事务并保持原子性一致

在PHP和MySQL中处理子事务并保持原子性一致性是一个复杂但非常重要的问题,尤其是在处理涉及多个数据库操作的业务逻辑时。以下是一些关键的解决方案、思路、技术要点和涉及的难点讲解。解决方案与思路...

如何使用Go编写跨平台组件并让Java或PHP调用

在现代软件开发中,跨语言调用是一个常见的需求。假设我们有一个用Go语言编写的组件,我们希望Java或PHP能够直接调用这个组件中对外提供的方法。为了实现这一目标,我们可以使用以下几种方法:1. ...

深入解析PHP的filter_var函数及其应用场景

在PHP开发中,数据的过滤与验证是至关重要的环节。PHP的 filter_var 函数提供了一种简洁而强大的方式来对输入数据进行验证和过滤。本篇文章将从专业的角度详细介绍 filter_var ...

Typecho开发数据库常用API操作

表创建和删除在 Typecho 插件开发过程中,往往需要创建表。可以使用query()来进行表的创建、修改或者删除。$db= Typecho_Db::get(); $prefix = $db-&...

PHP开启 OPCache 来降低负载并提高抗并发能力

opcache 其实就是 OpCode + cache,php 是一种解释型语言,它的执行可分为以下几个流程这样一来的话,对于同一个文件,反复请求,就要不断解析、编译和执行PHP脚本,消耗过多资...

Typecho博客模板制作手册

文件结构说明文件名作用必须style.css主题样式文件否screenshot.png主题缩略图,图片后缀支持 jpg,png,gif,bmp,jpeg否index.php首页以及说明文件是40...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件