A Szűrőkezelők ismertetése a Windows Searchben

A IFilter felület implementációit tartalmazó szűrőkezelők szövegeket és tulajdonságokat keresnek a dokumentumokban. A szűrőkezelők kinyerik ezekből az elemekből a szövegrészleteket, kiszűrik a beágyazott formázást, és megőrzik a szöveg helyzetével kapcsolatos információkat. Emellett adattömböket is kinyernek, amelyek dokumentumtulajdonságok. IFilter a magasabb szintű alkalmazások, például a dokumentumindexelők és az alkalmazásfüggetlen megjelenítők létrehozásának alapja.

Ez a témakör a következőképpen van rendszerezve:

Az IFilter-felület ismertetése

A Microsoft Windows Search szűrőkkel kinyeri az elemek tartalmát a teljes szöveges indexbe való felvételhez. A Windows Search kiterjeszthető új vagy védett fájltípusok indexelésére úgy, hogy szűrőket ír a tartalom kinyeréséhez, a tulajdonságkezelőket pedig a fájlok tulajdonságainak kinyeréséhez.

Az IFilter felület úgy lett kialakítva, hogy megfeleljen a teljes szöveges keresőmotorok speciális igényeinek. A Teljes szöveges keresőmotorok, például a Windows Search meghívják az IFilter metódusokat, hogy szöveg- és tulajdonságinformációkat nyerjenek ki, és hozzáadják őket egy indexhez. A Windows Search a visszaadott IFilter::GetText metódus eredményeit szavakra bontja, normalizálja és indexbe menti. Ha elérhető, a keresőmotor egy szövegtömb nyelvi kódazonosítóját (LCID) használja a nyelvspecifikus szótörés és -normalizálás végrehajtásához.

A Windows Search az alábbi táblázatban ismertetett három függvényt használ a regisztrált szűrőkezelők eléréséhez (az IFilter felület implementációihoz). Ezek a függvények különösen hasznosak a beágyazott objektumok szűrőkezelőjének betöltésekor és kötésében.

Funkció Leírás
LoadIFilter Az IFilter mutatóját kapja meg, amely a megadott tartalomtípushoz a legmegfelelőbb.
BindIFilterFromStorage A IStorage Interface objektumban található tartalomhoz legmegfelelőbb IFilter mutatót kap.
BindIFilterFromStream A streamváltozóból lekért adott osztályazonosítóhoz (CLSID) leginkább megfelelő IFilter- mutatót kap.

Az IFilter interfész öt metódussal rendelkezik, amelyet az alábbi táblázat ismertet.

Módszer Leírás
IFilter::Init A szűrési munkamenet inicializálása.
IFilter::GetChunk A IFilter pozíciókat az első vagy a következő adattömb elejére helyezi, és egy leírót ad vissza.
IFilter::GetText Beolvassa a szöveget az aktuális adattömbből.
IFilter::GetValue Az aktuális adattömb értékeit kéri le.
IFilter::BindRegion Lekéri az objektum megadott részét képviselő felületet. Jövőbeli használatra fenntartva.

Elkülönítési folyamat

A Windows Search korlátozott jogosultságokkal futtatja az IFiltereket a helyi rendszer biztonsági környezetében. Ebben a IFilter gazdagép elkülönítési folyamatában számos jog el lesz távolítva:

  • Korlátozott kód
  • Mindenki
  • Helyi
  • Interaktív
  • Hitelesített felhasználók
  • Beépített felhasználók
  • Felhasználók biztonsági azonosítója (SID)

E jogosultságok eltávolítása azt jelenti, hogy az IFilter felület nem rendelkezik hozzáféréssel a lemezrendszerhez vagy a hálózathoz, illetve a felhasználói felülethez vagy a vágólap funkcióihoz. Emellett az elkülönítési folyamat egy feladatobjektum alatt fut, amely megakadályozza a gyermekfolyamatok létrehozását, és 100 MB-os korlátot szab a munkakészletre. az IFilter interfész gazdaelkülönítési folyamata növeli az indexelő platform stabilitását, mivel fennáll annak a lehetősége, hogy egyes külső szűrők helytelenül vannak implementálva.

Jegyzet

A szűrőkezelőket úgy kell megírni, hogy a puffereket kezeljék és megfelelően kezeljék a veremeket. Minden sztringpéldánynak explicit ellenőrzésekkel kell rendelkeznie a puffertúllépések elleni védelemhez. Mindig ellenőrizze a puffer lefoglalt méretét. Mindig tesztelje az adatok méretét a puffer méretével.

IFilter DLL-ek

IFilter DLL-ek implementálják a IFilter felületet, hogy az ügyfél szöveg- és tulajdonságértékadatokat nyerhessen ki egy fájltípusból, osztályból vagy észlelt típusból. A Windows Search szűrési folyamata SearchFilterHost.exe az elem osztályához, észlelt típusához vagy névkiterjesztéséhez regisztrált IFilter-hez kapcsolódik.

IFilter-struktúra

Minden IFilter- egy OLYAN DLL-fájl, amely egy folyamaton belüli összetevőobjektum-modell (COM) kiszolgálót implementál a megadott szűrési képességek biztosításához. Az alábbi ábra egy tipikus IFilter DLL-ek általános szerkezetét mutatja be. Egy összetettebb példa több IFilter osztályt is implementálhat.

