swift - Swift:在庞大的数据库中快速搜索以找到相关结果的最佳方法是什么?
问题描述
我正在尝试实现一种搜索算法,该算法可以搜索数十万种产品并显示最相关的搜索。我目前的流程是
获取用户的输入并过滤掉介词和标点符号以得出关键字
将关键字分解为数组
对于每个关键字,找到产品描述中包含该关键字的所有产品,并将所有产品添加到 RawProductDictionary。
计算关键字和每个产品描述之间的 Levenshtein 距离数。
根据 Levenshtein 距离数创建一个产品数组。
这个问题建立在这个问题之上
Swift:如何根据每个项目的 Levenshtein 距离数排列字典值
这是我的 Levenshtein 距离函数
func levenshteinDist(test: String, key: String) -> Int {
let empty = Array<Int>(repeating:0, count: key.count)
var last = [Int](0...key.count)
for (i, testLetter) in test.enumerated() {
var cur = [i + 1] + empty
for (j, keyLetter) in key.enumerated() {
cur[j + 1] = testLetter == keyLetter ? last[j] : min(last[j], last[j + 1], cur[j]) + 1
}
last = cur
}
return last.last!
}
这是实现第 5 步的函数
func getProductData(){
Global.displayProductArry = []
var pIndexVsLevNum = [String : Int]()
for product0 in Global.RawSearchDict{
let generatedString = product0.value.name.uppercased()
let productIndex = product0.key
let relevanceNum = levenshteinDist(test: generatedString, key: self.userWordSearch)
pIndexVsLevNum[productIndex] = relevanceNum
}
print(pIndexVsLevNum)
Global.displayProductArry = []
for (k,v) in (Array(pIndexVsLevNum).sorted {$0.1 < $1.1}) {
print("\(k):\(v)")
Global.displayProductArry.append(Global.RawSearchDict[k]!)
}
}
代码有效,但产品与用户输入无关
- Levenshtein 距离数并不总是表示相关性。描述较短的产品通常处于不利地位并被遗漏。
快速搜索数十万种产品的最佳方法是什么?
解决方案
我相信您正在寻找全文搜索。您可以为此使用现有工具,而不是创建自己的信息检索过程。
看起来SQLite可以为您提供:请参阅:https ://medium.com/flawless-app-stories/how-to-use-full-text-search-on-ios-7cc4553df0e0
推荐阅读
- javascript - Google Apps 脚本:库中的 HTML 服务无法执行任何功能(潜在的浏览器安全问题?)
- javascript - 如何从 Cheerio/jQuery 中的 li 元素中选择值?
- reactjs - useSelector() 和 useDispatch() 是否替换了 mapStateToProps() 和 mapDispatchToProps()?
- kdb - 向 Kdb 表添加特殊字符?
- android - Android单元测试:如何测试来自RxJava的retryWhen是否被称为某些数字?
- algorithm - 具有扩展单元的旅行图问题的多源 BFS
- javascript - new Date(2020, 12, 122) 应该给我一个错误
- jenkins - 如何定期运行一个 Jenkins 作业,直到另一个 Jenkins 作业正在运行
- amazon-web-services - 如何使用私有 AMI 而不是公共 AMI 编写 cloudformation
- jquery - 如何在 jQuery 中组合这两个函数?