全文搜索DynamoDB

时间:2017-05-31 17:30:34

标签: amazon-web-services elasticsearch amazon-dynamodb amazon-cloudsearch

以下情况:

我正在为客户存储DyanmoDb中的元素。 HashKey是元素ID,范围键是客户ID。除了这些字段,我还存储了一串字符串 - >标签(例如[“Pets”,“House”])和多行文字。

我想在我的应用程序中提供搜索功能,用户可以在其中键入自由文本或选择标签并获取所有相关元素。

在我看来,普通的数据库查询不是正确的解决方案。我正在玩CloudSearch,但我不确定这是否是正确的解决方案,因为每次用户添加标签时索引都必须更新......

我希望你能给我一些提示。

5 个答案:

答案 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,但它有一个陡峭的学习曲线,考虑到它支持的功能和配置选项的数量,它可以成为管理的野兽。

在高层次上:

  1. 开启DynamoDB streams
  2. 设置 AWS Lambda 触发器以侦听这些更改事件
  3. 在 lambda 函数中编写代码以将数据索引到 Typesense 中:
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