用Java、Redis、Elastic Search和Mongo实现自动完成

5

我需要实现一个自动完成功能,其中包含超过500,000个名称,这些名称可能会增加到超过4,000,000个。

后端使用Spring调用Java REST Web服务。我应该使用MongoDB、Redis还是Elasticsearch来存储和查询/搜索名称?

2个回答

11

这是一个关键的搜索用例,MongoDB和Redis非常适合基于关键字查找,但不适合于搜索,而Elasticsearch是专门为此用例构建的分布式搜索引擎。

在选择系统之前,您应该了解您的功能如何内部运作,并考虑以下选择因素。

功能需求

  1. 每秒总搜索查询次数(QPS)是多少?
  2. 您会有多频繁地更新文档(例如,在示例中更新名称)?
  3. 名称更新后出现在搜索结果中的服务等级协议(SLA)是什么?
  4. 搜索结果的SLA。

一些功能要求。

  1. 自动完成应该是什么样子,名称的前缀、中缀搜索?
  2. 用户在显示自动完成结果之前需要输入多少个字符?
  3. 上述要求可以多频繁更改。

Elasticsearch将文档索引到反向索引中,并使用tokens匹配进行工作(可以轻松定制以适应业务需求),因此在搜索方面非常快速。Redis和MongoDB在内部没有这种结构,不应用于此用例。您不应该对在实现自动完成时选择Elasticsearch产生任何疑问。


1
你可以使用 RediSearch(https://oss.redislabs.com/redisearch/)。它是一个建立在 Redis 作为 RedisModule 之上的免费文本搜索引擎。它还具有自动完成功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接