Domanda

Sto cercando di interrogare l'API di ricerca desktop di Windows utilizzando SQL.

Devo dire che ho davvero odio la ricerca di Windows 7 GUI, e così ho deciso di scrivere il mio. Ho un sacco di file indicizzati (circa 1.000.000), e voglio fare una ricerca per i nomi. Qualcosa di simile: Mostrami ogni nome che contiene "bunny"

.

Ma qui mi imbatto in un problema di prestazioni. Ricerca di

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

è veramente veloce. Anche il %egon alternativa. Ma %egon% prende sempre. Non sono sicuro se è nella natura dell'indice (ho capito che le possibilità aumentano enormemente) o se sto facendo qualcosa di sbagliato.

La domanda è:

  • È vero che l'indice di Windows è solo un grande database SQL?
  • Se è così, dove posso trovare informazioni precise sulla struttura del DB (chiavi primarie, indici).

Se ho questo, il suo SQL fondamentalmente solo l'ottimizzazione.

domanda Alternativa:. Fa qualcuno sa un'istruzione SQL veloce per trovare tutti i file con Egon da qualche parte nel nome

Modifica: Perché non mi piace la ricerca GUI

Bene, la sua non solo intuitivo, rispetto a XP. Se si disattiva il cane e utilizzare la vecchia interfaccia XP, ho potuto creare una query di ricerca come:

  
      
  • Tutti i file più vecchi di 1 mese
  •   
  • più grandi di 10 MB
  •   
  • nome del pattern *_homework_*.docx
  •   

Prova questo in Windows 7, senza "imparare" la sintassi. E l'inferno, lo faccio non vogliono imparare un'altra sintassi solo per trovare un file.

L'altro problema principale sono forse le mie abitudini di ricerca. La maggior parte del tempo in qualche modo conoscere il nome del file (o parti) e vogliono semplicemente la posizione. E se si utilizza la ricerca in questo modo è stato eseguito in più problema:

  • Prima di tutto, si deve sempre prefisso con il nome:
  • Poi il layout nome della cartella è stupido (che sta ordinando dalla cartella principale, non il percorso completo, I pensare , perché .. tada ... vedi punto successivo)
  • Poi, ancora più fastidioso, se si dispone di un elenco di risultati e si tenta di ordinare loro, ci vuole sempre

E ora ho davvero che il mio sistema ha un bug. Ho cercato di verificare rapidamente, cercato in qualche cartella dimensione media per "test" e ha trovato alcuni file. Poi ho provato a ordinarli per le cartelle (per verificare il mio secondo punto) e ora sta solo cercando sempre ... intendo realmente, mentre sto scrivendo egli cerca di trovare la parola "ciao" ... oh, finito - ha trovati circa 20 file. Così, ora, permette di provare qualcosa .... Ok, ora sembra che lui ha recuperato .. Ma ancora, a rallentare per i miei gusti ...

Quindi, basta imprecazioni sulla ricerca: -)

È stato utile?

Soluzione

Sembra che stanno costruendo un indice sul nome, in modo che possa utilizzare l'indice fintanto che hai specificato l'inizio della stringa, ma se non si dispone, deve utilizzare una scansione di tabella.

Supponendo che stanno usando il motore di ricerca full-text di Microsoft, quindi provare a utilizzare qualcosa di simile:
... DOVE system.filename CONTIENE 'Egon'

Ci sono fondamentalmente due scelte: Sarà respinto come non validi (vale a dire questa interfaccia SQL non supporta la loro estensione di ricerca F-T), oppure sarà un po 'più veloce

.

EDIT: Oops - la sintassi dovrebbe essere "contiene (system.filename, 'Egon')". Sorry 'bout che.

Altri suggerimenti

Forse provare

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

Questa è lento perché non si riesce a utilizzare un indice. La ragione è che si sta cercando una corrispondenza anwhere nella stringa piuttosto che all'inizio della stringa che significa che è necessario eseguire la scansione l'intera tabella per i contenuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top