0

有没有办法限制从NSMetadataQuerymacOS 上的查询返回的文件搜索结果的最大数量?目前,如果我输入1-2个字符作为查询字符串,接收初始结果集需要5秒以上,结果计数约为100k-300k,而我只需要前50个结果。如果我的查询字符串长度超过 5 个字符,则查询时间会减少到几毫秒。

我尝试了同样的MDQuery方法并且能够限制最大值。结果到 50 使用MDQuerySetMaxCount,所以我想知道是否有类似的东西NSMetadataQuery?我已经看到 Alfred 和类似的应用程序几乎可以在每次击键时立即返回前 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)")
        }
    }
}
4

1 回答 1

1

我建议问题出在您使用NSMetadataItemFSNameKey. 这很慢,因为必须查阅文件系统。请改用显示名称键;这是 Spotlight 索引的信息,所以速度很快。

于 2021-08-02T14:10:14.680 回答