Dela via


Utveckla IFilter-tillägg

Not

Windows Desktop Search 2.x är en föråldrad teknik som ursprungligen var tillgänglig som ett tillägg för Windows XP och Windows Server 2003. I senare versioner använder du Windows Search- i stället.

Du kan utöka Microsoft Windows Desktop Search (WDS) med filtertillägg, komponenter som implementerar gränssnittet IFilter, så att nya filtyper inkluderas. Filter ansvarar för att komma åt och parsa data i filer och för att returnera par med egenskaper och värden samt textsegment för indexering. Under indexeringsprocessen anropar WDS lämpligt filter med URL:en för varje fil eller objekt. Filtret extraherar först metadata som motsvarar egenskaper som har markerats som hämtningsbara i WDS-schemat, till exempel rubrik, filstorlek och senast ändrat datum. Sedan delar den upp objektinnehållet i textsegment. WDS lägger till egenskaper och text som returneras av filtret i katalogen. WDS kan indexera vilken filtyp som helst för vilken den har ett registrerat filter.

I vissa fall behöver du inte skriva ett nytt filter. WDS 2.x innehåller filter för över 200 typer av objekt (inklusive oformaterade objekt som HTML, XML och källkodsfiler) och använder samma IFilterteknik som SharePoint Services. Om du redan har installerat filter för dina filtyper kan WDS använda de befintliga filtren för att indexera dessa data. Dessutom innehåller WDS ett allmänt filter för filtyper som är klartextbaserade. Om du har en filtyp som kan bearbetas av antingen ett befintligt SharePoint Services-filter eller oformaterat filter kan du lägga till filnamnstillägget och filtrera GUID i registret så att WDS kan hitta och använda det (se Registrera ett filtertillägg för mer information).

Om du däremot har en icke-klartext och proprietära data eller filformat är det enda sättet att se till att WDS kan indexera filformatet i katalogen genom att skriva en anpassad filterimplementering. Du kan bara ha ett filtertillägg för en filtyp, så det går att åsidosätta ett befintligt filter eller låta ett annat filter åsidosätta ditt för en viss filtyp.

Det här avsnittet innehåller följande avsnitt:

Obligatoriska filtergränssnitt

Ett filtertillägg måste implementera gränssnittet IFilteroch något av följande gränssnitt:

  • IPersistStream – Att läsa in data från en dataström. Det här är säkrare än att använda filer eftersom inget skrivs till disken. IPersistStream-gränssnittet är den bästa metoden för vidarebefordran av kompatibilitet med Windows Vista.
  • IPersistFile Interface – Läsa in data från en fil. Det här gränssnittet stöds inte i Windows Vista.
  • IPersistStorage Interface – Läsa in data från en OLE COM Structured Storage.

Ett filtertillägg använder dessa gränssnitt för att hämta innehållet i objektet och returnera dem iterativt till indexet tills slutet av filen har nåtts. Ett filtertillägg ska vara så robust som möjligt för att hantera skadade filer och de som inte uppfyller förväntade indataformat.

IFilter-gränssnitt

Det här är ett obligatoriskt gränssnitt för en filterimplementering. Mer information finns i gränssnittsreferensen IFilter.

Metod Beskrivning
Init() Initierar en filtreringssession.
GetChunk() Placerar filtret i början av första eller nästa segment och returnerar en beskrivning.
GetText() Hämtar text från det aktuella segmentet.
GetValue() Hämtar egenskapsvärden från det aktuella segmentet.
BindRegion() För närvarande reserverad för internt bruk; implementera inte. Den här metoden returnerar E_NOTIMPL.

 

IPersistStream

Det här gränssnittet läser in en fil från en dataström för säkrare bearbetning än IPersistFile Interface eftersom kontexten där en IPersistStream- filter körs inte behöver behörighet att öppna filer på disken eller över nätverket. Av de två metoderna för att komma åt en enda fil är det här den bästa metoden för vidarebefordran av kompatibilitet med Windows.

