介绍
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.git
cd RediSearch
# MacOS
# make setup
# Linux
sudo make setup
make build
make 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 个狗头)