执行搜索的最佳方式

时间:2013-02-11 09:51:30

标签: java performance database-performance amazon-dynamodb

我们正在开发一款可以对我们数据库中的产品进行搜索的应用。我们使用的数据库是Amazon Dynamo DB,在任何给定的时间点都会存储至少1000多万个产品信息。

用户通过UI输入产品名称,我们希望在不到2-3秒的时间内显示搜索结果。我们知道DynamoDB将在此搜索中发挥重要作用,但想知道在应用程序端是否还有其他任何事情可以完成。我们计划使用Memcache缓存搜索,以便在第二次搜索时更快。

还有什么我们可以实现或照顾,以便搜索发生得非常快。实现是在Java。

提前致谢。

2 个答案:

答案 0 :(得分:1)

Dynamodb没有索引的conecpt,因此除了主键之外,您将无法快速搜索。

您有一些主要选择:

  1. 预生成搜索结果并将搜索关键字存储为哈希关键字,并将结果的ID存储为范围。然后,您可以通过获取主键来获取所有搜索结果
  2. 使用其他索引来存储所有ID。例如CloudSearch
  3. 如果您想要在产品名称上进行完全匹配,请将它们存储在一个单独的表中,并使用映射到ID

答案 1 :(得分:0)

  

确切的功能是用户搜索产品,并显示在当前位置的半径5KM范围内匹配的所有产品。有什么想法吗? - JavaMany

因此,您需要针对产品属性和地理空间过滤进行自由文本搜索。 DynamoDB不支持这两个概念中的任何一个"开箱即用" (除了通过执行全表扫描),并不真正适用于关系查询。

您有一些选择 - 正如其他人提到的那样,您可以将CloudSearch用于自由文本搜索属性;将10M记录过滤为较小的子集;对于每一个,您必须从DynamoDB中检索长/纬度,并将它们与用户点周围的半径5KM进行比较。根据CloudSearch找到的记录数量,这可能会也可能不会令人满意。

您必须找到一种方法来保持CloudSearch索引的最新状态。

另一种方法是使用AmazonRDS,并使用MySQL或MS SQL的自由文本搜索和地理空间功能。当然,这可能需要一个架构(我假设你正试图避免)。