Metod Beskrivning
IsDirty() Kontrollerar om det har skett en ändring. Den här metoden returnerar E_NOTIMPL i filter.
InitNew() Skapar ett nytt lagringsutrymme. Den här metoden returnerar E_NOTIMPL i filter.
Load() Initierar ett objekt från strömmen där det sparades tidigare.
Spara() Sparar ett objekt i den angivna strömmen och anger om objektet ska återställa sin smutsiga flagga. Den här metoden returnerar E_NOTIMPL i filter.
GetSizeMax() Returnerar storleken i byte för dataströmmen som behövs för att spara objektet. Den här metoden returnerar E_NOTIMPL i filter.

 

IPersistFile

Det här gränssnittet läser in en fil efter absolut sökväg och stöds inte i Windows Vista.

Metod Beskrivning
GetCurFile() Hämtar det aktuella namnet på filen som är associerad med objektet. Returnerar sökvägen som anges i Load().
Load() Öppnar den angivna filen och initierar ett objekt från filinnehållet. Du kan fördröja öppnandet av filen tills du behöver den.
GetClassID() Returnerar klassidentifieraren (CLSID) för den nya filtypen. Du bör använda uuidgen.exe för att generera ett unikt CLSID.
IsDirty() Behöver bara returnera E_NOTIMPL i filter
Spara() Behöver bara returnera E_NOTIMPL i filter
SaveCompleted() Behöver bara returnera E_NOTIMPL i filter

 

IPersistStorage

Det här gränssnittet stöder den strukturerade lagringsmodellen, där varje inneslutet objekt har sin egen lagring som är kapslad i containerns lagring. Precis som IPersistFile Interfaceläser det här gränssnittet in efter absolut sökväg och stöds inte i Windows Vista.

Metod Beskrivning
IsDirty() Kontrollerar om det har skett en ändring. Den här metoden returnerar E_NOTIMPL i filter.
InitNew() Skapar ett nytt lagringsutrymme. Den här metoden returnerar E_NOTIMPL i filter.
Load() Sparar lagringen. Den här metoden returnerar E_NOTIMPL i filter.
Spara() Returnerar storleken i byte för dataströmmen som behövs för att spara objektet. Den här metoden returnerar E_NOTIMPL i filter.
SaveCompleted() Reserverad för internt bruk. Den här metoden returnerar E_NOTIMPL i filter.
HandsOffStorage() Reserverad för internt bruk. Den här metoden returnerar E_NOTIMPL i filter.

 

Utdataegenskaper med filter

Syftet med ett filter är att extrahera innehållet och egenskaperna för filer för inkludering i fulltextindexet. WDS anropar först metoden Load på implementeringarna IPersistFile, IPersistStream eller IPersistStorage och anropar sedan Init-metoden för IFilter-implementeringen. GetChunk anropas för att hämta segment med text- eller egenskapsvärdedata, och sedan anropas antingen GetText eller GetValue så många gånger som behövs för att hämta alla text- eller egenskapsvärden som är associerade med segmentet. Den här processen upprepas tills GetChunk rapporterar att det inte finns fler segment i dokumentet.

Metoden GetChunk hämtar information om det första eller nästa logiska informationsblocket från filen som filtreras och returnerar informationen i en STAT_CHUNK struktur, inklusive ett monotont ökande segment-ID, statusinformation om hur det aktuella segmentet relaterar till föregående segment, en flagga som anger om segmentet innehåller text eller ett värde. segmentets nationella inställningar och segmentets egenskapsspecifikation. Egenskapsspecifikationen är en FULLPROPSPEC- som består av ett CLSID och antingen ett heltal eller en strängegenskapsidentifierare (till exempel D5CDD505-2E9C-101B-9397-08002B2CF9AE/PerceivedType). Den identifierar typen av egenskap i stället för själva egenskapsvärdet.

