以下情况:
我正在为客户存储DyanmoDb中的元素。 HashKey是元素ID,范围键是客户ID。除了这些字段,我还存储了一串字符串 - >标签(例如[“Pets”,“House”])和多行文字。
我想在我的应用程序中提供搜索功能,用户可以在其中键入自由文本或选择标签并获取所有相关元素。
在我看来,普通的数据库查询不是正确的解决方案。我正在玩CloudSearch,但我不确定这是否是正确的解决方案,因为每次用户添加标签时索引都必须更新......
我希望你能给我一些提示。
答案 0 :(得分:4)
DynamoDB现在与Elasticsearch集成,使您能够执行 对您的数据进行全文查询。
https://aws.amazon.com/about-aws/whats-new/2015/08/amazon-dynamodb-elasticsearch-integration/
DynamoDB流用于使搜索索引保持最新。
答案 1 :(得分:0)
这是使用dynamodb作为aws的“托管服务”的优势。除了托管的nosql db之外,您还可以管理多个组件。 如果您使用的是“下载”版本的dynamodb,那么您需要“构建自己的”弹性集群并将数据编入dynamodb索引。
答案 2 :(得分:0)
DynamoDB刚刚添加了PartiQL,这是一种用于查询数据的SQL兼容语言。您可以使用 a b c
0 p 1 l
1 q 2 m
3 r 4 o
函数在集合(或子字符串)中查找值:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-functions.contains.html
答案 3 :(得分:0)
您可以使用像 Typesense 这样的即时搜索引擎来搜索 DynamoDB 表中的数据:
https://github.com/typesense/typesense
还有 ElasticSearch,但它有一个陡峭的学习曲线,考虑到它支持的功能和配置选项的数量,它可以成为管理的野兽。
在高层次上:
def lambda_handler(event, context):
client = typesense.Client({
'nodes': [{
'host': '<Endpoint URL>',
'port': '<Port Number>',
'protocol': 'https',
}],
'api_key': '<API Key>',
'connection_timeout_seconds': 2
})
processed = 0
for record in event['Records']:
ddb_record = record['dynamodb']
if record['eventName'] == 'REMOVE':
res = client.collections['<collection-name>'].documents[str(ddb_record['OldImage']['id']['N'])].delete()
else:
document = ddb_record['NewImage'] # format your document here and the use upsert function to index it.
res = client.collections['<collection-name>'].upsert(document)
print(res)
processed = processed + 1
print('Successfully processed {} records'.format(processed))
return processed
这是 Typesense 文档中关于如何执行此操作的详细文章:https://typesense.org/docs/0.19.0/guide/dynamodb-full-text-search.html
答案 4 :(得分:-1)
在您的特定情况下,您需要弹性搜索。但是您可以对排序键进行通配符文本搜索,
/* Return all of the songs by an artist, matching first part of title */
SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle LIKE 'Call%';
/* Return all of the songs by an artist, with a particular word in the title...
...but only if the price is less than 1.00 */
SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle LIKE '%Today%'
AND Price < 1.00;
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.ReadData.Query.html