【问题标题】:Map phonetic string to possible alternate strings to match against dynamoDB将语音字符串映射到可能的备用字符串以匹配 dynamoDB
【发布时间】:2017-08-08 18:14:40
【问题描述】:

我们正在集成 Amazon 的 Alexa 以与我们的应用程序一起使用。我们在 DynamoDB 中创建了一个可能会询问 Alexa 的项目的字典。现在我们需要一种算法来将来自 Alexa 的文本与存储在 DynamoDB 表中的字符串进行匹配,这些字符串在语音上相似,但可能拼写不同或中间有特殊字符,例如

“X战警”可能被请求为“xmen”或“ex men”或“x men”

“Claire”可以请求为“clare”或“clair”

我发现Amazon DynamoDB-ElasticSearch Integration 是一个合理的选择,但我对它的了解还不够。这也可能非常昂贵。

我还试图找出是否有节点模块可以帮助找到可以与数据库匹配的类似字符串。

fuzzy search node module 可能对我们也不起作用,特别是因为我们有找到单个匹配项的约束,而不是单个字符串输入的可能匹配项列表。

例如。搜索"Xmen" 应该只返回"X-Men" 而不是"X-Men""Ex-servicemen"

我最后的办法是从头开始编写一个近似字符串匹配算法以及Levenshtein距离计算算法

【问题讨论】:

    标签: javascript node.js amazon-web-services amazon-dynamodb aws-lambda


    【解决方案1】:

    根据DynamoDB Query API Documentation

    查询:

    查询操作使用表的主键或二级索引 直接访问该表或索引中的项目。

    使用 KeyConditionExpression 参数提供特定值 为分区键。查询操作将返回所有 具有该分区键值的表或索引中的项目。你可以 可选地通过指定 a 来缩小 Query 操作的范围 排序键 值和 KeyConditionExpression 中的比较运算符。 您可以使用 ScanIndexForward 参数向前获取结果 或倒序,按排序键。

    KeyConditionExpression

    指定项的键值的条件 由 Query 操作检索。

    条件必须对单个分区键执行相等测试 价值。该条件还可以执行几个比较测试之一 在单个排序键值上。查询可以使用 KeyConditionExpression 来 检索具有给定分区键值和排序键值的项目, 或具有相同分区键值但不同的多个项目 对键值进行排序。

    分区键相等性测试是必需的,并且必须在 以下格式:

    partitionKeyName = :partitionkeyval

    如果您还想为排序键提供条件,则必须是 使用 AND 与排序键的条件相结合。以下是 一个示例,使用 = 比较运算符作为排序键:

    partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval

    排序键条件的有效比较如下:

    • sortKeyName = :sortkeyval - 如果排序键值等于 :sortkeyval,则为 true。
    • sortKeyName < :sortkeyval - 如果排序键值小于 :sortkeyval,则为 true。
    • sortKeyName <= :sortkeyval - 如果排序键值小于或等于 :sortkeyval,则为 true。
    • sortKeyName > :sortkeyval - 如果排序键值大于 :sortkeyval,则为 true。
    • sortKeyName >= :sortkeyval - 如果排序键值大于或等于 :sortkeyval,则为 true。
    • sortKeyName BETWEEN :sortkeyval1 AND :sortkeyval2 - 如果排序键值大于或等于 :sortkeyval1 且小于则为真 或等于 :sortkeyval2。
    • begins_with ( sortKeyName, :sortkeyval ) - 如果排序键值以特定操作数开头,则为真。 (您不能使用此功能 使用 Number 类型的排序键。)

    您可以选择使用 ExpressionAttributeNames 参数 用占位符替换分区键和排序键的名称 令牌。如果属性名称冲突,则可能需要此选项 带有 DynamoDB 保留字。例如,以下 KeyConditionExpression 参数会导致错误,因为 Size 是 保留字:

    Size = :myval
    

    要解决此问题,请定义一个占位符(例如 #S)来表示 属性名称大小。那么KeyConditionExpression如下:

    #S = :myval
    

    有关保留字的列表,请参阅 Amazon 中的保留字 DynamoDB 开发人员指南。

    有关 ExpressionAttributeNames 和 ExpressionAttributeValues,请参阅使用占位符作为属性名称 和 Amazon DynamoDB 开发人员指南中的值。

    类型:字符串

    必填:否

    您的场景可以转换为以下代码:

    $tableName = "genericTable";
    $response = $dynamodb->query([
        'TableName' => $tableName,
        'IndexName' => 'OrderCreationDateIndex',
        'KeyConditionExpression' => 'partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval',
        'ExpressionAttributeValues' =>  [
            ':partitionkeyval' => ['S' => 'pkey'],
            ':sortkeyval' => ['S' => 'sortkey']
        ],
        'Select' => 'ALL_PROJECTED_ATTRIBUTES',
        'ScanIndexForward' => false,
        'ConsistentRead' => true,
        'Limit' => 5,
        'ReturnConsumedCapacity' => 'TOTAL'
    ]);
    

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 2012-01-23
      • 2021-11-15
      • 2021-06-10
      • 2012-09-13
      相关资源
      最近更新 更多