Språkidentifieraren för segment används för att välja en lämplig ordbrytare, och det är mycket viktigt att du identifierar den korrekt. Om filtret inte kan fastställa språket för texten bör det förutsätta standardspråket för systemet, som är tillgängligt med hjälp av GetSystemDefaultLCID. Om du styr filformatet och det för närvarande inte innehåller språkinformation bör du lägga till en användarfunktion för att aktivera korrekt språkidentifiering. Om du använder en felmatchad ordbrytare kan det leda till en felaktig frågeupplevelse för användaren.

GetChunk hanterar endast åtkomst till segment och returnerar inte själva text- eller egenskapsvärdet. Efterföljande anrop till GetText och GetValue hämtar innehållet i delen. GetText returnerar textsegment, som är Unicode-strängar, från det aktuella CHUNK_TEXT segmentet. Om det aktuella segmentet är för stort kan fler än ett anrop till metoden GetText krävas. Varje anrop till metoden GetText hämtar text som omedelbart följer texten från det senaste anropet till metoden GetText. Det sista tecknet från ett anrop kan till exempel vara mitt i ett ord, och det första tecknet i nästa anrop skulle fortsätta det ordet. Sökmotorer måste hantera den här situationen.

GetValue returnerar egenskapsvärden för det aktuella CHUNK_VALUE segmentet i PROPVARIANT-strukturer, som kan innehålla en mängd olika datatyper. GetValue måste allokera själva PROPVARIANT-strukturen med hjälp av CoTaskMemAlloc. Anroparen av GetValue ansvarar för att frigöra minne som pekas på av PROPVARIANT med PropVariantClear, och för att frigöra själva strukturen med CoTaskMemFree. Mer information om PROPVARIANT finns i referensen PROPVARIANT.

Egenskapsvärden

Filter bör minst mata ut följande egenskaper som är standardkolumnerna i WDS-resultatvyn.

Globalt unikt identifierare (GUID) PROPSPEC Vänligt namn Beskrivning
F29F85E0-4FF9-1068-AB91-08002B27B3D9 2 Huvudtitel Rubrik som visas för det här objektet.
F29F85E0-4FF9-1068-AB91-08002B27B3D9 4 Huvudförfattare Person som är mest associerad med det här objektet.
D5CDD505-2E9C-101B-9397-08002B2CF9AE PrimärDatum Primärdatum Det viktigaste datumet för ett objekt, såsom mottagningsdatum för e-post eller ändringsdatum för filer.
D5CDD505-2E9C-101B-9397-08002B2CF9AE UppfattadTyp UppfattadTyp Typ av fil som parsas. Måste matcha någon av de Windows Desktop Search-typer som anges i WDS Upplevd typ.

 

För objekt i klartext extraherar WDS all text och alla systemdefinierade egenskaper, till exempel filstorlek eller filnamnstillägg, och inkluderar nya filtyper i klartext i indexet. Andra typer av egenskaper som kan returneras till indexet är:

  • För filer: författare, rubrik, status, nyckelord
  • För media: album, genre, kameramärke, datum då foto togs
  • För kommunikation: från, till, cc, prioritet
  • För kontakter: befattning, företagstelefon, företag

Listan ovan grupperar egenskaper som är gemensamma för en angiven upplevd typ. Alla egenskaper kan dock användas oavsett typ. Företaget kan till exempel användas för en kontakts arbetsgivares namn och kan också användas för att referera till namnet på en klient som filen relaterar till. Många av dessa egenskaper används för att visa sökresultat i WDS-resultatvyn. En fils rubrikegenskap visas till exempel som huvudkolumn i standardresultatvyn. IFilter-objekt bör mata ut alla egenskaper som är relaterade till den objekttyp som de parsar. Det går inte att lägga till anpassade egenskaper i WDS 2.x. En fullständig lista över tillgängliga egenskaper finns i WDS-schema.

Filtrera tilläggsinstallation

