
介绍
RediSearch 是 Redis Labs 开发的一个支持全文搜索的 Redis 模块,并支持对中文进行搜索,在生成索引的时候使用压缩和反向索引的方式来减少对内存的占用,并且 RediSearch 还提供精确短语匹配、模糊搜索和数字过滤等方式来增强搜索结果体验。
功能特征
- 通过 Redis hashes 实现文档多字段索引
- 增量索引不会造成性能损耗
- 支持文档排名(根据
tf-idf和用户设置的字段权重进行排名) - 支持设置字段权重(比如 title 字段权重为 2.0,description 字段权重为 1.0)
- 支持使用
AND,OR和NOT等运算符进行复杂的布尔查询 - 支持前缀匹配、模糊匹配、精确短语匹配
- 支持双元音语音匹配
- 支持前缀搜索建议
- 支持基于词干的多语言查询扩展(使用Snowball)
- 支持中文分词与查询(使用Friso)
- 支持数值和范围过滤
- 支持地理空间查询
- 拥有强大的聚合引擎
- 支持所有utf-8编码的文本
- 支持指定搜索结果返回字段
- 支持搜索结果排序
性能
与行业标杆ElasticSearch在同等硬件环境下进行性能评测对比。
对维基百科560万个文档(约 5.3GB)进行索引,并对索引的数据集做双单词搜索。
生成索引耗时:

搜索性能对比:

性能对比评测原文:https://redislabs.com/blog/search-benchmarking-redisearch-vs-elasticsearch/
快速入门
安装部署
通过docker快速部署
docker run -p 6379:6379 redislabs/redisearch:latest
通过二进制进行部署
需要先下载预先编译好了的 redisearch 模块 ==> https://redislabs.com/download-center/modules/
然后直接启动 redis 服务:
redis-server --loadmodule /path/to/module/src/redisearch.so
自行编译部署
非常适合生命在于折腾的人。
git clone --recursive https://github.com/RediSearch/RediSearch.gitcd RediSearch# MacOS# make setup# Linuxsudo make setupmake buildmake run
使用示例
以Python为例。
安装依赖
pip install redisearch -i https://pypi.doubanio.com/simple
示例代码
from redisearch import Client, TextField, IndexDefinition, Query# 创建指定索引的客户端client = Client("myIndex")# 索引定义definition = IndexDefinition(prefix=['doc:', 'article:'])# 创建索引协议client.create_index((TextField("title", weight=5.0), TextField("body")), definition=definition)# 索引文档(针对 RediSearch 2.0+)client.redis.hset('doc:1',mapping={'title': 'RediSearch','body': 'Redisearch impements a search engine on top of redis'})# 索引文档(针对 RediSearch 1.x)client.add_document("doc:2",title="RediSearch",body="Redisearch implements a search engine on top of redis",)# 执行搜索res = client.search("search engine")# 打印搜索结果print(res.total) # "2"print(res.docs[0].title) # "RediSearch"# 更为复杂的搜索q = Query("search engine").verbatim().no_content().with_scores().paging(0, 5)res = client.search(q)
司空荐惯在使用redisearch进行实测时,10MB 的数据,大概会占用 30MB 的内存,不过redis-clisave下来的dump.rdb文件大小也大概是 10MB 左右。
各语言SDK
| Language | Library | Author | License | Stars |
|---|---|---|---|---|
| Python | redisearch-py | Redis Labs | BSD | ![]() |
| Java (Jedis client library) | JRediSearch | Redis Labs | BSD | ![]() |
| Java (Lettuce client library) | lettusearch | Redis Labs | Apache-2.0 | ![]() |
| Java | spring-redisearch | Redis Labs | Apache-2.0 | ![]() |
| Java | redis-modules-java | dengliming | Apache-2.0 | ![]() |
| Go | redisearch-go | Redis Labs | BSD | ![]() |
| JavaScript | RedRediSearch | Kyle J. Davis | MIT | ![]() |
| JavaScript | redis-redisearch | Kyle J. Davis | MIT | ![]() |
| TypeScript | redis-modules-sdk | Dani Tseitlin | BSD-3-Clause | ![]() |
| C# | NRediSearch | Marc Gravell | MIT | ![]() |
| PHP | redisearch-php | Ethan Hann | MIT | ![]() |
| PHP | php-redisearch | MacFJA | MIT | ![]() |
| Rust | redisearch-api-rs | Redis Labs | BSD | ![]() |
| Ruby on Rails | redi_search_rails | Dmitry Polyakovsky | MIT | ![]() |
| Ruby | redisearch-rb | Victor Ruiz | MIT | ![]() |
| Ruby | redi_search | Nick Pezza | MIT | ![]() |
结语
如果 RediSearch 不是最快的全文搜索引擎,就当我没发过这样标题的内容…(此次隐藏 1024 个狗头)
