Esecuzione di query sull'indice con ISearchQueryHelper

È possibile usare l'interfaccia ISearchQueryHelper per eseguire query sull'indice. Questa interfaccia viene implementata come classe helper a ISearchCatalogManager (e ISearchCatalogManager2) e viene ottenuta chiamando ISearchCatalogManager::GetQueryHelper. Questa interfaccia consente di:

  • Ottenere una stringa di connessione OLE DB per connettersi al database di Windows Search.
  • Convert Advanced Query Syntax (AQS) query utente in Windows Search Structured Query Language (SQL).
  • Specificare restrizioni di query che possono essere espresse in SQL, ma non in AQS.

Questo argomento è organizzato come segue:

Introduzione con ISearchQueryHelper

Esistono alcune interfacce chiave e metodi da tenere presente prima di iniziare a eseguire query a livello di codice in Windows Search usando l'interfaccia ISearchQueryHelper . A livello generale, è necessario seguire questa procedura:

  1. Creare un'istanza di ISearchManager .

    // Create ISearchManager instance
    ISearchManager* pSearchManager;
    
    // Use library SearchSDK.lib for CLSID_CSearchManager.
    hr = CoCreateInstance(CLSID_CSearchManager, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pSearchManager));      
    
  2. Ottenere un'istanza di ISearchCatalogManager usando ISearchManager::GetCatalog. Il nome del catalogo di sistema per Windows Search è SYSTEMINDEX.

    // Create ISearchCatalogManager instance 
    ISearchCatalogManager* pSearchCatalogManager;
    
    // Call ISearchManager::GetCatalog for "SystemIndex" to access the catalog to the ISearchCatalogManager
    hr = pSearchManager->GetCatalog(L"SystemIndex", &pSearchCatalogManager);
    
    
  3. Ottenere un'istanza di ISearchQueryHelper usando ISearchCatalogManager::GetQueryHelper.

    // Call ISearchCatalogManager::GetQueryHelper to get the ISearchQueryHelper interface
    ISearchQueryHelper* pQueryHelper;
    
    hr = pSearchCatalogManager->GetQueryHelper(&pQueryHelper);
    
    
  4. Dopo avere un'istanza di ISearchQueryHelper, è quindi possibile ottenere la stringa di connessione usata per connettersi al connettore OLE DB dell'indice di Windows Search.

    // Call get_ConnectionString to get the OLE DB connection string
    LPWSTR pszConnectionString=NULL;
    
    hr = pQueryHelper->get_ConnectionString(&pszConnectionString);
    // NOTE: YOU MUST call CoTaskMemFree() on the string
    
    

Uso del metodo GenerateSqlFromUserQuery

Il metodo ISearchQueryHelper::GenerateSQLFromUserQuery trasforma l'input utente in una stringa di query SQL, che può quindi essere inviata al provider OLE DB per Windows Search. Questo metodo converte la query Sintassi query avanzata (AQS) o Sintassi query naturale (NQS) immessa dall'utente in SQL e consente di aggiungere altri frammenti SQL in base alle esigenze.

La stringa di query SQL viene restituita nel formato seguente:

SELECT <QuerySelectColumns> 
FROM <CatalogName that created query helper>
WHERE <Result of interpreting the user query passed into this function according to QuerySyntax>
      [ AND|OR <QueryWhereRestrictions> ]
    

Di seguito è riportato un esempio della stringa SQL restituita dalla chiamata GenerateSQLFromUserQuery("comput"):

SELECT "System.ItemUrl" 
FROM "SystemIndex" 
WHERE ((CONTAINS(*,'"comput*"',1033) RANK BY COERCION(Absolute, 1)) OR 
       (FREETEXT(("System.ItemNameDisplay":0.9, *:0.1), 'comput', 1033) AND CONTAINS(*,'"comput"',1033)))
ORDER BY "System.ItemUrl"

Nota

Il metodo genera sia i predicati FREETEXT che i predicati CONTAINS perché CONTAINS da soli non genera una classificazione significativa.

 

Uso degli identificatori delle impostazioni locali

Metodo Descrizione
ISearchQueryHelper::get_QueryContentLocale/
ISearchQueryHelper::p ut_QueryContentLocale
Ottiene/Inserisce l'identificatore del codice del linguaggio (LCID) della query. Ciò consente di ottenere il wordbreaker corretto e stemmer per confrontare i termini di query rispetto all'indice catalog/inverted. Il valore predefinito è le impostazioni locali di input correnti.
ISearchQueryHelper::get_QueryKeywordLocale/
ISearchQueryHelper::p ut_QueryKeywordLocale
Ottiene/Inserisce l'LCID per il linguaggio da usare durante l'analisi delle parole chiave AQS (Advanced Query Syntax). Il valore predefinito è le impostazioni locali dell'utente predefinite.

 

