Windows Desktop Search - невероятно медленный SQL '% search%' - PullRequest
4 голосов
/ 09 октября 2009

Я пытаюсь запросить API поиска рабочего стола Windows, используя SQL.

Я должен сказать, что действительно ненавижу графический интерфейс поиска Windows 7, и поэтому я решил написать свой собственный. У меня много проиндексированных файлов (около 1.000.000), и я хочу выполнить поиск по именам. Что-то вроде: Покажите мне каждое имя, которое содержит «зайчик».

Но здесь я сталкиваюсь с проблемой производительности. Поиск

SELECT "System.ItemPathDisplay" 
FROM "SystemIndex" 
WHERE System.FileName LIKE 'egon%'

действительно быстро. Также альтернатива %egon. Но %egon% длится вечно. Я не уверен, имеет ли он характер индекса (я понимаю, что возможности значительно увеличиваются) или я делаю что-то не так.

Вопрос:

  • Правильно ли, что индекс windows является только большой базой данных SQL?
  • Если это так, где я могу найти точную информацию о структуре БД (первичные ключи, индексы).

Если у меня это есть, то это просто оптимизация SQL.

Альтернативный вопрос: Кто-нибудь знает быстрый оператор SQL для поиска всех файлов с egon где-нибудь в имени.

Редактировать: почему мне не нравится поиск GUI

Ну, это просто не интуитивно понятно, по сравнению с XP. Если вы отключите собаку и используете старый интерфейс XP, я мог бы создать поисковый запрос, например:

  • Все файлы старше 1 месяца
  • больше 10 МБ
  • имя шаблона *_homework_*.docx

Попробуйте это в Windows 7 без "изучения" синтаксиса. И, черт возьми, я не хочу изучать другой синтаксис только для того, чтобы найти один файл.

Другая главная проблема - это, возможно, мои привычки поиска. Большую часть времени я как-то знаю имя файла (или части) и просто хочу местоположение. И если вы используете поиск таким образом, вы столкнулись с несколькими проблемами:

  • Прежде всего, всегда нужно указывать префикс с именем:
  • Тогда расположение имени папки глупо (упорядочение по родительской папке, а не по полному пути, я думаю , потому что .. тада ... см. Следующий пункт)
  • Тогда, что еще более раздражает, если у вас есть список результатов и вы пытаетесь их отсортировать, это займет вечность

И теперь я действительно думаю, что в моей системе есть ошибка. Я попытался быстро проверить это, поискал в папке среднего размера «test», и он нашел несколько файлов. Затем я попытался отсортировать их по папкам (чтобы проверить мою вторую точку), и теперь он просто ищет навсегда ... Я имею в виду, в то время как я печатаю, он пытается найти слово "привет" ... о, закончил - он найдено около 20 файлов. Итак, давайте попробуем кое-что ... Хорошо, теперь кажется, что он выздоровел ... Но все же, чтобы замедлить на мой вкус ...

Итак, хватит ругаться по поводу поиска: -)

Ответы [ 3 ]

4 голосов
/ 09 октября 2009

Похоже, что они строят индекс по имени, поэтому он может использовать индекс, если вы указали начало строки, но если нет, он должен использовать сканирование таблицы.

Предполагая, что они используют механизм полнотекстового поиска Microsoft, попробуйте использовать что-то вроде:
... ГДЕ system.filename СОДЕРЖИТ 'egon'

Существует два варианта: он будет отклонен как недействительный (т. Е. Этот интерфейс SQL не поддерживает расширение поиска F-T), иначе он будет немного быстрее.

РЕДАКТИРОВАТЬ: К сожалению, синтаксис должен быть «содержит (system.filename, 'egon')». Извините насчет этого.

4 голосов
/ 09 октября 2009

Может быть попробовать

"SELECT \"System.ItemPathDisplay\" FROM \"SystemIndex\" WHERE CONTAINS(System.FileName, 'egon')";
0 голосов
/ 09 октября 2009

Это медленно, потому что вы не можете использовать индекс. Причина в том, что вы ищете совпадение в любом месте строки, а не в начале строки, что означает, что вы должны сканировать всю таблицу на предмет содержимого.

...