第 0003 荐:RediSearch,最快的全文搜索引擎 - 图1

介绍

RediSearchRedis Labs 开发的一个支持全文搜索的 Redis 模块,并支持对中文进行搜索,在生成索引的时候使用压缩和反向索引的方式来减少对内存的占用,并且 RediSearch 还提供精确短语匹配、模糊搜索和数字过滤等方式来增强搜索结果体验。

功能特征

  • 通过 Redis hashes 实现文档多字段索引
  • 增量索引不会造成性能损耗
  • 支持文档排名(根据tf-idf和用户设置的字段权重进行排名)
  • 支持设置字段权重(比如 title 字段权重为 2.0,description 字段权重为 1.0)
  • 支持使用ANDORNOT等运算符进行复杂的布尔查询
  • 支持前缀匹配、模糊匹配、精确短语匹配
  • 支持双元音语音匹配
  • 支持前缀搜索建议
  • 支持基于词干的多语言查询扩展(使用Snowball)
  • 支持中文分词与查询(使用Friso)
  • 支持数值和范围过滤
  • 支持地理空间查询
  • 拥有强大的聚合引擎
  • 支持所有utf-8编码的文本
  • 支持指定搜索结果返回字段
  • 支持搜索结果排序

性能

与行业标杆ElasticSearch在同等硬件环境下进行性能评测对比。

对维基百科560万个文档(约 5.3GB)进行索引,并对索引的数据集做双单词搜索。

生成索引耗时:

第 0003 荐:RediSearch,最快的全文搜索引擎 - 图2

搜索性能对比:

第 0003 荐:RediSearch,最快的全文搜索引擎 - 图3

性能对比评测原文:https://redislabs.com/blog/search-benchmarking-redisearch-vs-elasticsearch/

快速入门

安装部署

通过docker快速部署

  1. docker run -p 6379:6379 redislabs/redisearch:latest

通过二进制进行部署

需要先下载预先编译好了的 redisearch 模块 ==> https://redislabs.com/download-center/modules/

然后直接启动 redis 服务:

  1. redis-server --loadmodule /path/to/module/src/redisearch.so

自行编译部署

非常适合生命在于折腾的人。

  1. git clone --recursive https://github.com/RediSearch/RediSearch.git
  2. cd RediSearch
  3. # MacOS
  4. # make setup
  5. # Linux
  6. sudo make setup
  7. make build
  8. make run

使用示例

Python为例。

安装依赖

  1. pip install redisearch -i https://pypi.doubanio.com/simple

示例代码

  1. from redisearch import Client, TextField, IndexDefinition, Query
  2. # 创建指定索引的客户端
  3. client = Client("myIndex")
  4. # 索引定义
  5. definition = IndexDefinition(prefix=['doc:', 'article:'])
  6. # 创建索引协议
  7. client.create_index((TextField("title", weight=5.0), TextField("body")), definition=definition)
  8. # 索引文档(针对 RediSearch 2.0+)
  9. client.redis.hset('doc:1',
  10. mapping={
  11. 'title': 'RediSearch',
  12. 'body': 'Redisearch impements a search engine on top of redis'
  13. })
  14. # 索引文档(针对 RediSearch 1.x)
  15. client.add_document(
  16. "doc:2",
  17. title="RediSearch",
  18. body="Redisearch implements a search engine on top of redis",
  19. )
  20. # 执行搜索
  21. res = client.search("search engine")
  22. # 打印搜索结果
  23. print(res.total) # "2"
  24. print(res.docs[0].title) # "RediSearch"
  25. # 更为复杂的搜索
  26. q = Query("search engine").verbatim().no_content().with_scores().paging(0, 5)
  27. res = client.search(q)

司空荐惯在使用redisearch进行实测时,10MB 的数据,大概会占用 30MB 的内存,不过redis-cli save 下来的 dump.rdb 文件大小也大概是 10MB 左右。

各语言SDK

Language Library Author License Stars
Python redisearch-py Redis Labs BSD redisearch-py-stars
Java (Jedis client library) JRediSearch Redis Labs BSD JRediSearch-stars
Java (Lettuce client library) lettusearch Redis Labs Apache-2.0 lettusearch-stars
Java spring-redisearch Redis Labs Apache-2.0 spring-redisearch-stars
Java redis-modules-java dengliming Apache-2.0 redis-modules-java-stars
Go redisearch-go Redis Labs BSD redisearch-go-stars
JavaScript RedRediSearch Kyle J. Davis MIT RedRediSearch-stars
JavaScript redis-redisearch Kyle J. Davis MIT redis-redisearch-stars
TypeScript redis-modules-sdk Dani Tseitlin BSD-3-Clause redis-modules-sdk-stars
C# NRediSearch Marc Gravell MIT NRediSearch-stars
PHP redisearch-php Ethan Hann MIT redisearch-php-stars
PHP php-redisearch MacFJA MIT php-redisearch-stars
Rust redisearch-api-rs Redis Labs BSD redisearch-api-rs-stars
Ruby on Rails redi_search_rails Dmitry Polyakovsky MIT redi_search_rails-stars
Ruby redisearch-rb Victor Ruiz MIT redisearch-rb-stars
Ruby redi_search Nick Pezza MIT redi_search-stars

结语

如果 RediSearch 不是最快的全文搜索引擎,就当我没发过这样标题的内容…(此次隐藏 1024 个狗头)