我们正在集成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距离计算算法。

最佳答案

根据DynamoDB Query API Documentation


  查询:
  
  查询操作使用表的主键或辅助索引
  直接访问该表或索引中的项目。
  
  使用KeyConditionExpression参数提供特定值
  分区键。查询操作将返回所有
  表或索引中具有该分区键值的项。您可以
  通过指定一个(可选)来缩小查询操作的范围
  在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 )-如果排序键值以特定操作数开头,则为true。 (您不能使用此功能
  和数字类型的排序键)。
  
  
  您可以选择使用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'
]);

关于javascript - 将语音字符串映射到可能的备用字符串以与dynamoDB匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42853269/

10-10 06:21