我正在尝试使用SQL查询Windows桌面搜索API。
我不得不说我真的讨厌Windows 7搜索GUI,所以我决定写自己的。我有很多索引的文件(大约1.000.000),我想搜索名称。像:给我看每个包含“兔子”的名字。
但在这里我遇到了性能问题。正在搜索
SELECT "System.ItemPathDisplay"
FROM "SystemIndex"
WHERE System.FileName LIKE 'egon%'
非常快。也是%egon
替代方案。但%egon%
需要永远。我不确定它是否属于索引的性质(我理解可能性大大增加)或者我是否做错了。
问题是:
如果我有,那基本上只是优化SQL。
备选问题:是否有人知道快速SQL语句,以便在名称中的某处找到 egon 的所有文件。
编辑:为什么我不喜欢搜索GUI
嗯,与XP相比,它只是不直观。如果禁用狗并使用旧的XP界面,我可以创建一个搜索查询,如:
- 所有超过1个月的文件
- 大于10 MB
- 名称模式
*_homework_*.docx
在Windows 7中尝试此操作而不“学习”语法。而且,我做不想要学习另一种语法只是为了找到一个文件。
另一个主要问题可能是我的搜索习惯。大多数时候,我以某种方式知道文件名(或部分),只是想要位置。如果你以这种方式使用搜索,你会遇到几个问题:
现在我觉得我的系统有一个bug。我试图快速检查它,在一些平均大小的文件夹中搜索“test”,他找到了一些文件。然后我尝试对文件夹进行排序(以验证我的第二点),现在他只是永远搜索...我的意思是,在我打字的时候,他试图找到“你好”这个词......哦,完了 - 他发现大约20个文件。所以,现在,让我们尝试一下......好吧,现在好像他已经恢复了......但是,仍然,为了我的口味减慢......
所以,关于搜索的诅咒足够多了: - )
答案 0 :(得分:4)
看起来他们正在为名称构建索引,因此只要您指定了字符串的开头就可以使用索引,但如果没有,则必须使用表扫描。
假设他们正在使用微软的全文搜索引擎,那么请尝试使用以下内容: ... WHERE system.filename包含'egon'
基本上有两种选择:它将被拒绝为无效(即此SQL接口不支持其F-T搜索扩展),否则它会更快。
编辑:糟糕 - 语法应为“contains(system.filename,'egon')”。抱歉'回合那个。
答案 1 :(得分:4)
也许试试
"SELECT \"System.ItemPathDisplay\" FROM \"SystemIndex\" WHERE CONTAINS(System.FileName, 'egon')";
答案 2 :(得分:0)
这很慢,因为您无法使用索引。原因是您在字符串中搜索匹配而不是在字符串的开头,这意味着您必须扫描整个表以查找内容。