Windows Desktop Search - невероятно медленный SQL '%search%'

StackOverflow https://stackoverflow.com/questions/1541511

  •  20-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь запросить API поиска на рабочем столе Windows с помощью SQL.

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

Но здесь я столкнулся с проблемой производительности.Searching for

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

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

Вопрос в том:

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

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

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

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

В основном есть два варианта:он будет отклонен как недействительный (т.е.этот интерфейс SQL не поддерживает их расширение поиска FT), иначе это будет немного быстрее.

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

Другие советы

Может быть, попробуй

"SELECT \"System.ItemPathDisplay\" FROM \"SystemIndex\" WHERE CONTAINS(System.FileName, 'egon')";

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top