我正在构建一个服务,其中将包含数百万行数据。我们希望对此进行良好的搜索。例如。我们可以通过一些字段值进行搜索。该行的结构如下所示:
{
"field1" : "value1",
"field2" : "value2",
"field3" : {
"field4": "value4",
"field5": "value5"
}
}
此外,field3的结构可能会随field4的存在而改变,有时可能不会。
我们希望在以下字段field1,field2和field 4上具有过滤器。我们可以在dynamodb中创建索引来做到这一点。但是我不确定是否可以在不展平json的情况下轻松地在dynamodb中的field4上创建索引。
现在,我的问题是,我们是否应该为此使用弹性搜索数据存储,就我所知,它将在文档中的每个字段上创建索引,然后可以在每个字段上进行搜索?那正确吗?还是应该使用dynamodb或完全使用其他任何数据存储?
请提供一些建议。
答案 0 :(得分:3)
如果搜索是您的应用程序的关键要求,请使用搜索产品-而不是数据库。 Dynamodb非常适合很多事情,但临时搜索不是其中之一-如果使用dynamodb,您将最终运行许多非常昂贵(缓慢)的扫描。这就是ES的目标。
答案 1 :(得分:2)
我在dynamoDB方面具有良好的工作经验,并且在Elasticsearch(ES)方面具有广泛的工作经验。
首先让我们了解这两者之间的主要区别:
期间Amazon DynamoDB是键值和文档数据库
Elasticsearch是一个分布式的开源搜索和分析工具 引擎,可处理所有类型的数据,包括文本,数字, 地理空间,结构化和非结构化数据。
现在开始质疑,让我们讨论一下这些系统在内部如何工作以及如何影响性能。
DynamoDB非常适合基于键获取文档,但不适用于过滤和搜索,例如,在关系数据库中,可以提高您在索引上创建索引的操作性能列,您必须以类似的方式在dynamoDB中将索引创建为数据库,而不是搜索引擎。而且,要动态地在字段上创建索引很麻烦,并且无法将其缓存在DynamoDB中。
Elasticsearch通过为所有索引字段创建倒排索引(OP提到的默认值)来不同地存储数据,并且如果您使用与此处相同的用例上下文,则对这些字段的过滤非常快,有关示例的更多信息是在官方ES文档https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html#filter-context中进行了解释,此外,由于这些过滤器不用于分数计算,也不缓存在elasticsearch上,因此它们的性能(读取和写入)都比dynamoDB快,也可以进行基准测试。