Abfrageprozess in Windows Search
Dieses Thema ist wie folgt organisiert:
Informationen zur Abfrage in Windows Search
Abfragen in Windows Search basieren auf den folgenden vier Ansätzen:
- Erweiterte Abfragesyntax (AQS)
- Natürliche Abfragesyntax (NQS)
- Structured Query Language (SQL) (Structured Query Language, SQL)
- Strukturierte Abfrageschnittstellen
AQS ist die Standardabfragesyntax, die von Windows Search zum Abfragen des Indexes und zum Verfeinern und Einschränken von Suchparametern verwendet wird. AQS ist in erster Linie benutzerseitig und kann von Benutzern zum Erstellen von AQS-Abfragen verwendet werden, kann aber auch von Entwicklern verwendet werden, um Abfragen programmgesteuert zu erstellen. In Windows 7 wurde kanonische AQS eingeführt und muss zum programmgesteuerten Generieren von AQS-Abfragen verwendet werden. In Windows 7 und höher kann eine Kontextmenüoption verfügbar sein, je nachdem, ob eine AQS-Bedingung erfüllt ist. Weitere Informationen finden Sie unter Abrufen von dynamischem Verhalten für statische Verben mithilfe der erweiterten Abfragesyntax unter Erstellen von Kontextmenühandlern. AQS-Abfragen können auf bestimmte Dateitypen beschränkt werden, die als Dateitypen bezeichnet werden. Weitere Informationen finden Sie unter Dateitypen und Zuordnungen. Referenzdokumentation zu den relevanten Eigenschaften finden Sie unter System.Kind und System.KindText.
NQS ist eine Abfragesyntax, die entspannter als AQS ist und der menschlichen Sprache ähnelt. NQS kann von Windows Search verwendet werden, um den Index abzufragen, wenn NQS anstelle der Standardeinstellung AQS ausgewählt ist.
SQL ist eine Textsprache, die Abfragen definiert. SQL ist in vielen verschiedenen Datenbanktechnologien üblich. Windows Search verwendet SQL, implementiert eine Teilmenge davon und erweitert sie durch Hinzufügen von Elementen zur Sprache. Windows Search SQL erweitert die Standardmäßige SQL-92- und SQL-99-Datenbankabfragesyntax, um ihre Nützlichkeit bei textbasierten Suchvorgängen zu verbessern. Alle Features von Windows Search SQL sind mit Windows Search unter Windows XP und Windows Server 2003 und höher kompatibel. Weitere Informationen zu Windows Search SQL finden Sie unter Abfragen des Indexes mit windows Search SQL-Syntax und Übersicht über die Windows Search-SQL-Syntax.
Die APIs für strukturierte Abfragen werden weiter unten in diesem Thema beschrieben. Referenzdokumentation zu den strukturierten Abfrage-APIs finden Sie unter Abfrageschnittstellen. Schnittstellen wie ISearchQueryHelper helfen beim Erstellen von SQL-Zeichenfolgen aus einer Reihe von Eingabewerten. Diese Schnittstelle konvertiert AQS-Benutzerabfragen in Windows Search SQL und gibt Abfrageeinschränkungen an, die in SQL, aber nicht in AQS ausgedrückt werden können. ISearchQueryHelper ruft auch eine OLE DB-Verbindungszeichenfolge ab, um eine Verbindung mit der Windows Search-Datenbank herzustellen.
Lokale und Remoteabfragen
Sie können Ihre Abfragen entweder lokal oder remote ausführen. Im folgenden Beispiel wird eine lokale Abfrage mit der FROM-Klausel gezeigt. Eine lokale Abfrage fragt nur den lokalen SystemIndex-Katalog ab.
FROM SystemIndex
Im folgenden Beispiel wird eine Remoteabfrage mit der FROM-Klausel gezeigt. Das Hinzufügen von ComputerName transformiert das vorherige Beispiel in eine Remoteabfrage.
FROM [<ComputerName>.]SystemIndex
Windows Search ist in Windows XP und Windows Server 2003 standardmäßig nicht installiert. Nur Windows Search 4 (WS4) bietet Remoteabfrageunterstützung. Frühere Versionen von Windows Desktop Search (WDS), z. B. 3.01 und früher, unterstützen keine Remoteabfragen. Mit Windows Explorer können Sie den lokalen Index eines Remotecomputers nach Dateisystemelementen (Elemente, die vom Protokoll "file:" behandelt werden) abfragen.
Um ein Element per Remoteabfrage abzurufen, muss das Element die folgenden Anforderungen erfüllen:
- Der Zugriff erfolgt über den UNC-Pfad (Universal Naming Convention).
- Auf dem Remotecomputer vorhanden, auf den der Client Zugriff hat.
- Legen Sie dessen Sicherheit fest, um dem Client Lesezugriff zu ermöglichen.
Windows Explorer verfügt über Funktionen zum Freigeben von Elementen, einschließlich einer "Öffentlichen" Freigabe (\\Machine\Public\...) im Netzwerk- und Freigabecenter und einer Benutzerfreigabe (\\Machine\Users\...) für Elemente, die über den Freigabe-Assistenten freigegeben werden. Nachdem Sie die Ordner freigegeben haben, können Sie den lokalen Index abfragen, indem Sie den Computernamen des Remotecomputers in der FROM-Klausel und einen UNC-Pfad auf dem Remotecomputer in der SCOPE-Klausel angeben. Eine Remoteabfrage mit den FROM- und SCOPE-Klauseln wird im folgenden Beispiel gezeigt.
SELECT System.ItemName FROM MachineName.SystemIndex WHERE SCOPE='file://MachineName/<path>'
In den hier bereitgestellten Beispielen wird SQL verwendet.
Übersicht über strukturierte Abfrage-API
Eine strukturierte Abfrage ermöglicht die Suche nach Informationen durch boolesche Kombinationen von Abfragen über einzelne Eigenschaften. In diesem Thema wird die Funktionalität der wichtigsten strukturierten Abfrage-APIs und -Methoden beschrieben. Referenzdokumentation zu den strukturierten Abfrage-APIs finden Sie unter Abfrageschnittstellen.
IQueryParser
Die IQueryParser::P arse-Methode analysiert eine Benutzereingabezeichenfolge und erzeugt eine Interpretation in Form einer IQuerySolution. Wenn der pCustomProperties-Parameter dieser Methode nicht NULL ist, handelt es sich um eine Enumeration von IRichChunk-Objekten (eine für jede erkannte benutzerdefinierte Eigenschaft). Mit den anderen IQueryParser-Methoden kann die Anwendung mehrere Optionen festlegen, z. B. Gebietsschema, Schema, Worttrennung und Handler für verschiedene Typen benannter Entitäten. IQueryParser::GetSchemaProvider gibt eine ISchemaProvider-Schnittstelle zum Durchsuchen des geladenen Schemas zurück.
IQuerySolution : IConditionFactory
Die IQuerySolution-Schnittstelle stellt alle Informationen zum Ergebnis der Analyse einer Eingabezeichenfolge bereit. Da IQuerySolution auch eine IConditionFactory-Schnittstelle ist, können zusätzliche Bedingungsstrukturknoten erstellt werden. Die IQuerySolution::GetQuery-Methode erzeugt eine Bedingungsstruktur für die Interpretation. IQuerySolution::GetQuery gibt auch den semantischen Typ zurück.
IConditionFactory
IConditionFactory erstellt Bedingungsstrukturknoten. Wenn der Simplify-Parameter von IConditionFactory::MakeNotVARIANT_TRUE ist, wird die resultierende ICondition vereinfacht und muss kein Negationsknoten sein. Wenn der pSubConditions-Parameter von IConditionFactory::MakeAndOr nicht NULL ist, sollte dieser Parameter eine Enumeration von ICondition-Objekten sein und zu Unterstrukturen werden. IConditionFactory::MakeLeaf erstellt einen Blattknoten mit einem angegebenen Eigenschaftennamen, Vorgang und Wert. Die Zeichenfolge im pValueType-Parameter sollte der Name eines semantischen Typs aus dem Schema sein. Wenn der expand-ParameterVARIANT_TRUE und die Eigenschaft virtuell ist, ist die resultierende Bedingungsstruktur in der Regel eine Disjunktion, die sich aus der Erweiterung der Eigenschaft auf die definierten Bestandteile ergibt. Wenn nicht NULL, sollten die Parameter pPropertyNameTerm, pOperatorTerm und pValueTerm Begriffe identifizieren, die die Eigenschaft, den Vorgang und den Wert angeben.
ICondition : IPersistStream
Die ICondition-Schnittstelle ist ein einzelner Knoten in einer Bedingungsstruktur. Der Knoten kann ein Negationsknoten, and-Knoten, ODER Knoten oder ein Blattknoten sein. Für einen Knoten ohne Blatt gibt ICondition::GetSubConditions eine Enumeration der Unterstrukturen zurück. Für einen Blattknoten geben die folgenden Methoden von ICondition die folgenden Werte zurück:
- GetComparisonInfo gibt den Eigenschaftsnamen, den Vorgang und den Wert zurück.
- GetValueType gibt den semantischen Typ des Werts zurück, der im pszValueType-Parameter von IConditionFactory::MakeLeaf festgelegt wurde.
- GetValueNormalization gibt eine Zeichenfolgenform des Werts zurück. (Wenn der Wert bereits eine Zeichenfolge war, wird diese Form in Bezug auf Groß-/Kleinschreibung, Akzente usw. normalisiert.)
- GetInputTerms gibt Informationen darüber zurück, welche Teile des Eingabesatzes den Eigenschaftennamen, den Vorgang und den Wert generiert haben.
- Klon gibt eine tiefe Kopie einer Bedingungsstruktur zurück.
IRichChunk
Jedes IRichChunk-Objekt identifiziert eine Tokenspanne und eine Zeichenfolge. IRichChunk ist eine Hilfsprogrammschnittstelle, die Informationen zu einer Spanne (in der Regel eine Spanne von Token) darstellt, die durch eine Startposition und Länge identifiziert wird. Diese Span-Informationen umfassen eine Zeichenfolge und/oder eine VARIANT.
IConditionGenerator
Die IConditionGenerator-Schnittstelle wird von der Anwendung bereitgestellt, um die Erkennungs- und Bedingungsstrukturgenerierung für einen benannten Entitätstyp zu verarbeiten. Ein Bedingungsgenerator wird einem IQueryParser über IQueryParser::SetMultiOption zugewiesen. IQueryParser ruft IConditionGenerator::Initialize mit einem ISchemaProvider für das aktuell geladene Schema auf. Dadurch kann IConditionGenerator alle erforderlichen Schemainformationen abrufen. Beim Analysieren einer Eingabezeichenfolge ruft IQueryParser die IConditionGenerator::RecognizeNamedEntities-Methode jedes IConditionGenerator auf, sodass das Vorkommen benannter Entitäten, die in der Eingabezeichenfolge erkannt werden, gemeldet werden kann. IQueryParser kann das aktuelle Gebietsschema verwenden und sollte die Tokenisierung der Eingabe verwenden, da sie die Tokenspannen aller benannten Entitäten melden muss.
Wenn IQueryParser einen Blattknoten ausgeben soll und der semantische Typ des Werts dem benannten Entitätstyp für einen IConditionGenerator entspricht, ruft IQueryParser IConditionGenerator::GenerateforLeaf mit den Informationen für den zu generierenden Knoten auf. Wenn der IConditionGenerator S_OK zurückgibt, sollte er eine Bedingungsstruktur zurückgeben (die kein Blattknoten sein muss) und IQueryParser darüber informieren, ob die alternative Zeichenfolgeninterpretation unterdrückt werden soll, die normalerweise als Vorsichtsmaßnahme generiert würde.
ITokenCollection
Die ITokenCollection::NumberOfTokens-Methode gibt die Anzahl der Token zurück. ITokenCollection::GetToken gibt Informationen zum ith-Token zurück. Anfang und Länge sind Zeichenpositionen in der Eingabezeichenfolge. Der zurückgegebene Text ist nur dann ungleich NULL, wenn ein Text die Zeichen aus der Eingabezeichenfolge überschreibt. Dies wird beispielsweise verwendet, um einen Bindestrich in der Eingabezeichenfolge mit NOT außer Kraft zu setzen, wenn sich dieser Bindestrich in einem Kontext befindet, in dem er als Negation interpretiert werden soll.
INamedEntityCollector
IConditionGenerator ruft INamedEntityCollector::Add für jede benannte Entität auf, die erkannt wurde. Bei den Spannen handelt es sich um Tokenspannen. Es muss immer der Fall sein, dass beginntSpan ? beginActual<endActual ? endSpan. beginSpan und endSpan können sich von beginActual und endActual unterscheiden, wenn die benannte Entität beginnt und/oder mit semantisch unbedeutenden Token wie Anführungszeichen endet (die dennoch von der benannten Entität abgedeckt werden). Der Wert muss als Zeichenfolge ausgedrückt werden und wird anschließend in einem Aufruf von IConditionGenerator::GenerateForLeaf angezeigt.
ISchemaProvider
Die ISchemaProvider-Schnittstelle kann verwendet werden, um ein geladenes Schema nach Entitäten (Typen) und Beziehungen (Eigenschaften) zu durchsuchen. Hier sehen Sie, was die einzelnen Methoden tun:
- Entitäten geben eine Enumeration jeder Entität (IEntity) im Schema zurück.
- RootEntity gibt die Stammentität des Schemas zurück. Bei einem flachen Schema wird der Standard Typ jeder IQuerySolution zurückgegeben.
- GetEntity findet eine Entität anhand des Namens und gibt S_FALSE zurück, wenn keine solche Entität im Schema vorhanden ist.
- MetaData gibt eine Enumeration von IMetaData-Schnittstellen zurück.
IEntity
Die IEntity-Schnittstelle ist eine Schemaentität , die einen Typ darstellt, der einen Namen hat, eine Reihe benannter Beziehungen zu anderen Typen (Eigenschaften) aufweist und von einer Basisentität abgeleitet wird. Hier sehen Sie, was die einzelnen Methoden tun:
- IEntity::Relationships gibt eine Enumeration von IRelationship-Objekten zurück, eine für jede ausgehende Beziehung dieses Typs. Jede ausgehende Beziehung einer Entität hat einen Namen.
- IEntity::GetRelationship findet eine Beziehung anhand des Namens und gibt S_FALSE zurück, wenn keine solche Beziehung für diese Entität vorhanden ist.
- IEntity::MetaData gibt eine Enumeration von IMetaData-Schnittstellen zurück, eine für jedes Metadatenpaar dieser Entität.
- IEntity::D efaultPhrase gibt einen Standardbegriff zurück, um das Generieren einer AQS- oder NQS-Umschreibung einer Bedingungsstruktur zu erleichtern.
IRelationship
Die IRelationship-Schnittstelle stellt eine Beziehung zwischen zwei Entitäten dar: einer Quelle und einem Ziel. Hier sehen Sie, was die einzelnen Methoden tun:
- IRelationship::IsReal meldet, ob eine Beziehung real ist. Wenn z. B. Entität A von Entität B abstammt und eine Beziehung mit dem Namen R von ihr erbt, kann A weiterhin über eine eigene Beziehung namens R verfügen. Die Beziehung zwischen A und R muss jedoch denselben Zieltyp wie der von B aufweisen, und der einzige Grund dafür ist, dass sie B-spezifische Metadaten speichert. Eine solche Beziehung von B soll nicht real sein.
- IRelationship::Medadata gibt eine Enumeration von IMetaData-Schnittstellen zurück, eine für jedes Metadatenpaar dieser Entität.
- IRelationship::D efaultPhrase gibt den Standardausdruck zurück, der für diese Beziehung in Umformungen verwendet werden soll. Jede Beziehung verfügt über einen Standardbegriff, der sie angibt, um das Generieren einer AQS- oder NQS-Umformulierung einer Bedingungsstruktur zu erleichtern.
IMetaData
Metadaten sind Schlüssel-Wert-Paare, die jeweils einer Entität, einer Beziehung oder dem gesamten Schema zugeordnet sind. Da Schlüssel nicht notwendigerweise eindeutig sind, kann eine Sammlung von Metadaten als eine Multizuordnung betrachtet werden. IMetaData::GetData wird aufgerufen, um den Schlüssel und den Wert für ein Metatdata-Paar abzurufen.
Abfrageszenarien
In den folgenden Szenarien wird die Verwendung strukturierter Abfrage-APIs in Windows Search in gängigen Abfrageszenarien beschrieben, z. B. beim Erstellen einer Bedingungsstruktur und beim Abfragen des Indexes.
Bedingungsextraktion und Abfrageanalyse
Wenn eine Abfrage erstellt wird, wird ihr Bereich definiert, indem dem System mitgeteilt wird, wo gesucht werden soll. Dies schränkt die Suchergebnisse ein. Nachdem der Bereich definiert wurde, wird ein Filter angewendet, und ein Filtersatz wird zurückgegeben. Suchergebnisse werden eingeschränkt, indem eine Bedingungsstruktur mit Blattknoten erstellt wird, ähnlich einem Diagramm. Diese Bedingungen werden dann extrahiert. Eine Bedingungsstruktur ist eine boolesche Kombination (AND, OR, NOT) von Blattbedingungen, von denen jede eine Eigenschaft über einen Vorgang mit einem Wert verknüpft. Ein Blattknoten stellt eine Einschränkung für eine einzelne Eigenschaft auf einen Wert durch einige Vorgänge dar.
Eine Filtereinschränkung erfordert einen logischen Ausdruck, der die Einschränkung beschreibt. Das Definieren dieses Ausdrucks beginnt mit der ICondition-Schnittstelle , die zum Erstellen eines einzelnen Knotens in einer Bedingungsstruktur verwendet wird. Da es im folgenden Beispiel nur eine Bedingung gibt, ändert sich die Struktur nicht.
[
object,
uuid(0FC988D4-C935-4b97-A973-46282EA175C8),
pointer_default(unique)
]
interface ICondition : IPersistStream
{
HRESULT GetConditionType([out, retval] CONDITION_TYPE* pNodeType);
HRESULT GetSubConditions([in] REFIID riid, [out, retval, iid_is(riid)] void** ppv);
[local] HRESULT GetComparisonInfo([out, annotation("__deref_opt_out")] LPWSTR *ppszPropertyName, [out, annotation("__out_opt")] CONDITION_OPERATION *pOperation, [out, annotation("__out_opt")] PROPVARIANT *pValue);
HRESULT GetValueType([out, retval] LPWSTR* ppszValueTypeName);
HRESULT GetValueNormalization([out, retval] LPWSTR* ppszNormalization);
[local] HRESULT GetInputTerms([out, annotation("__out_opt")] IRichChunk** ppPropertyTerm, [out, annotation("__out_opt")] IRichChunk** ppOperationTerm, [out, annotation("__out_opt")] IRichChunk** ppValueTerm);
HRESULT Clone([out, retval] ICondition** ppc);
};
Wenn mehr als eine Filterbedingung vorhanden ist, werden AND und andere boolesche Operatoren verwendet, um eine einzelne Struktur zu erreichen. AND-Bäume und OR-Bäume stellen Konjunktionen und Disjunktionen ihrer Teilstrukturen dar. Eine NOT-Struktur stellt die Negation ihrer einzelnen Unterstruktur dar. AQS bietet einen Textansatz zum Erreichen logischer Ausdrücke mit booleschen Operatoren und ist häufig einfacher.
Im nächsten Beispiel konvertieren wir die Bedingungsstruktur (ICondition) in visuelle Form. Der Abfrageparser konvertiert die ICondition mithilfe der IQueryParser-Schnittstelle in eine RTF-Abfragezeichenfolge (Rich Text Formatted). Die IQueryParser::RestateToString-Methode gibt den Abfragetext zurück, während die IQueryParser::P arse-Methode eine IQuerySolution-Schnittstelle erzeugt. Das folgende Beispiel zeigt, wie all dies zu tun ist.
[
object,
uuid(2EBDEE67-3505-43f8-9946-EA44ABC8E5B0),
pointer_default(unique)
]
interface IQueryParser : IUnknown
{
HRESULT Parse([in] LPCWSTR pszInputString, [in] IEnumUnknown* pCustomProperties, [out, retval] IQuerySolution** ppSolution);
HRESULT SetOption([in] STRUCTURED_QUERY_SINGLE_OPTION option, [in] PROPVARIANT const* pOptionValue);
HRESULT GetOption([in] STRUCTURED_QUERY_SINGLE_OPTION option, [out, retval] PROPVARIANT* pOptionValue);
HRESULT SetMultiOption([in] STRUCTURED_QUERY_MULTIOPTION option, [in] LPCWSTR pszOptionKey, [in] PROPVARIANT const* pOptionValue);
HRESULT GetSchemaProvider([out, retval] ISchemaProvider** ppSchemaProvider);
HRESULT RestateToString([in] ICondition* pCondition, [in] BOOL fUseEnglish, [out] LPWSTR* ppszQueryString);
HRESULT ParsePropertyValue([in] LPCWSTR pszPropertyName, [in] LPCWSTR pszInputString, [out, retval] IQuerySolution** ppSolution);
HRESULT RestatePropertyValueToString([in] ICondition* pCondition, [in] BOOL fUseEnglish, [out] LPWSTR* ppszPropertyName, [out] LPWSTR* ppszQueryString);
};
Die Standard Eingabe von IQueryParser::P arse ist eine zu analysierende Benutzereingabezeichenfolge, aber die Anwendung kann den Abfrageparser auch über alle Eigenschaften informieren, die in der Eingabe erkannt wurden (aus der anwendungsspezifischen Syntax). Die Ausgabe von IQueryParser::P arse ist eine IQuerySolution, die alle Informationen zu diesem Analyseaufruf bereitstellt. Es gibt Methoden zum Abrufen der Eingabezeichenfolge, der Tokenisierung der Eingabezeichenfolge, aller Analysefehler und der analysierten Abfrage als Bedingungsstruktur, die durch eine ICondition dargestellt wird. Das folgende Beispiel zeigt ...
[
object,
uuid(D6EBC66B-8921-4193-AFDD-A1789FB7FF57),
pointer_default(unique)
]
interface IQuerySolution : IConditionFactory
{
[local] HRESULT GetQuery([out, annotation("__out_opt")] ICondition** ppQueryNode, [out, annotation("__out_opt")] IEntity** ppMainType);
HRESULT GetErrors([in] REFIID riid, [out, retval, iid_is(riid)] void** ppParseErrors);
[local] HRESULT GetLexicalData([out, annotation("__deref_opt_out")] LPWSTR* ppszInputString, [out, annotation("__out_opt")] ITokenCollection** ppTokens, [out, annotation("__out_opt")] LCID* pLocale, [out, annotation("__out_opt")] IUnknown** ppWordBreaker);
}
Im vorherigen Beispiel konnte IQuerySolution::GetQuery alle Informationen zur Abfrage abrufen, einschließlich des ursprünglichen Texts, der Token, die den Text enthalten, oder die Bedingungsstruktur. Beispiele für mögliche zurückgegebene Abfragewerte sind in der folgenden Tabelle aufgeführt.
Beispiele für zurückgegebene Abfragewerte | BESCHREIBUNG |
---|---|
author:relja OR author:tyler |
Der Abfragetext, den IQueryParser::RestateToString zurückgibt |
?author?, ?:?, ?relja?, ?OR?, ?author?, ?:?, ?tyler? |
Die Aufschlüsselung von Token |
Eine nicht aufgelöste Bedingungsstruktur |
Die ursprüngliche Bedingungsstruktur, die zurückgegeben wird, ist nicht aufgelöst. In einer nicht aufgelösten Bedingungsstruktur werden Datums- und Uhrzeitverweise, z date:yesterday
. B. , nicht in die absolute Zeit konvertiert. Außerdem werden virtuelle Eigenschaften nicht erweitert. Virtuelle Eigenschaften sind Eigenschaften, die als Aggregate mehrerer Eigenschaften fungieren.
Die Abfrage kind:email from:reljai
erzeugt beispielsweise die folgenden nicht aufgelösten und aufgelösten Bedingungsstrukturen. Die nicht aufgelöste Bedingungsstruktur befindet sich links, und die aufgelöste Bedingungsstruktur befindet sich auf der rechten Seite.
Die aufgelöste Struktur kann abgerufen werden, indem Sie IConditionFactory::Resolve aufrufen. Wenn Sie jedoch SQRO_DONT_RESOLVE_DATETIME übergeben, bleiben Datum und Uhrzeit ungelöst. Eine nicht aufgelöste Bedingungsstruktur hat Vorteile, da eine nicht aufgelöste Bedingungsstruktur Informationen zur Abfrage enthält. Jeder Blattknoten zeigt auf die von IQuerySolution::GetLexicalData zurückgegebenen Token, die der Eigenschaft, dem Operator und dem Wert entsprechen, wenn die IRichChunk-Schnittstelle verwendet wird. Das folgende Beispiel zeigt ...
interface ITokenCollection : IUnknown
{
HRESULT NumberOfTokens(ULONG* pCount);
HRESULT GetToken([in] ULONG i, [out, annotation("__out_opt")] ULONG* pBegin, [out, annotation("__out_opt")] ULONG* pLength, [out, annotation("__deref_opt_out")] LPWSTR* ppsz);
};
ICondition:: GetInputTerms([out, annotation("__out_opt")]
IRichChunk** ppPropertyTerm, [out, annotation("__out_opt")]
IRichChunk** ppOperationTerm, [out, annotation("__out_opt")]
IRichChunk** ppValueTerm);
interface IRichChunk : IUnknown
{
HRESULT GetData([out, annotation("__out_opt")] ULONG* pFirstPos, [out, annotation("__out_opt")] ULONG* pLength, [out, annotation("__deref_opt_out")] LPWSTR* ppsz, [out, annotation("__out_opt")] PROPVARIANT* pValue);
}
Abfragen des Indexes
Es gibt mehrere Ansätze zum Abfragen des Indexes. Einige basieren auf SQL, andere auf AQS. Sie können den Windows Search-Index auch programmgesteuert abfragen, indem Sie Abfrageschnittstellen verwenden. Es gibt drei Schnittstellen, die für die Abfrage des Index spezifisch sind: ISearchQueryHelper, IRowsetPrioritization und IRowsetEvents. Konzeptionelle Informationen finden Sie unter Programmgesteuertes Abfragen des Indexes.
Sie können eine Komponente oder Hilfsklasse zum Abfragen des Index entwickeln, indem Sie die ISearchQueryHelper-Schnittstelle verwenden. Diese Schnittstelle wird als Hilfsklasse für ISearchCatalogManager (und ISearchCatalogManager2) implementiert und durch Aufrufen von ISearchCatalogManager::GetQueryHelper abgerufen. Konzeptionelle Informationen finden Sie unter Abfragen des Index mit ISearchQueryHelper.
ISearchQueryHelper ermöglicht Folgendes:
- Rufen Sie eine OLE DB-Verbindungszeichenfolge ab, um eine Verbindung mit der Windows Search-Datenbank herzustellen.
- Konvertieren sie AQS-Benutzerabfragen in Windows Search SQL.
- Geben Sie Abfrageeinschränkungen an, die in SQL, aber nicht in AQS ausgedrückt werden können.
Indizierungspriorisierung und Rowsetereignisse werden in Windows 7 und höher unterstützt. Mit IRowsetPrioritization gibt es einen Prioritätsstapel, mit dem der Client anfordern kann, dass den in einer bestimmten Abfrage verwendeten Bereichen eine höhere Priorität als die normale Priorität zugewiesen wird. IRowsetEvents bietet Benachrichtigungen über Änderungen an Elementen in Rowsets, einschließlich des Hinzufügens neuer Elemente, des Löschens von Elementen und der Änderung von Elementdaten. Durch die Verwendung von Rowsetereignisbenachrichtigungen wird sichergestellt, dass die Ergebnisse für vorhandene Abfragen so aktuell wie möglich sind. Konzeptionelle Informationen finden Sie unter Indizieren von Priorisierungs- und Rowsetereignissen in Windows 7.
Zugehörige Themen