Att installera filtret innebär att du kopierar DLL:en till en lämplig plats i katalogen Programfiler och registrerar den. Filter bör implementera självregistrering för installation och bör följa dessa riktlinjer:

  • Installationsprogrammet måste använda exe- eller MSI-installationsprogrammet.
  • Versionsinformation måste anges.
  • En lägg till/ta bort program post måste skapas för varje installerat tillägg.
  • Installationsprogrammet måste ta över alla registerinställningar för den specifika filtyp eller lagring som det aktuella tillägget förstår.
  • Om ett tidigare tillägg skrivs över bör installationsprogrammet meddela användaren.
  • Om ett nyare tillägg har skrivit över det tidigare tillägget bör det finnas möjlighet att återställa det tidigare tilläggets funktioner och göra det till standardtillägget för den filtypen eller arkivet igen.

CLSID:erna krävs för registrering

Det finns tre klassidentifierare eller CLSID:er som är associerade med varje filter. Du måste generera en eller flera av dessa (använd uuidgen.exe) för att registrera ditt filtertillägg.

  • Den första identifierar alla filters beständiga hanterare, IID_IFilter, som är {89BCB740-6119-101A-BCB7-00DD010655AF}. Detta CLSID är konstant för alla filter som implementerar IFilter.
  • Den andra (värdet för IID_IFilter-nyckeln) identifierar IFilter-implementeringen för din filtyp. Den här nyckeln innehåller ett InprocServer32-värde som anger DLL-namnet efter sökväg och trådmodellen. Om filtret finns i systemsökvägen, som katalogen system32, räcker det med ett filnamn. Annars bör det här värdet ha en fullständig sökvägsspecifikation.
  • Den tredje identifierar filtypen filterprocesserna och returneras av metoden GetClassID i ditt IPersist-gränssnitt.

Not

I framtida versioner av Microsofts operativsystem kan det bli svårare att installera filer i katalogen system32, så vi rekommenderar att du installerar dem under Programfiler och inkluderar en fullständig sökväg till filtret i registret. Av säkerhetsskäl är det också klokt att ange en fullständig sökväg till din DLL i registret. Annars kan en "trojansk häst"-version av din DLL läsas in om den råkar vara i processsökvägen före din version.

 

Registreringsmodell

När WDS är redo att filtrera en fil letar den i registret under filens tillägg för att avgöra vilket filter som ska läsas in. Den följer sedan en serie registerlänkar för att hitta namnet på filter-DLL:en i den här ordningen:

  1. Från CLSID:erna som finns på:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

  2. Från filinnehållstypen på:

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type

  3. Från filnamnstillägget (samma som Win32 LoadIFilter API) på:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

    HKEY_CLASSES_ROOT\extpersistentHandler->CLSID->IID_IFilter->CLSID

  4. Från Standard på:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

Så här registrerar du ett filtertillägg

Du måste göra totalt åtta poster i registret för att registrera filtertillägget, där:

  • .ext är det nya filnamnstillägget
  • GUID_1 kan vara valfritt nytt GUID som genereras för det här tillägget
  • 89BCB740-6119-101A-BCB7-00DD010655AF är GUID för IFilter-gränssnittet, vilket är en konstant för alla IFilter-implementeringar.
  1. Registrera den beständiga hanteraren för filnamnstillägget med följande nycklar och värden:

    HKEY_CLASSES_ROOT\<.ext>\PersistentHandler
       (Default) = {GUID_1}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}
       (Default) = <Persistent Handler Description>
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered
       (Default) = (Value Not Set)
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered\{89BCB740-6119-101A-BCB7-00DD010655AF}
       (Default) = {CLSID of IFilter implementation}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentHandler
       (Default) = {GUID_1}
    
  2. Registrera IFilter-implementeringen med följande nycklar och värden:

    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}
       (Default) = Extension IFilter Description">
    
    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}\InprocServer32
       (Default) = <DLL Install Path>
       ThreadingModel = Both
    
  3. Registrera IFilter-implementeringen med Windows Desktop Search med följande nyckel och värde:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext>
       (Default) = {CLSID of IFilter implementation}"
    

referens

SchemaTable

Uppfattade typer

Utveckla protokollhanterare

andra resurser

IFilter