介绍
RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。通过 RedisSearch,可以为 Redis 中的数据创建索引,执行复杂的搜索查询,并实现高级功能,如自动完成、分面搜索和排序。利用 Redis 的高性能特点,RedisSearch 可以实现高效的搜索和实时分析。对于微服务架构来说,RedisSearch 可以作为搜索服务的一部分,提供快速、高效的搜索能力,对于提高用户体验和性能具有重要的意义。
安装
检查模块是否成功安装。运行 redis-cli
并输入命令module list
。这将返回有关加载到服务器的模块的信息。下面是我机器上的一个截图,可以看到两个模块都被成功加载。
特性
- 多字段联合检索
- 高性能增量索引
- 提前指定文档可排序字段(由用户在索引时手动提供)
- 复杂布尔查询
- 基于管道的查询子句
- 基于前缀的搜索
- 支持字段权重设置
- 自动完成建议(可用于搜索框联想词提示)
- 精确的短语搜索
- 在许多语言中基于词干分析的查询扩展
- 支持自定义评分函数(类似ES的function_score)
- 将搜索限制到特定的文档字段
- 数字过滤器和范围
- 使用 Redis 自己的地理命令进行地理过滤
- Unicode 支持(需要 UTF-8 字符集)
- 检索完整的文档内容或只是 ID 的检索
- 支持文档删除和更新与索引垃圾收集
- 支持部分更新和条件文档更新
- 支持拼写纠错
- 支持高亮显示
- 支持聚合分析
- 支持配置停用词和同义词
- 支持向量存储与KNN检索(重磅)
核心概念
数据模型与索引
在RedisSearch中,数据模型指的是用于构建索引的数据结构和格式。RedisSearch支持使用JSON数据类型进行索引,因此可以将数据模型定义为JSON文档的结构和格式。
在创建索引之前,需要定义一个数据模型,指定索引中包含的字段和每个字段的类型。例如,以下是一个简单的数据模型示例:
{
"title": "string",
"author": "string",
"price": "float",
"stock": "float"
}
在创建索引时,需要指定一个数据模型,RedisSearch会根据数据模型中定义的字段类型自动创建相应的索引。
文档与文档属性
文档是指符合数据模型格式要求的JSON文档,每个文档表示一条数据记录。文档中的每个字段对应一个属性,属性定义了该字段的数据类型和索引方式。
例如,以下是一个符合上述数据模型的文档示例:
{
"title": "开源技术小栈RedisSearch系列教程",
"author": "Tinywan",
"price": 9.99,
"stock": 2024,
"description": "RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。"
}
在文档中,title、author、price、stock
和description
分别对应一个属性,属性的类型分别为text、text、float、float
和text
。
索引与搜索
索引是用于加速搜索过程的数据结构,通过创建索引,可以快速找到包含特定关键词的文档。索引是一种倒排表(Inverted Index),它存储了每个字段值与相关文档ID的映射关系。当文档被索引时,RedisSearch会为每个字段创建一个倒排表。
搜索操作是基于索引执行的。当执行搜索查询时,RedisSearch会根据查询语句中的关键词和查询条件生成一个正排表(Forward Index),该表中包含所有符合条件的文档ID。接着,RedisSearch会将正排表和倒排表相结合,计算每个文档的得分并返回搜索结果。通过将数据模型中的字段类型和索引类型定义清楚,可以创建高效的索引,从而加速搜索过程。
命令行操作 RediSearch
创建一个 Index
FT.CREATE TinywanIdx ON HASH PREFIX 1 doc: SCHEMA title TEXT WEIGHT 5.0 body TEXT url TEXT
通过上面的命令,创建了一个支持hash数据类型的索引,同时需要满足key前缀为 doc:
。支持索引的字段说明如下:
字段 | 类型 | 权重(默认权重为1.0) |
title | TEXT | 5 |
body | TEXT | 1.0 |
url | TEXT | 1.0 |
新增数据
HSET doc:1 title "Hello Tinywan" body "search and query" url "https://redis.io/docs/interact/search-and-query"
满足索引key前缀定义的数据,在新增后都会自动加入到对应的索引中.
使用索引
FT.SEARCH TinywanIdx "Hello Tinywan" LIMIT 0 10
添加多条记录进行查询
PHP 操作 RediSearch
RediSearch-PHP是RediSearch模块的PHP客户端库,它为Redis添加了全文搜索。
Github地址 https://github.com/ethanhann/redisearch-php
安装依赖包
composer require ethanhann/redisearch-php
创建Redis客户端
以下以PECL Redis
扩展为示例
/** 创建Redis客户端 */
$redis = (new \Ehann\RedisRaw\PhpRedisAdapter())->connect('192.168.13.168',63789);
创建数据模型与索引
/** 创建数据模型与索引 */
$bookIndex = new \Ehann\RediSearch\Index($redis);
$bookIndex->addTextField('title')
->addTextField('author')
->addNumericField('price')
->addNumericField('stock')
->addTextField('description')
->create();
添加文档
/** 添加文档 */
$bookIndex->add([
new \Ehann\RediSearch\Fields\TextField('title', '开源技术小栈RedisSearch系列教程'),
new \Ehann\RediSearch\Fields\TextField('author', 'Tinywan'),
new \Ehann\RediSearch\Fields\NumericField('price', 9.99),
new \Ehann\RediSearch\Fields\NumericField('stock', 2024),
new \Ehann\RediSearch\Fields\TextField('description', 'RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。'),
]);
查询redis数据库
127.0.0.1:6379> keys *
1) "16584eadb71aa3"
搜索索引
$result = $bookIndex->search('开源技术小栈RedisSearch系列教程');
var_dump($result);
命令行终端打印结果
通过 RedisInsight 可视化工具查看