如何限制从 NSMetadataQuery 返回的结果数量?

Posted

技术标签:

【中文标题】如何限制从 NSMetadataQuery 返回的结果数量?【英文标题】:How to limit the number of results returned from NSMetadataQuery? 【发布时间】:2021-10-07 20:10:24 【问题描述】:

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

我对@9​​87654322@ 进行了同样的尝试,并且能够限制最大值。使用MDQuerySetMaxCount 的结果为50,所以我想知道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)")
        
    

【问题讨论】:

【参考方案1】:

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

【讨论】:

嗨@matt,感谢您的回答!我尝试改用NSMetadataItemDisplayNameKey,虽然查询肯定比以前更快,但仍需要至少 2 秒才能完成。是否有可能以与 macOS 的 Spotlight 搜索或 Alfred 等应用程序相当的速度接收结果?我正在尝试在我的应用中实现类似的文件搜索功能。 我想强调的是,当查询字符串为1-2个字符时,它只需要2秒。一旦字符数增加到 5 个或更多,搜索查询的范围就会缩小,几乎可以立即返回结果。 结果应该一次涌现出来,你应该能够像他们一样做出回应。您不必等待任何事情“完成”。您的通知方法不是立即开始打印吗? 是的,确实如此。现在应该可以了;非常感谢您的帮助!

以上是关于如何限制从 NSMetadataQuery 返回的结果数量?的主要内容,如果未能解决你的问题,请参考以下文章

两个 iCloud 设备使用 NSMetaDataQuery 得到不同的结果

禁用 iCloud 时是不是可以使用 NSMetadataQuery?

NSMetadataQuery 忽略自定义文件包类型

NSMetadataQuery数据库

UIDocument openWithCompletionHandler:强制 NSMetadataQuery 更新

使用 NSMetadataQuery 在目录中搜索文件