RediSearch-Redis强大的搜索引擎

作者/翻译:张冬洪,Redis中国用户组主席

RediSearch简介


RediSearch是一个高性能的全文搜索引擎,可作为一个Redis Module 运行在Redis上,是由RedisLabs团队开发的。

特点是:Faster, in-memory, highly available full text search (英文看着才有感觉)

项目地址:https://github.com/RedisLabsModules/RediSearch

官网:http://redisearch.io

RediSearch LOGO

主要特性


RediSearch 是在Redis基础上从0开始开发的一个全文搜索索引,使用新的Redis Modules API来扩展Redis新命令和能力,它的主要特性包括:

  • 简单,快速索引和搜索

  • 数据存储在内存中,使用内存-有效的自定义数据结构

  • 支持多种使用UTF-8编码的语言

  • 文档和字段评分

  • 结果的数值过滤

  • 通过词干扩展查询

  • 精确的短语搜索

  • 按特定属性过滤结果(例如仅在标题中搜索“foo”)

  • 强大的自动提示引擎

  • 增量索引(不需要对索引进行优化和压缩)

  • 支持用作存储在另一数据库中的文档的搜索索引

  • 支持已经在Redis中存在的HASH对象作为文件的索引

  • 扩展到多个Redis实例

RediSearch实战 - 小试牛刀


通过下面的案例让我们一起来了解一下关于RediSearch的一些关键概念,下面的例子是在redis-cli 工具基础上完成的。

1. 定义一个索引

为了搜索的有效性,RediSearch需要知道怎样去索引文档。一个文档可以有若干字段,每一个都有它们自己的权重(例如:标题通常比文本本身更重要)。搜索引擎能够使用数值字段来进行过滤(未来我们将会增加更多的字段)。

因此,第一步是创建索引定义,它告诉RediSearch如何处理我们将会添加的文档。

在这个案例中,我们将创建一个产品目录索引,其中每个产品都有名称,描述和价格(允许我们通过价格过滤产品)。

我们使用 FT.CREATE 命令,它的语法是:

E1

在本例中:

E2

这就意味着产品名称和描述被视为文本字段,其各自的得分是10分和1分,这个价格是用于过滤的数值字段。

2. 添加文档

现在我们可以使用 FT.ADD 命令添加一个新的文档到我们的索引:

E3

添加一个TV作为例子:

E4

该产品被立即添加索引中,现在可以在未来的搜索中被找到。

注:RediSearch支持UTF-8(或纯ASCII)编码的文本,不检查输入的有效性,其主要的限制是使用普通的空格和标点符号标记标志,它对ASCII和UTF-8都起作用。

3. 搜索

现在我们已经有了被添加到索引中的产品,用 FT.SEARCH 命令进行搜索是非常简单的:

E5

或者用价格过滤,如价格在$200到$300之间:

E6

在redis-cli 客户端上输出的结果信息如下:

E7

现在我们已经论证了RediSearch是如何工作的,我们将在短时间内热切的投入到RediSearch的开发和设计中。

性能


为了评估RediSearch相比其他开源搜索引擎的性能,我们创建了一套度量延迟和吞吐量的基准—索引和查询相同的数据集。我们的基准测试结果表明RediSearch的速度相比ElasticSearch 和 Solr要快120%到500%。

基准设置:

  • 数据集:从维基百科页面提供的有用的英文摘要的转储,其中包括510万短摘要。

  • 基准测试:我们针对不同的搜索引擎运行了几个具有不同配置文件的查询。并行的运行1, 8, 16、32和64个并发客户端执行每个查询。我们也跑了自动完成测试,从具有相同客户端并发配置文件的数据集中测试前1100名最受欢迎的2和3个字母前缀。

  • 物理配置:2个 c4.4x large AWS EC2 Instance,每一个配置16核,32GB内存 和 SSD EBS 存储,一个用作client,另一个运行 servers

  • 搜索引擎测试:

  • RediSearch:5个分片运行在5个Redis Masters上,没有负载均衡,冗余或内置的缓存,此设置最多使用了Server机器的5个CPU核心。

  • ElasticSearch:一个实例有5个分片,过滤器缓存已禁用,在基准测试中,ElasticSearch使用了所有的16个CPU核心,因为它是多线程的。

  • Solr:solr-cloud的两个实例,每一个实例上面运行2个分片,缓存是完全禁用的,在基准测试过程中,Solr也是使用了所有的16个CPU核心。

  • 客户端:使用GO编写的应用程序,利用尽可能多的CPU核心,对于Redis, ElasticSearch 和 Solr 都使用流行的GO客户端压测,

    测试程序地址:https://github.com/RedisLabs/RediSearchBenchmark

    压测结果展示:

    T1

    T2

    T3

    T4

    T5

    T6

    T7

    T8

    T9

    T10

    T11

    T12

    总结:

    我们已经证明,利用Redis Module API,我们可以在Redis的上面创建一个功能丰富和高性能的搜索引擎。

    从基准测试来看,使用RediSearch 要优于其他搜索引擎,在某些情况下还有很大的盈余 - 保持较低的延迟。

    然而相比于ElasticSearch和Solr,RediSearch仍然需要获得更多的特性,其性能优势使得它可以成为许多用例的可行替代品,并且随着时间的推移,我们打算在开源社区的帮助下对它进行加强。

    写在最后,原文翻译自:http://redisearch.io/ 以及《RediSearch白皮书》

    举报
    评论 0