Le impostazioni locali del contenuto e le impostazioni locali sono identificatori delle impostazioni locali (LCID) che consentono al motore di ricerca di usare i word breaker corretti identificando la lingua dei termini della query e la lingua delle parole chiave AQS. Questi non sono sempre gli stessi LCID perché Windows Search è offerto in una serie di versioni internazionali e include anche pacchetti MUI (Multilingue User Interface) per altre lingue. Le impostazioni locali del contenuto identificano l'LCID per gli utenti del linguaggio che inseriscono la query di ricerca in, mentre le impostazioni locali delle parole chiave identificano l'LCID usato dal motore di ricerca durante l'analisi delle parole chiave Sintassi query avanzate (AQS).

Ad esempio, se si dispone della versione inglese-US senza pacchetti MUI, le impostazioni locali del contenuto e le impostazioni locali delle parole chiave sono 1033. Se si dispone della versione tedesca senza pacchetti MUI, le impostazioni locali del contenuto e le impostazioni locali delle parole chiave sono 1031 (gr-gr). Tuttavia, se si ha la versione inglese con il pacchetto MUI romeno, le impostazioni locali del contenuto sono 2072 (ro) e le impostazioni locali della parola chiave sono 1033 (en-us).

Uso delle proprietà e delle colonne

Metodi Descrizione
ISearchQueryHelper::get_QueryContentProperties/
ISearchQueryHelper::p ut_QueryContentProperties
Ottiene/Imposta le proprietà del contenuto per la ricerca (colonna della proprietà elencata nelle clausole CONTAINS o FREETEXT).
ISearchQueryHelper::get_QuerySelectColumns/
ISearchQueryHelper::p ut_QuerySelectColumns
Ottiene/Imposta le colonne o le proprietà richieste nell'istruzione SELECT. Il valore predefinito è System.ItemUrl e le proprietà usate nella clausola WHERE.

 

Gli elementi vengono rappresentati nell'archivio delle proprietà come riga. Ogni riga contiene un numero di colonne che rappresentano le proprietà per tale elemento. Non tutti gli elementi avranno un valore per una determinata proprietà. Ad esempio, un file audio non contiene in genere un valore per la proprietà System.Property.FromName, ma può contenere informazioni relative a System.Music.Artist.

Con questi metodi si accede o si modifica la proprietà con una stringa delimitata da virgole, con terminazione null, Unicode che specifica uno o più nomi di colonna dell'archivio proprietà: "System.Document.Author, System.Document.Title".

Uso dell'espansione del termine di query

Metodi Descrizione
ISearchQueryHelper::get_QueryTermExpansion
ISearchQueryHelper::p ut_QueryTermExpansion
Ottiene/Imposta il flag di espansione del termine di ricerca.

 

Questo metodo consente l'espansione di alcuni termini di query con caratteri jolly, simili all'espansione delle espressioni regolari. L'espansione del prefisso cerca parole con lo stesso prefisso (fun/funnel). In caso contrario, il valore predefinito è SEARCH_TERM_PREFIX_ALL. I valori supportati dell'enumerazione SEARCH_TERM_EXPANSION sono i seguenti:

  • SEARCH_TERM_PREFIX_ALL - Tutti i termini di ricerca vengono espansi
  • SEARCH_TERM_NO_EXPANSION - Nessun termine di ricerca viene espanso

Uso di altri metodi ISearchQueryHelper

Molti dei metodi nell'interfaccia ISearchQueryHelper vengono usati per impostare argomenti di query o definire le proprietà restituite.

Metodi Descrizione
ISearchQueryHelper::get_ConnectionString
Restituisce la stringa di connessione OLE DB. Si tratta del metodo preferito per ottenere una stringa di connessione corretta e formattata correttamente.
ISearchQueryHelper::get_QueryMaxResults
ISearchQueryHelper::p ut_QueryMaxResults
Ottiene/Imposta il numero massimo di risultati da restituire da una query , ovvero SELECT TOP n. Il valore predefinito è -1, ovvero non viene generata alcuna clausola massima dei risultati.
ISearchQueryHelper::get_QuerySorting
ISearchQueryHelper::p ut_QuerySorting
Ottiene/Imposta l'ordine di ordinamento per il set di risultati della query (ORDER BY). Se non esiste alcuna clausola ORDER BY, i risultati vengono restituiti in ordine non deterministico.
ISearchQueryHelper::get_QuerySyntax
ISearchQueryHelper::p ut_QuerySyntax
Ottiene/Imposta la sintassi della query: sintassi di query avanzata o sintassi della query naturale.
ISearchQueryHelper::get_QueryWhereRestrictions
ISearchQueryHelper::p ut_QueryWhereRestrictions
Ottiene/Imposta le restrizioni aggiunte tramite clausole WHERE.

 

Esecuzione di query sull'indice a livello di codice

Uso di approcci SQL e AQS per eseguire query sull'indice

Esecuzione di query sull'indice con il protocollo search-ms

Esecuzione di query sull'indice con sintassi SQL di Windows Search

Uso della sintassi di query avanzata a livello di codice