Redis Stack 技术栈之搜索引擎 RedisSearch

Redis/缓存系统
159
0
0
2024-03-02
标签   Redis

介绍

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、stockdescription分别对应一个属性,属性的类型分别为text、text、float、floattext

索引与搜索

索引是用于加速搜索过程的数据结构,通过创建索引,可以快速找到包含特定关键词的文档。索引是一种倒排表(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 可视化工具查看