1

我們正在整合亞馬遜的Alexa以與我們的應用程序一起工作。我們已經創建了一個在DynamoDB中可能會要求Alexa的項目的字典。現在我們需要一種算法將Alexa文本與存儲在DynamoDB表中的字符串進行匹配,這些字符串在語音上相似,但拼寫可能不同或拼寫有特殊字符,例如,將拼音字符串映射到可能的替代字符串以匹配dynamoDB

「X戰警」可能會被要求爲「X戰警」或「前男」或「X戰警」

「嘉人」可能會被要求爲「克萊爾」或「月光」

我發現Amazon DynamoDB-ElasticSearch Integration是一個合理的選擇,但我還沒有充分了解它。這可能也非常昂貴。

我還試圖找出是否有節點模塊,可以幫助找到類似的字符串,我可以匹配數據庫。

fuzzy search node module可能不適合我們,特別是因爲我們有約束找到單個匹配而不是單個字符串輸入的可能匹配列表。

例如,一種"Xmen"搜索應該只返回"X-Men"而不是"X-Men""Ex-servicemen"

我不得已將與從頭Levenshtein距離計算算法一起寫近似字符串匹配算法

回答

0

根據DynamoDB Query API Documentation

查詢:

查詢操作使用表或次要索引 直接訪問從該表或索引項的主鍵。

使用KeyConditionExpression參數爲分區鍵提供特定值 。查詢操作將使用該分區鍵值從表或索引中返回所有 項目。您可以通過在KeyConditionExpression中指定 排序鍵值和比較運算符來可選地縮小查詢操作的範圍。 可以使用ScanIndexForward參數按排序鍵以 或相反順序獲得結果。

KeyConditionExpression

,用於指定項是在由查詢動作檢索 密鑰值(一個或多個)條件。

該條件必須對單個分區鍵 的值執行相等性測試。該條件還可以對單個排序鍵值執行幾個比較測試 中的一個。查詢可以使用KeyConditionExpression來 檢索具有給定分區鍵值和排序鍵值的一個項目, 或幾個具有相同分區鍵值但不同 排序鍵值的項目。

分區鍵相等測試是必需的,而且必須在 以下格式指定:

partitionKeyName = :partitionkeyval

如果您也想爲排序鍵的條件,則必須使用是 合併以及排序鍵的條件。以下是 一個例子,使用=比較運算符排序鍵:

partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval

有效的比較用於排序關鍵條件如下:

  • sortKeyName = :sortkeyval - 如果排序鍵值真等於:sortkeyval。
  • sortKeyName < :sortkeyval - 如果排序鍵值小於:sortkeyval,則爲true。
  • sortKeyName <= :sortkeyval - 如果排序關鍵字值小於或等於:sortkeyval,則返回true。
  • sortKeyName > :sortkeyval - 如果排序關鍵值大於:sortkeyval,則爲true。
  • sortKeyName >= :sortkeyval - 如果排序關鍵字值大於或等於:sortkeyval,則返回true。
  • sortKeyName BETWEEN :sortkeyval1 AND :sortkeyval2 - 如果排序關鍵字值大於或等於:sortkeyval1且小於 或等於sortkeyval2,則爲true。
  • begins_with (sortKeyName, :sortkeyval) - 如果排序鍵值以特定操作數開頭,則返回true。 (您不能使用此功能 與是Number類型排序關鍵字。)

您可以選擇使用ExpressionAttributeNames參數 替換分​​區鍵的名稱和與佔位 令牌排序鍵。如果屬性名稱與DynamoDB保留字衝突 ,則可能需要此選項。例如,下面的 KeyConditionExpression參數將導致錯誤,因爲尺寸是 保留字:

Size = :myval 

爲了解決這個問題,定義一個佔位符(例如一個#S)來表示 屬性名大小。 KeyConditionExpression則如下:

#S = :myval 

對於保留字的列表,請參閱保留字亞馬遜 DynamoDB開發者指南中。

有關ExpressionAttributeNames和 ExpressionAttributeValues的更多信息,請參閱Amazon DynamoDB開發人員指南中的使用屬性名稱的佔位符 和值。

類型:String

要求:無

您的情況可以轉換爲下面的代碼:

$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' 
]);