如何限制从 NSMetadataQuery 返回的结果数?
How to limit the number of results returned from NSMetadataQuery?
有没有办法限制从 macOS 上的 NSMetadataQuery
查询 return 编辑的文件搜索结果的最大数量?目前,如果我输入 1-2 个字符作为查询字符串,需要 5 秒以上才能收到初始结果集,结果数约为 100k-300k,而我只需要前 50 个结果。如果我的查询字符串长度超过 5 个字符,查询时间将减少到几毫秒。
我对 MDQuery
进行了同样的尝试,并且能够限制最大值。使用 MDQuerySetMaxCount
结果为 50,所以我想知道 NSMetadataQuery
中是否有类似的东西?我见过 Alfred 和类似的应用程序 return 每次击键几乎立即获得前 20-40 个结果。
这是我目前的情况:
class MDQSearch {
var metadataQuery = NSMetadataQuery()
init() {
registerNotifications()
metadataQuery.searchScopes = [NSString("~/Documents").expandingTildeInPath]
}
func updateQuery(to queryString: String) {
guard queryString.count > 0 else { return }
metadataQuery.predicate = NSPredicate(format: "%K CONTAINS[cd] %@", argumentArray: [NSMetadataItemFSNameKey, queryString])
metadataQuery.start()
}
func registerNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(onQueryDidFinishGathering), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: metadataQuery)
NotificationCenter.default.addObserver(self, selector: #selector(onQueryGatheringProgress), name: NSNotification.Name.NSMetadataQueryGatheringProgress, object: metadataQuery)
NotificationCenter.default.addObserver(self, selector: #selector(onQueryDidUpdate), name: NSNotification.Name.NSMetadataQueryDidUpdate, object: metadataQuery)
}
@objc func onQueryDidUpdate() {
print("QueryDidUpdate")
}
@objc func onQueryDidFinishGathering() {
print("QueryDidFinishGathering")
metadataQuery.stop()
print("result count: \(metadataQuery.resultCount)")
}
@objc func onQueryGatheringProgress() {
print("QueryGatheringProgress")
if(metadataQuery.resultCount >= 50) {
metadataQuery.stop()
print("result count: \(metadataQuery.resultCount)")
}
}
}
我认为问题出在您对 NSMetadataItemFSNameKey
的使用上。这很慢,因为必须查询文件系统。改用显示名称键;这是 Spotlight 索引的信息,所以速度很快。
有没有办法限制从 macOS 上的 NSMetadataQuery
查询 return 编辑的文件搜索结果的最大数量?目前,如果我输入 1-2 个字符作为查询字符串,需要 5 秒以上才能收到初始结果集,结果数约为 100k-300k,而我只需要前 50 个结果。如果我的查询字符串长度超过 5 个字符,查询时间将减少到几毫秒。
我对 MDQuery
进行了同样的尝试,并且能够限制最大值。使用 MDQuerySetMaxCount
结果为 50,所以我想知道 NSMetadataQuery
中是否有类似的东西?我见过 Alfred 和类似的应用程序 return 每次击键几乎立即获得前 20-40 个结果。
这是我目前的情况:
class MDQSearch {
var metadataQuery = NSMetadataQuery()
init() {
registerNotifications()
metadataQuery.searchScopes = [NSString("~/Documents").expandingTildeInPath]
}
func updateQuery(to queryString: String) {
guard queryString.count > 0 else { return }
metadataQuery.predicate = NSPredicate(format: "%K CONTAINS[cd] %@", argumentArray: [NSMetadataItemFSNameKey, queryString])
metadataQuery.start()
}
func registerNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(onQueryDidFinishGathering), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: metadataQuery)
NotificationCenter.default.addObserver(self, selector: #selector(onQueryGatheringProgress), name: NSNotification.Name.NSMetadataQueryGatheringProgress, object: metadataQuery)
NotificationCenter.default.addObserver(self, selector: #selector(onQueryDidUpdate), name: NSNotification.Name.NSMetadataQueryDidUpdate, object: metadataQuery)
}
@objc func onQueryDidUpdate() {
print("QueryDidUpdate")
}
@objc func onQueryDidFinishGathering() {
print("QueryDidFinishGathering")
metadataQuery.stop()
print("result count: \(metadataQuery.resultCount)")
}
@objc func onQueryGatheringProgress() {
print("QueryGatheringProgress")
if(metadataQuery.resultCount >= 50) {
metadataQuery.stop()
print("result count: \(metadataQuery.resultCount)")
}
}
}
我认为问题出在您对 NSMetadataItemFSNameKey
的使用上。这很慢,因为必须查询文件系统。改用显示名称键;这是 Spotlight 索引的信息,所以速度很快。