我想知道尝试搜索数据的利弊(基本上是在有限的一组字段上进行全文搜索)。
我的数据当前在DynamoDB中,我意识到这不太适合全文搜索。是否可以在DynamoDB中进行全文搜索?这样做的利弊是什么?
我还可以使用搜索集群(例如ElasticSearch)。有什么理由不支持搜索集群?
还有其他方法可以进行全文搜索吗?其他解决方案?
答案 0 :(得分:2)
Dynamodb最适合键值插入和检索。
如果您尝试以O(n)的某种条件进行扫描,则它不支持搜索功能,而且由于您要消耗大量读取容量,因此它将非常昂贵。
现在进入选项
如果用例不是全文本搜索,而仅是键值匹配,则可以尝试提出composites key,但是它会有类似的缺点
a。此后无法更改架构,如果需要在新字段中进行搜索,则可能需要大量的精力。
b。考虑到很少有密钥总是很热,并且可能导致热分区,因此设计此类密钥非常棘手。
理想的解决方案是使用弹性搜索或Solr索引。您可以具有一个lambda函数来监听dynamodb流,进行转换并将数据放入elasticsearch中。但是它会有类似的限制
a。 Elasticsearch群集为costly。
答案 1 :(得分:-1)
查询DynamoDB时,如果不对分区键和排序键指定约束,则几乎是扫描整个分区或整个表。这是昂贵的。通过使用该字段作为排序键,您仍然可以在1个字段上实现前缀扫描。您无法优化查询,也无法进一步节省费用。
要执行全文搜索,您确实需要标记文本字段并使用这些标记构建反向索引。 Elasticsearch
就是这样做的。
名为Rockset的服务可以拖尾DynamoDB表并在其上提供功能齐全的SQL。您可以使用SQL LIKE
或REGEXP_LIKE
进行基本的文本搜索。但是,除非进行前缀扫描,否则仍将扫描该字段的整个反向索引。 Rockset支持标记文本字段以有效执行全文搜索。
此博客讨论如何使用Rockset通过SQL查询DynamoDB表中的数据: https://rockset.com/blog/running-fast-sql-on-dynamodb-tables/
此外,Rockset支持的文本搜索功能列表: https://docs.rockset.com/text-search-functions/
全面披露:我在Rockset的工程团队工作。