tipikus ifilter dll- szerkezetének diagramja

Natív kód

A szűrőket natív kódban kell írni, mert lehetséges, hogy a közös nyelvi futtatókörnyezet (CLR) verziószámozási problémái merülnek fel a több bővítmény által futtatott folyamattal kapcsolatban. A Windows 7-ben és újabb verziókban a felügyelt kódban írt szűrők kifejezetten le vannak tiltva.

Az IFilter-osztályazonosító megkeresése

A IFilter DLL osztálya a PersistentHandler beállításkulcs alatt van regisztrálva. A HTML-fájlok esetében az alábbi példa bemutatja, hogyan keresheti meg a HTML-dokumentumokhoz tartozó IFilter DLL-t. Ez a példa a rendszer által az elemhez társított IFilter megkereséséhez használt logikát követi.

  1. Ellenőrizze, hogy a DLL által szűrt fájltípusok kiterjesztése rendelkezik-e egy PersistentHandler bejegyzéssel a beállításjegyzék-bejegyzés \HKEY_LOCAL_MACHINE\SOFTWARE\Classesalatt. Legyen ez a kulcs Value1. Ha ez a bejegyzés már létezik, ugorjon az eljárás 4. lépéséhez, és használja a Value1-t a kulcsban. Az értékek REG_SZ típusúak.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Másik lehetőségként, ha nincs regisztrálva egy PersistentHandler a bővítményhez, keresse meg a dokumentumtípushoz társított CLSID azonosítót a \HKEY_LOCAL_MACHINE\SOFTWARE\Classesbeállításjegyzék-bejegyzésben. Legyen ez a kulcs Value2.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. Annak meghatározása, hogy egy PersistentHandler regisztrálva van-e a CLSID-hez. A 2. lépésben meghatározott Value2 használatával keresse meg a \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2 bejegyzéshez tartozó PersistentHandlert. Legyen ez a kulcs Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Határozza meg a IFilter állandó kezelő GUID-azonosítóját. A Value1 és a Value3használatával keresse meg a dokumentumtípushoz tartozó IFilter perzisztens kezelő GUID azonosítóját. A \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 vagy 3\PersistentAddinsRegistered\89BCB740-6119-101A-BCB7-00DD010655AF\>/ beállításjegyzék-bejegyzés alatti érték visszaadja a IFilter PersistentHandler GUID azonosítót ehhez a dokumentumtípushoz. Legyen ez a kulcs Value4. Ebben a példában az IFilter interfész GUID azonosítója 89BCB740-6119-101A-BCB7-00DD010655AF.
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             {EEC97550-47A9-11CF-B952-00AA0051FE20}
                 = HTML File Persistent Handler
                    Data type         REG_SZ
                        PersistentAddinsRegistered
                        {89BCB740-6119-101A-BCB7-00DD010655AF}

                    Data type         REG_SZ
                        default = {E0CA5340-4534-11CF-B952-00AA0051FE20}

Jegyzet

Ebben a példában a HTML-dokumentumokhoz tartozó IFilter DLL nlhtml.dll.

IFilter::GetChunk és területi kódazonosítók

A szöveg LCID-je egyetlen fájlon belül változhat. Előfordulhat például, hogy egy használati utasítás szövege az angol (en-us) és a spanyol (es) között vált, vagy a szöveg egyetlen szót is tartalmazhat az elsődleges nyelven kívüli nyelven. Mindkét esetben az IFilter minden alkalommal új adattömbnek kell kezdődnie, amikor az LCID megváltozik. Mivel az LCID a megfelelő szóválasztó kiválasztására szolgál, nagyon fontos, hogy pontosan azonosítsák azt. Ha az IFilter nem tudja meghatározni a szöveg területi beállítását, akkor nulla LCID értéket kell visszaadnia az adattömbdel. Ha nullás LCID-t ad vissza, a Windows Search a Language Auto-Detection (LAD) technológiával határozza meg az adattömb területi azonosítóját. Ha a Windows Search nem talál egyezést, alapértelmezés szerint a rendszer alapértelmezett területi beállítását használja (a GetSystemDefaultLocaleName függvény meghívásával). További információ: IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATEés STAT_CHUNK.

Ha ön szabályozza a fájlformátumot, és jelenleg nem tartalmaz területi adatokat, a megfelelő területi azonosítás engedélyezéséhez hozzá kell adnia egy felhasználói funkciót. A nem egyező szóhatároló használata rossz lekérdezési élményt eredményezhet a felhasználó számára. További információ: IWordBreaker.

Jegyzet

A szűrők fájltípusokhoz vannak társítva, fájlnévkiterjesztések, MIME-típusok vagy CLSID-k szerint. Bár egy szűrő több fájltípust is képes kezelni, minden típus csak egy szűrővel működik.

További erőforrások

Szűrőkezelők fejlesztése

hu-HU: Legjobb gyakorlatok a Windows Keresés szűrőkezelőinek létrehozásához

Tulajdonságok visszaadása szűrőkezelési programból

A Windowszal együtt szállított szűrőkezelők

Szűrőkezelők implementálása a Windows Search

Szűrőkezelők regisztrálása

Tesztelési szűrőkezelők